./xotcl-1.6.8/._aclocal.m4000644 000765 000024 00000000430 12327655345 015706 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/aclocal.m4000644 000765 000024 00000000030 12327655345 015465 0ustar00neumannstaff000000 000000 builtin(include,tcl.m4) ./xotcl-1.6.8/apps/actiweb/._AgentClient.xotcl000644 000765 000024 00000000430 12161600406 021657 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/AgentClient.xotcl000644 000765 000024 00000010455 12161600406 021452 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh # $Id: AgentClient.xotcl,v 1.5 2006/09/27 08:12:39 neumann Exp $ #if {![info exists ACTIWEB_HOME]} {source ~/actiweb/paths.xotcl} package require XOTcl 1; namespace import -force xotcl::* package require xotcl::package package verbose 1 package require xotcl::actiweb::agent package require xotcl::actiweb::httpPlace Place p set receiverHost localhost:8087 # # if we migrate an object, we cannot send the result to [self] # in this example we just use a small result printer object to # print the result to the stderr stream # Object resultPrinter resultPrinter proc printResult {o m code result} { if {$code eq "OK"} { puts stderr "[self] -- Result -- $m:\n$result" } else { puts stderr "[self] -- Error -- $m: \n$result" } } Class CloneableClass -superclass {Agent Class} CloneableClass AgentExample -superclass Agent -parameter { {invokeAgent hallo.txt} {invokeMethod content} } AgentExample proc test-calls {} { #showObj [self] set host [::set ::receiverHost] my clone $host "" [list [self] class-cloned] } AgentExample proc class-cloned {args} { my a1 my a2 my a3 my a4 a1 synchronousInvokeCall a3 synchronousMigrateCall a4 synchronousCloneCall #a1 asynchronousInvokeCall #a1 asynchronousCloneCall #a2 asynchronousMigrateCall exit } AgentExample instproc computeXXX args { return XXX--[my set var1]--XXXX } AgentExample instproc init args { next my set var1 xyz my persistent var1 } AgentExample instproc synchronousInvokeCall args { set host [::set ::receiverHost] my instvar invokeAgent invokeMethod puts stderr "*******************[self]: [self proc]" puts stderr "Result: [my syncInvoke $host $invokeAgent $invokeMethod]" } AgentExample instproc synchronousMigrateCall args { set host [::set ::receiverHost] puts stderr "*******************[self]: [self proc]" set result [my syncMigrate $host computeXXX] puts stderr "Result: '$result'" } AgentExample instproc synchronousCloneCall args { set host [::set ::receiverHost] puts stderr "*******************[self]: [self proc]" set result [my syncClone $host computeXXX] puts stderr "Result: '$result'" } AgentExample instproc asynchronousInvokeCall args { set host [::set ::receiverHost] my instvar invokeAgent invokeMethod puts stderr "*******************[self]: [self proc]" my invoke [list resultPrinter printResult my INVOKE] $host $invokeAgent $invokeMethod } AgentExample instproc asynchronousCloneCall args { set host [::set ::receiverHost] puts stderr "*******************[self]: [self proc]" my clone $host computeXXX [list resultPrinter printResult my CLONE] } AgentExample instproc asynchronousMigrateCall args { set host [::set ::receiverHost] puts stderr "*******************[self]: [self proc]" my migrate $host computeXXX [list resultPrinter printResult my MIGRATE] } #AgentExample instproc callSet args { # set host localhost:8087 # set agent welcome # # puts stderr INVOKE******************************* # set r [my invoke $host welcome set+a+1] # puts stderr result=$r #} AgentExample instproc destroy args { next } Agent registryTest registryTest proc test args { set host localhost:8087 my createRequest "[self] testOnPlaceName $host" http://$host/ } registryTest proc testOnPlaceName {host placeName} { set place [Place getInstance] set subject "http://[$place host]:[$place port]/[self]" RDFdb [self]::db [self]::db add "http://nestroy.wi-inf.uni-essen.de/schema/service#name" \ $subject registryTest [self]::db add "http://nestroy.wi-inf.uni-essen.de/schema/xotcl#class" \ $subject [my info class] # # place info als bag machen ... # [self]::db add "http://nestroy.wi-inf.uni-essen.de/schema/agent#place" \ $subject $place set rdfText [${place}::rdfCreator createFromTriples [[self]::db getTriples]] [self]::db destroy my invoke $host ${placeName}::registry register $rdfText set r [my invoke $host ${placeName}::registry query registryTest] puts "************************Query: $r\n" set r [my invoke $host ${placeName}::registry queryProperty http://nestroy.wi-inf.uni-essen.de/schema/agent\#place ::p] puts "************************QueryProperty: $r\n" } p exportedObjs client #p startEventLoop "registryTest test" #p startEventLoop "client callWelcome; registryTest test" p startEventLoop "AgentExample test-calls" ./xotcl-1.6.8/apps/actiweb/._Counter.README000644 000765 000024 00000000430 12161600406 020705 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/Counter.README000644 000765 000024 00000003661 12161600406 020501 0ustar00neumannstaff000000 000000 * $Id: Counter.README,v 1.1 2004/05/23 22:50:39 neumann Exp $ * * Variationen des Counter-Themas im ActiWeb: * (Zeilenangaben ohne Kommentare und Leerzeilen) * * 1) Counter.xotcl (22 Zeilen) Die Klasse Counter wird als Spezialisierung von HtmlDocument definiert ("Ein Dokument mit weiteren Methoden") Aufruf: http://localhost:8090/counter-1.html http://localhost:8090/counter-2.html 2) Counter2.xotcl (32 Zeilen) Die Klasse Counter wird als Spezialisierung von WebAgent definiert, der ein plain/text interface besitzt. Zusätzlich wird eine Web-Facade definiert, die fuer die HTML-spezifische Präsentation des WebAgenten sorgt. Aufruf: http://localhost:8091/htmlUI+invoke+c1 http://localhost:8091/htmlUI+invoke+c2 3) Counter3.xotcl (28 Zeilen) Die Klasse Counter wird völlig unabhängig von jeder Web-Nutzung definiert (Sachmodell). Als Spezialisierung dieser Counter-Klasse wird die Klasse Web-Counter definiert, die auch von HTML-Document erbt. Diese Klasse ist fuer die HTML-Aufbereitung zuständig. Es werden Instanzen von Web-Counter erzeugt. Aufruf: http://localhost:8093/c1 http://localhost:8093/c2 4) Counter4.xotcl (33 Zeilen) Die Klasse Counter wird völlig unabhängig von jeder Web-Nutzung definiert (Sachmodell). Ebenso unabhängig von der Web-Nutzung wird PersistentCounter als spezialisierte Counter-Klasse definiert. Von diesen persistenten Countern werden Instanzen gebildet (web-unabhaengig). Als weitere Instanzen werden Proxy-Objekte erzeugt, die für die HTML-Aufbereitung zuständig sind, und die hereinkommende Requests an die im "Hintergrund" existierenden eigentlichen Objekte weitergeben, und deren Ergebnisse entsprechend aufbereiten. Es werden nur die Proxy-Objekte exportiert, nur diese sind ueber den Web-Server ansprechbar. Aufruf: http://localhost:8094/wc1 http://localhost:8094/wc2 ./xotcl-1.6.8/apps/actiweb/._Counter.xotcl000644 000765 000024 00000000430 12161600406 021101 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/Counter.xotcl000644 000765 000024 00000002740 12161600406 020672 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: Counter.xotcl,v 1.4 2006/09/27 08:12:39 neumann Exp $ #load /Users/neumann/src/xotcl-1.4.1/library/store/XOTclSdbm/libxotclsdbm1.2.dylib array set opts {-pkgdir .}; array set opts $argv lappend auto_path $opts(-pkgdir) package require XOTcl 1 1; namespace import -force xotcl::* package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::webDocument ### Instantiate an Html place with the name receive and port 8090 HtmlPlace ::receiver -port 8090 -allowExit exit ### Define a class Counter as a special Html Document Class Counter -superclass HtmlDocument -parameter {{count 0}} Counter instproc init args { ;### Constructor next my persistent count ;### make count variable persistent ::receiver exportObjs [self] ;### export the counter object my exportProcs increment ;### export counter's increment method } Counter instproc default {} { ;### Method for updating HTML page set objName [string trimleft [self] :] return "The value in $objName is now: [my set count].

Increment Counter


Last Update: [clock format [clock seconds]] \n" } Counter instproc increment {} { ;### exported increment method my incr count return [my default] } ### Create two counter instances with the names ### counter-1.html and counter-2.html Counter counter-1.html Counter counter-2.html ### Start event loop and handle connections receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/._Counter2.xotcl000644 000765 000024 00000000430 12161600406 021163 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/Counter2.xotcl000644 000765 000024 00000004301 12161600406 020747 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: Counter2.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ array set opts {-pkgdir .}; array set opts $argv lappend auto_path $opts(-pkgdir) package require XOTcl 1 1; namespace import -force xotcl::* package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::pageTemplate HtmlPlace ::receiver -port 8091 -allowExit exit ### ### The counter class is an agent implementing the business logic ### Class Counter -superclass Agent -parameter {{count 1}} Counter instproc init args { ;### Constructor next ;### Call superclass constructor my persistent count ;### make count variable persistent } Counter instproc increment {} { ;### increment method my incr count } ### Create two counter instances c1/c2 Counter c1 Counter c2 ### ### Define a specialization of web object as a facade to the counters ### The Page Template Mixin defines the HTML appearance ### ### Define an HTML Page Template Class WebCounter -superclass WebObject \ -instmixin PageTemplateHtml -parameter {counter} WebCounter instproc init args { next [my set place] exportObjs [self] ;### export the web counter object my exportProcs increment ;### export counter's increment method } WebCounter instproc increment {} { ;### A method that decorates increment with HTML appearence my instvar counter ;### import var that stores shielded web agent $counter [self proc] ;### call the actual method on the web agent my default ;### update HTML page } WebCounter instproc default {} { ;### Method for updating HTML page my instvar count counter ;### importiere var that stores shielded web agent $counter instvar count ;### importiere count var # # and create web-page with counter content # my simplePage [self] "Html-Facade for $counter using a page template" \ "The value in $counter is $count.

Increment Counter

" } # # create two web-facade instances; one for each counter # WebCounter web-c1 -counter c1 WebCounter web-c2 -counter c2 ### Start event loop and handle connections receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/._Counter3.xotcl000644 000765 000024 00000000430 12161600406 021164 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/Counter3.xotcl000644 000765 000024 00000003143 12161600406 020753 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: Counter3.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ array set opts {-pkgdir .}; array set opts $argv lappend auto_path $opts(-pkgdir) package require XOTcl 1 1; namespace import -force xotcl::* package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::webDocument ### Instantiate an Html place with the name receiver HtmlPlace ::receiver -port 8093 -allowExit exit ### Define a class solely for counting Class Counter -parameter {{count 1}} Counter instproc increment {} { ;### counter method my incr count } ### Define a special WebCounter as a specialization of the Counter class Class WebCounter -superclass {Counter HtmlDocument} WebCounter instproc init args { ;### Constructor next my persistent count ;### make count variable persistent ::receiver exportObjs [self] ;### export the counter object my exportProcs increment ;### export increment method } WebCounter instproc default {} { ;### Method for updating HTML page set objName [string trimleft [self] :] return "The value in $objName is [my set count].

Increment Counter


Last Update: [clock format [clock seconds] -format %m/%d/%y-%H:%M] \n" } WebCounter instproc increment {} { ;### exported increment method next ;### call superclasses' increment my default ;### display the result as HTML } ### Create two web counter instances with the names c1 and c2 WebCounter c1 WebCounter c2 ### Start event loop and handle connections receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/._Counter4.xotcl000644 000765 000024 00000000430 12161600406 021165 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/Counter4.xotcl000644 000765 000024 00000003551 12161600406 020757 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: Counter4.xotcl,v 1.2 2004/07/27 21:39:46 neumann Exp $ array set opts {-pkgdir .}; array set opts $argv lappend auto_path $opts(-pkgdir) package require XOTcl 1 1; namespace import -force xotcl::* package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::webDocument ### Instantiate an Html place with the name receiver HtmlPlace ::receiver -port 8094 -allowExit exit ### Define a class solely for counting Class Counter -parameter {{count 1}} Counter instproc increment {} { ;### counter method my incr count } ### Define a Counter subclass for persistent counting Class PersistentCounter -superclass Counter PersistentCounter instproc init args { ;### Constructor next ;### call superclasses' init my mixinStrategy Persistent=Eager my persistenceMgr [Place getInstance]::agentPersistenceMgr my persistent count ;### make count variable persistent } ### Create two persistent counter instances with the names c1 and c2 PersistentCounter c1 PersistentCounter c2 ### Define a proxy class, that handles HTML decoration ### HtmlProxy forwards all unknown calls to "realSubject" Class HtmlProxyCounter -superclass HtmlProxy HtmlProxyCounter instproc init args { ;### Constructor next my exportProcs increment ;### export increment method } HtmlProxyCounter instproc default {} { my instvar realSubject $realSubject instvar count set objName [string trimleft [self] :] return "The value in $realSubject is $count.

Increment Counter


Last Update: [clock format [clock seconds] -format %m/%d/%y-%H:%M] ] \n" } ### Create two proxy instances wc1 und wc2 HtmlProxyCounter wc1 -realSubject c1 HtmlProxyCounter wc2 -realSubject c2 ### Start event loop and handle connections receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/._examples.README000644 000765 000024 00000000430 12161600406 021104 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/examples.README000644 000765 000024 00000004010 12161600406 020665 0ustar00neumannstaff000000 000000 * $Id: examples.README,v 1.1 2004/05/23 22:50:39 neumann Exp $ * * This directory contains several simple ActiWeb introductory examples * * * 4 Variations of the counter theme: * 1) Counter.xotcl (22 lines) The class counter is a special HtmlDocument that is made active by adding methods to the document. After starting the program, you can call it from your web browser: http://localhost:8090/counter-1.html http://localhost:8090/counter-2.html 2) Counter2.xotcl (32 lines) The Class Counter is a special WebAgent, with a plain/text interface. Additionally it has an HTML Facade that shields the sub-system and allows to access the web agent with an HTML presentation. The plain/text interface is: http://localhost:8091/c1 http://localhost:8091/c2 The web facades are: http://localhost:8091/web-c1 http://localhost:8091/web-c2 3) Counter3.xotcl (28 lines) This example demonstrates how an existing business logic (here: a small Counter class) can be enhanced with a web representation. A class WebCounter inherits from Counter and from HtmlDocument. The two web counter instances are accessible via: http://localhost:8093/c1 http://localhost:8093/c2 4) Counter4.xotcl (33 lines) The Counter class and a derived persistent counter are independent of any web usage. Two instances c1 and c2 -- that are inpendent from the usage as web counters -- are created. Two proxy object w1 and w2 handle the HTML decoration and forward the calls to the persistent counter instances c1/c2 as the real subjects for handling the calls. Only the proxies are exported, because c1/c2 can not be reached via the web server. Calls: http://localhost:8094/wc1 http://localhost:8094/wc2 * * A simple Multiple Choice Test: MC.xotcl * The multiple choice test implements a simple test and evaluation and a web facade for the test. Calls: http://localhost:8092/Gustaf.html http://localhost:8092/Uwe.html ./xotcl-1.6.8/apps/actiweb/._FormsWithState.xotcl000644 000765 000024 00000000430 12161600406 022405 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/FormsWithState.xotcl000644 000765 000024 00000015301 12161600406 022173 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: FormsWithState.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ # # Demo Program for Multi-Page Forms implemented via hidden # Form Fields -gn # package require XOTcl 1; namespace import -force xotcl::* package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::webDocument HtmlPlace receiver -port 8086 # The following class is used to define HTML-pages Class HTMLPage -superclass HtmlDocument -parameter { {pageContent ""} {pageTitle ""} {pageHeader ""} endCmd } HTMLPage instproc init args { receiver exportObjs [self] next } # instproc default is evoked whenever an HTMLDocument object # is called without a specific method. HTMLPage instproc default args { my instvar content # creates HTML page content set content append content \ [my set pageTitle] \ [my set pageHeader] \n \ [my set pageContent] # substitutes all embedded commands and variables in content set content [subst $content] # An HTMLPage can provide a command, which is executed after # the content is computed; this mechanism is used here for deleting # the context object if {[my exists endCmd]} { eval [my set endCmd] } # next sends content to the client next } # The form state is kept in a context object. The method varname # accesses variables from the context object or returns empty values. HTMLPage instproc get varname { my instvar context if {[$context exists $varname]} { return [$context set $varname] } else { return "" } } # The final page will contain a table with all the variables in # the context object HTMLPage instproc printAll {} { my instvar context set result "
  \n" # creates a table row for each variable and # it's value of the current context object foreach var [$context info vars] { append result \ \n } return "$result
Submission
You submitted the following values:
   
$var:[$context set $var]
\n
" } HTMLPage form1 form1 proc default {} { set values {} # process the form data from post method foreach a [my getFormData] { set name [$a set name] switch -glob $name { *.html {set nextPage $name} context {set context [$a set content]} default {lappend values $name [$a set content]} } } # save the form data in the context object foreach {name value} $values { $context set $name $value } if {![info exists nextPage]} { # We assume, we are called the first time... # Create a new context object and call the first page set context [Object new] set nextPage [self]/page1.html } $nextPage set context $context # delegeate to the actual form page $nextPage default } HTMLPage form1/page1.html -pageTitle "First Page" -pageContent {
 
Primary Contact information
Please supply us with full details of the person who will act as the person we will contact about this paper.
   
First Name:

Second Name:

} HTMLPage form1/page2.html -pageTitle "Second Page" -pageContent {
 
Title and Autors
Please supply full title of the paper and the contributing authors.
  
Title:

Authors:

} ### submit.html ist the final page; the context object is destroyed here HTMLPage form1/submit.html \ -endCmd {[my set context] destroy} \ -pageTitle "Third Page" -pageContent { [my printAll]

Many thanks for your submission!

} ### provide a default page for the receiver receiver proc default args { return {

Welcome to the paper provision page

In order to fill out the form, press here } } receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/._MC.xotcl000644 000765 000024 00000000430 12161600406 017761 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/MC.xotcl000644 000765 000024 00000014726 12161600406 017561 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: MC.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ # # A simple multiple choice test application # array set opts {-pkgdir .}; array set opts $argv lappend auto_path $opts(-pkgdir) package require XOTcl 1 1; namespace import -force xotcl::* #package require xotcl::package; package verbose 1 package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::pageTemplate HtmlPlace ::receiver -port 8092 -allowExit exit # Define a pool of questions: Question and their alternatives # are defined as classes and all questions are stored in the pool # Class Pool Class Pool::Question -parameter {text {altcounter 1}} Class Pool::Question::Alternative -parameter {text correct} Pool::Question instproc alternatives {pairs} { my instvar altcounter foreach {alt correct} $pairs { incr altcounter [self class]::Alternative [self]::$altcounter \ -text $alt -correct $correct } } # # An Exam has a name and is a selection of questions from a pool. # "requiredCorrect" defines the minimal number of correct answers # to pass the test. Class Exam -parameter {name requiredCorrect pool questions} # # For every candidate we create an individual exam. We scramble # the questions and alternatives and use the studentID as a seed. # Class IndividualExam -superclass Agent -parameter {ID exam} IndividualExam instproc random modulo { ;### random number generator my instvar seed set seed [expr {($seed*12731+34197) % 21473}] return [expr {$seed % $modulo}] } IndividualExam instproc permute {list} { ;### permute random permutation set permuted {} for {set nr [llength $list]} {$nr>0} {incr nr -1} { set select [my random $nr] lappend permuted [lindex $list $select] set list [lreplace $list $select $select] } return $permuted } IndividualExam instproc init args { my instvar seed ID exam individualTest alternatives set questions [$exam set questions] set seed $ID ### compute order of individual tests and alternatives foreach index [my permute [$exam set questions]] { set questionObj [$exam set pool]::$index lappend individualTest $index set alts [my permute [lsort [$questionObj info children]]] lappend alternatives $alts } #puts stderr "Individual test [self] has $individualTest" } # # Define a web facade using a page template # "testObject" is the individual test that is shielded by the web facade # Class WebExam -superclass WebObject \ -instmixin PageTemplateHtml -parameter {testObject} WebExam instproc default {} { ;### This method creates the HTML Test my instvar testObject ;### import var that stores shielded test object ### import vars from the test $testObject instvar individualTest alternatives exam set action [my selfAction result] ### create Test page set htmlText "\n
    \n" ### iterate over the set of questions/alternatives ### and add them to the HTML text foreach question $individualTest alts $alternatives { append htmlText "
  1. [[$exam pool]::$question text]\n
      \n" foreach a $alts { append htmlText "
    • \ [$a text] ([$a correct])\n" } append htmlText "

    \n" } ### we have to add a hidden form field, otherwise we get no result, ### if nothing is tagged append htmlText "" ### the submit button lets us send the result back append htmlText "

\n" ### create simple HTML Page my simplePage [$exam name] \ "Exam [$exam name] for [string trimleft $testObject :] \ (Exam: $exam)" $htmlText } WebExam instproc result {} { ;# This method analyses the results of the test my instvar testObject ;### import var that stores shielded test set exam [$testObject exam] $testObject instvar individualTest alternatives foreach question $individualTest alts $alternatives { foreach a $alts {set ca($a) 0} } foreach a [my getFormData] {set ca([$a set content]) 1} set htmlText "You have answered:\n if {$correctAnswers < [$exam requiredCorrect]} { my simplePage [self] "Sorry" "$htmlText\ Only $correctAnswers question were answered correctly. You have not succeeded :(" } else { my simplePage [self] "Congratulations" "$htmlText\ $correctAnswers questions were answered correctly. You have succeeded :-)" } } WebExam instproc init args { next [my place] exportObjs [self] ;# export object my exportProcs result ;# export methods } # Create a Pool P with 6 example questions with 3 alternatives for each. Pool p Pool::Question p::1 \ -text "When was the first XOTcl Version released?" -alternatives { "1998" 0 "1999" 1 "2000" 0 } Pool::Question p::2 -text "Who is author of XOTcl?" -alternatives { "Gustaf Neumann" 1 "Mika Haekinnen" 0 "Uwe Zdun" 1 } Pool::Question p::3 -text "Which of the systems are other OO extensions of Tcl?" \ -alternatives { "XTCL" 0 "ITCL" 1 "OTCL" 1 } Pool::Question p::4 \ -text "Which methods are provided by the Object class?" -alternatives { "set" 1 "instvar" 0 "filter" 1 } Pool::Question p::5 \ -text "Which methods are provided by the Object class?" -alternatives { "unset" 1 "instproc" 0 "mixin" 1 } Pool::Question p::6 \ -text "Which methods are provided by the Class class?" -alternatives { "proc" 0 "instproc" 1 "mixin" 0 } ### Define an exam Exam xotclTest \ -pool p \ -name "XOTcl Test" \ -questions {1 2 3 4 5} \ -requiredCorrect 4 ### Define two Student tests with the XOTcl Test foreach {Student ID} { Uwe 7850247 Gustaf 7850248 } { ## Define the individual exams IndividualExam $Student -exam xotclTest -ID $ID ### Define a web facade for each student WebExam $Student.html -testObject $Student } receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/._Receiver.xotcl000644 000765 000024 00000000430 12161600406 021226 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/Receiver.xotcl000644 000765 000024 00000001226 12161600406 021015 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh #if {![info exists ACTIWEB_HOME]} {source ~/actiweb/paths.xotcl} package require XOTcl 1; namespace import -force xotcl::* package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::webDocument HtmlPlace receiver -port 8087 HtmlDocument hallo.txt -content "************ HALLO *************" receiver exportObjs hallo.txt hallo.txt exportProcs content #hallo.txt attachFile ~/public_html/index.html Class CloneableClass -superclass {Agent Class} FileObjectifier do do objectifyTree receiver ~/public_html #GraphicDirectoryObjectifier gdo #gdo objectifyTree receiver ~www/bilder/Einweihung/disk1/ receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/._securePlaceDemo.xotcl000644 000765 000024 00000000430 12161600406 022522 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/securePlaceDemo.xotcl000644 000765 000024 00000005476 12161600406 022324 0ustar00neumannstaff000000 000000 package require XOTcl 1; namespace import -force xotcl::* # DEMO OF USE OF ACTIWEB AND SSL # 03/09/01 klaus.kolowratnik@wu-wien.ac.at # version 0.806 # USAGE: # # For secure http connections under Tcl or XOTcl we need the tls-package. # The following code was tested with tls-version 1.4 successfully. # Download the tls1.4-package from the TLS-Homepage # (http://sourceforge.net/projects/tls/) and install the # tarball (tls1.4.1-linux-x86.tar.gz) in your local filesystem. # You have to append the path of the tls-package to the # Tcl-variable "auto_path" as seen in the example below # # lappend auto_path $homeDir/tls1.4 $homeDir/projects/actiweb # # Don't forget to add the tls-package to your "pkgIndex.tlc"-file! # # package ifneeded tls 1.4 "[list load [file join $dir libtls1.4.so] ] ; \ # [list source [file join $dir tls.tcl]]" # # For secure http connections ("http://...") we need at least the Actiweb/XOTcl- # package "secureHtmlPlace": # # package require xotcl::actiweb::secureHtmlPlace # package require xotcl::actiweb::webDocument # # We have to register the private server-keyfile and the certifcates # of the local server and the certification authority. # If you want to create own self-signed certificates, you can use the # "SimpleCA"-Certification Authority (http://users.skynet.be/ballet/joris/SimpleCA). # # This example uses the following certificates and key-files: # # server.key private key of the local server which is run by this program # server.pem certificate of the local server which is run by this program # in PEM-format # cacert.pem certificate of the certification authority # # # SecureHtmlPlace ::receiver -port 8443 -keyfile server.key \ # -certfile server.pem -cafile cacert.pem # # With this changes a https-server with XOTcl can be run. # # 2003/11/19 Klaus.Kolowratnik@wu-wien.ac.at set homeDir ~h9252717; # home-directory of Klaus lappend auto_path $homeDir/packages package require xotcl::actiweb::htmlPlace package require xotcl::actiweb::secureHtmlPlace package require xotcl::actiweb::webDocument #HtmlPlace ::receiver -port 8445 SecureHtmlPlace ::receiver -port 8445 -keyfile server.key -certfile server.pem -cafile cacert.pem HtmlDocument test-1.txt -content "************ TEST-1 *************" ::receiver exportObjs test-1.txt test-1.txt exportProcs content #test-1.txt attachFile ~/public_html/index.html HtmlDocument test-2.txt -content "************ TEST-2 *************" ::receiver exportObjs test-2.txt test-2.txt exportProcs content set readme "This Web-Server uses XOTcl (www.xotcl.org) and Actiweb" HtmlDocument readme.txt -content $readme ::receiver exportObjs readme.txt readme.txt exportProcs content FileObjectifier do do objectifyTree ::receiver ~/public_html #GraphicDirectoryObjectifier gdo #gdo objectifyTree ::receiver ~www/bilder/Einweihung/disk1/ ::receiver startEventLoop ./xotcl-1.6.8/apps/actiweb/univ/._server.key000644 000765 000024 00000000430 12161600406 021410 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/univ/server.key000644 000765 000024 00000001567 12161600406 021207 0ustar00neumannstaff000000 000000 -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDVg+HdA4RAKyYRaxKRSdAw7mQpephZslIf/ZR7Oe3RKZjxu7Sj PYG56GSc8y6hiaKuGnDmJcEGXZCXWNtUuACVsNlFrlVbGSEfAbXbz6H4eaaX2d2P KzrjOc//8+5emaFZRelVTYY4sWNLcCuWV2FIhwMJMblYieXM6iEQg4XzdQIDAQAB AoGAVdY2OC8QvOdb34bHKSeejf1YwSArHWxF/dxpE/0e8YaimRQYM8QnYgDeagaN yZ1WjF3O44dsCU4WMfIkAvQSL19RLSgT+jPb3Uu9Aotwmg4x+55BKctRphXKiIfu +a0IfAFDIt8FMRS08AoSB6eBgOBlhTZM2Y0IuC6QTqaBcwUCQQD5XSiEzh44uMOl N4FbO0MI2NC3pbPg5u1fEJtIawoYOYxbeGHrlOYO2ZN3ZP6+2g5V0kX5tMMeObhE qQLlmNETAkEA2zJ/Tk3IE5ByEBcGjG26nJ1zLlY13NaiIg+AoSP+7rHg5TPhoQp1 VVwcqd4ZWCyqgYDFl2TsiiZwKcEIFJBCVwJBANoLpZSLD04V8a2UXV5C8ZjYzZjo IeP0yXco9D9cqZUJLTwGhckTiB9QDWyHOWH1FjfhCCMS9tKFMiWHi+rrt1UCQQDC rlvxURX1gmI8NicjzEVk2la1fe5C4QKJW9lzxUOj/qpvB6BK5r4FfVUb7d32uV0K vjNAXmvT24XdH8usb9/rAkBR1sqUkqwwm0CSe0Rz9IhSlkwWlmvEzSmEguqrd7Zb rbYJ9NTnV1uFSAX9vcU7lDRp69il6XmyhOL06FYLRaNa -----END RSA PRIVATE KEY----- ./xotcl-1.6.8/apps/actiweb/univ/._server.pem000644 000765 000024 00000000430 12161600406 021401 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/univ/server.pem000644 000765 000024 00000006764 12161600406 021204 0ustar00neumannstaff000000 000000 issuer :/C=DE/ST=NRW/L=Essen/O=University of Essen/OU=SWT/CN=Fredj Dridi/Email=Fredj.Dridi@uni-essen.de subject:/C=DE/ST=NRW/L=Essen/O=University of Essen/OU=SWT/CN=tp600e.wi-inf.uni-essen.de/Email=dridi@tp600e.wi-inf.uni-essen.de serial :01 Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=DE, ST=NRW, L=Essen, O=University of Essen, OU=SWT, CN=Fredj Dridi/Email=Fredj.Dridi@uni-essen.de Validity Not Before: Apr 28 08:21:19 2000 GMT Not After : Apr 28 08:21:19 2001 GMT Subject: C=DE, ST=NRW, L=Essen, O=University of Essen, OU=SWT, CN=tp600e.wi-inf.uni-essen.de/Email=dridi@tp600e.wi-inf.uni-essen.de Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:d5:83:e1:dd:03:84:40:2b:26:11:6b:12:91:49: d0:30:ee:64:29:7a:98:59:b2:52:1f:fd:94:7b:39: ed:d1:29:98:f1:bb:b4:a3:3d:81:b9:e8:64:9c:f3: 2e:a1:89:a2:ae:1a:70:e6:25:c1:06:5d:90:97:58: db:54:b8:00:95:b0:d9:45:ae:55:5b:19:21:1f:01: b5:db:cf:a1:f8:79:a6:97:d9:dd:8f:2b:3a:e3:39: cf:ff:f3:ee:5e:99:a1:59:45:e9:55:4d:86:38:b1: 63:4b:70:2b:96:57:61:48:87:03:09:31:b9:58:89: e5:cc:ea:21:10:83:85:f3:75 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Authority Key Identifier: keyid:D2:B8:E3:2D:A2:5A:22:78:3A:38:F1:1F:F5:7C:AD:8D:A6:C4:41:0F X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication, Microsoft Server Gated Crypto, Netscape Server Gated Crypto X509v3 Basic Constraints: critical CA:FALSE Signature Algorithm: md5WithRSAEncryption 38:b5:a1:1c:93:c4:aa:6e:3f:d6:ea:11:7f:7b:2b:11:db:7b: 22:b3:d2:a8:b3:f3:20:64:6a:25:b4:fe:0d:ac:12:49:a0:6e: 6d:ef:fb:99:a2:7c:bc:50:b0:eb:42:ef:0a:32:fa:a9:69:e0: 11:10:9b:00:05:15:97:59:ac:dc:5f:f2:cd:81:28:3e:e6:96: 86:f4:d7:99:71:52:c3:ca:0f:4a:48:d8:66:b0:da:e8:d1:45: 84:c4:12:b2:43:ec:63:b6:25:e8:0a:5a:4c:fb:e2:ec:03:36: 6f:cd:f9:2a:5c:52:ba:02:29:92:f5:bf:c4:96:ff:9e:ed:a3: cf:02 -----BEGIN CERTIFICATE----- MIIDIjCCAougAwIBAgIBATANBgkqhkiG9w0BAQQFADCBljELMAkGA1UEBhMCREUx DDAKBgNVBAgTA05SVzEOMAwGA1UEBxMFRXNzZW4xHDAaBgNVBAoTE1VuaXZlcnNp dHkgb2YgRXNzZW4xDDAKBgNVBAsTA1NXVDEUMBIGA1UEAxMLRnJlZGogRHJpZGkx JzAlBgkqhkiG9w0BCQEWGEZyZWRqLkRyaWRpQHVuaS1lc3Nlbi5kZTAeFw0wMDA0 MjgwODIxMTlaFw0wMTA0MjgwODIxMTlaMIGtMQswCQYDVQQGEwJERTEMMAoGA1UE CBMDTlJXMQ4wDAYDVQQHEwVFc3NlbjEcMBoGA1UEChMTVW5pdmVyc2l0eSBvZiBF c3NlbjEMMAoGA1UECxMDU1dUMSMwIQYDVQQDExp0cDYwMGUud2ktaW5mLnVuaS1l c3Nlbi5kZTEvMC0GCSqGSIb3DQEJARYgZHJpZGlAdHA2MDBlLndpLWluZi51bmkt ZXNzZW4uZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANWD4d0DhEArJhFr EpFJ0DDuZCl6mFmyUh/9lHs57dEpmPG7tKM9gbnoZJzzLqGJoq4acOYlwQZdkJdY 21S4AJWw2UWuVVsZIR8BtdvPofh5ppfZ3Y8rOuM5z//z7l6ZoVlF6VVNhjixY0tw K5ZXYUiHAwkxuViJ5czqIRCDhfN1AgMBAAGjZzBlMB8GA1UdIwQYMBaAFNK44y2i WiJ4OjjxH/V8rY2mxEEPMDQGA1UdJQQtMCsGCCsGAQUFBwMBBggrBgEFBQcDAgYK KwYBBAGCNwoDAwYJYIZIAYb4QgQBMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEE BQADgYEAOLWhHJPEqm4/1uoRf3srEdt7IrPSqLPzIGRqJbT+DawSSaBube/7maJ8 vFCw60LvCjL6qWngERCbAAUVl1ms3F/yzYEoPuaWhvTXmXFSw8oPSkjYZrDa6NFF hMQSskPsY7Yl6ApaTPvi7AM2b835KlxSugIpkvW/xJb/nu2jzwI= -----END CERTIFICATE----- ./xotcl-1.6.8/apps/actiweb/univ/._UNIVERSAL.css000644 000765 000024 00000000430 12161600406 021452 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/univ/UNIVERSAL.css000644 000765 000024 00000001225 12161600406 021240 0ustar00neumannstaff000000 000000 A {color: yellow; } A:selected {color: red; } A:visited {color: #6699FF; } BODY {background-color: #000066; color: #FFFFFF; margin-left: 10; shading: no;} B.outer { background-color: #000066; color: #FFFFFF; } B.inner,TD { background-color: #110088; color: #FFFFFF; } H1,H2 {font-family:Helvetica,sans-serif; text-align:center; } H3 {font-family:Helvetica,sans-serif; color: #FFFFFF;} HR {align:center; shading:no;} LI,UL,OL {font-family:Helvetica,sans-serif; } TABLE {shading: no; border-style: solid; border-color: solid red; background-color: #110088;} TH {font-family:Helvetica,sans-serif;} DT {font-family:Helvetica,sans-serif; font-weight:bold;} ./xotcl-1.6.8/apps/actiweb/univ/._UNIVERSAL.jpg000644 000765 000024 00000000430 12161600406 021442 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/univ/UNIVERSAL.jpg000644 000765 000024 00000004704 12161600406 021235 0ustar00neumannstaff000000 000000 ÿØÿàJFIFHHÿÛC   (1#%(:3=<9387@H\N@DWE78PmQW_bghg>Mqypdx\egcÿÛC//cB8BccccccccccccccccccccccccccccccccccccccccccccccccccÿÀe¾"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?㨭‹:Þ/ Yê Ï–fF9ã=¿ ѱЬ§‹BgWÍëH%ÃuÛœcÒ»’0±ËQ]wü"ÐC⸬¥ö3«€‘Tš`ÕŠØ£ìT‰äÞ]Pgvyÿ9§aâŒU…·ÁVh‰'dÿ…CŠn(Å;b€n(Å;b‹ÜQŠv(Ÿ£ìQŠ,Kh°jÞ‡NKË{{«iËíö‡Sž‡ñý+B+»;+íÄÞA!³ó Ò«ŠH怞¤`qô¨§ÕWÄd½»^Z°b¦@‚á~7~ι:)ò1ÞéÌ,æ‚]?Äd€¥á¹QÝ@ǧZ©¡¤XYêwh©*ßNbKxäÂ.yÇUŸÒ¸Ú){0æ;Ý;QÒ¯“M^;&Óæ(#žq“^Äã#8ü«SÑ•¦»»MWKu,ò„[Œ¹'c­sÕb·Ä\º ›<ç>ƒÚª0³Ñ‰»‘â¥aþˆŸï·òZw’ŸóñäßáDE‘\†bvƒÇÔ{V¤T·C7 ßßÃþc?֙ЖOš[Ó)ùÿìߥ QŠv*UŠ?$HîÃ,W ™éqë@bŒTø€í´êi²*í!O’ EŠ1Nŧ`Š1NÅ¢À0WÜQ´zTÉ<Ê ,ÒŽ9&žGœ±À Ïó§aöJ6Jžå•çbvŽãŒãß­EE‚ãvJ6Juì´zQ´zS¨¢Áq»G¥G¥K~d¨™Ææ4í°ÏY?ïØÿâ©X.A´zTÌ6ÛF:Ì߇#K¶ùë'ýûüU$¬­±S%Qp '’­*)h§a RŽm[?Âãˆ9þB£©bŠaØ(?Žà?©¥aÔÐüÑ˨Ü>£ŸåšŠ¤·`“£7ÝÎéßô¢ÀERÀ?–ÇøÉì{óïMd(å[¨84Úv FíEXy"‘˼o¹¹bOsÒ›ºÿ,Ÿñ… !¢¦ó# Cõ-þ4y«ÚÇæ™ ÇAS[ðìÿÜBsèqú‘@ò6–Oûè…K‘åÍòÉ÷qýáíT"¥7î?»'ýô?ÂÜvOûè…CEMûîÉÿ}ð£÷Ý“þúáLh©¿qýÙ?ï¡þ~ãû²ßCü(-¿Öç¸VaõšŠ­Û˜<ÃòÉ÷¸þéö¨¿qýÙ?ï¡þ€†Š›÷Ý“þúáGî?»'ýô?˜ÑS~ãû²ßCü(ýÇ÷dÿ¾‡øP5,ù‹ê‡ôçúRþãû²ßCü*[#Ì?,ŸqûîŸj@T¢¦ýÇ÷dÿ¾‡øQûîÉÿ}ð ¹ævoï|ߟ?Ö¢«wG˜>Y>âwÝÕî?»'ýô?€!¢¦ýÇ÷dÿ¾‡øQûîÉÿ}ð¦4T߸þìŸ÷Ðÿ ?qýÙ?ï¡þû¢¥·“ûêF=OQúQŽ‚•X£S‚A§ÐBQSËé Fcܼ g·^Ôß$½,køçùf€"¢¥ò“þ~#ü›ü(Ùë+÷SüH ¨©–(œ•Iv  ã§Z†€$·ÿ[ŽåYGÔ‚*:|-åÌŽy ÀÒJ†9]%I ÑEQETp$oD?¯Ö£©"uMá”°eÇÁþ”0#¢¥Ýüó“þþð¥V€0&)§˜?€sþ½—û¿/åÇô¨éY‹»3u'&’€ (¢€ (¢€ÐQ@û¢–˜„¢–ŠJ)h X«S‚A§H Ë÷[‘ííM§¡R¥½A$ަŸæÊ:2€~£ƒýãF`Ã#~ CCȆ/-‡Í»,ÙÇè=¿*C!¢–ŠbŠZ((¥¢€ŠZ((¥¢€ŠZ((¥¢€~襢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÿÙ./xotcl-1.6.8/apps/actiweb/univ/._UNIVERSAL.rdf000644 000765 000024 00000000430 12161600406 021435 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/univ/UNIVERSAL.rdf000644 000765 000024 00000020617 12161600406 021231 0ustar00neumannstaff000000 000000 Object Oriented Design and System Development Introduction to the concepts of object-oriented programing ... Course WUW-WI-0012346 object-oriented design software architecture de application/pdf 56000 http://nm.wu-wien.ac.at/Lehre/oo1/01-handout.pdf Student 2 to 4 days University Second Cycle Lecture Author Prof. Gustaf Neumann 01.12.1999 1.0 -- 2 en Discipline Information Systems Introduction in the programming language object rexx This lecture offers an introduction of the programming language 'object rexx'. Course WUW-WI-0011344 rexx UML CORBA de text/html 0 http://wwwi.wu-wien.ac.at/Studium/Abschnitt_2/LVA_allgemein/rexx.html Student 3 weeks University First Cycle Lecture Author Prof.H. Werthner 01.11.1999 1.0 -- 2 en Discipline Information Systems Object Oriented Development of Web-Based Applications This lecture offers the basic knowledge about the Internet and Internet Protocols from an applied point of view. Half of the lectures present the theoretical background knowledge, and the other half exercises this knowledge with practical examples.... Course WUW-WI-0012345 TCP/IP Web Technolgy Application Server Agent Systems XML RDF de application/pdf 14000 http://nm.wu-wien.ac.at/Lehre/oo2/01-handout.pdf Student 2 to 4 days University Second Cycle Lecture Author Prof. Gustaf Neumann 01.01.2000 1.0 -- 2 en Discipline Information Systems Legal aspects of information processing Introduction of the occuring legal problems in context of the use of information systems Course WUW-WI-0036589 information systems legal aspects data processing de text/html 0 http://wwwi.wu-wien.ac.at/Studium/Abschnitt_2/Wahlfach/recht_vo.html Student 1 month University Second Cycle Lecture Author Dr. Walter Blocher 01.01.1999 2.1 -- 2 en Discipline Information Systems Electronic cash, payment systems and security Introduction to electronic cash systems Course WUW-WI-00352228 electronic cash security electronic market place de application/zip 230000 http://wwwi.wu-wien.ac.at/finanz/elekgeld.zip Student 6 weeks University Second Cycle Lecture Author Prof. G. Müller 01.01.1998 2.1 -- 2 en Discipline Information Systems ./xotcl-1.6.8/apps/actiweb/univ/._UNIVERSAL.xotcl000644 000765 000024 00000000430 12161600406 022013 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/actiweb/univ/UNIVERSAL.xotcl000644 000765 000024 00000020034 12161600406 021600 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh #$Id: UNIVERSAL.xotcl,v 1.8 2007/08/14 16:38:26 neumann Exp $ package require XOTcl 1 1; namespace import -force xotcl::* array set opts { -ssl 0 -instanceFile UNIVERSAL.rdf -cssFile UNIVERSAL.css -root . -pkgdir .} array set opts $argv @ @File { description { This is a demo of a Webserver that presents the contents of an RDF source file in a friendly and easy readable manner.

The RDF file is parsed first into triples which are added to the resource database RDFdb. This RDFdb used in this example replaces the standard triple database of xoRDF by an application specific version, which is easier to process. The triple database is the source of the Catalog, which displays a short, easy to read summary of the entries. The database is used as well for the "detailed view", which presents all the data of the triples through nested HTML tables.

The demo program uses either HTTP or HTTPS (in which case you will require the SSL/TLS extension of Tcl). } } lappend auto_path $opts(-pkgdir) if {$opts(-ssl)} { package require xotcl::actiweb::secureHtmlPlace SecureHtmlPlace ::receiver -port 443 -root $opts(-root) } else { package require xotcl::actiweb::htmlPlace HtmlPlace ::receiver -port 8095 -root $opts(-root) -allowExit exit } package require xotcl::actiweb::webDocument # load RDF processing components package require xotcl::rdf::parser package require xotcl::rdf::triple package require xotcl::xml::printVisitor proc loadFile filename { set F [open $filename r]; set c [read $F]; close $F return $c } # # instantiate parser and parser an example text into a node tree # #puts stderr "parsing [loadFile $opts(-instanceFile)]" RDFParser R R parse [loadFile $opts(-instanceFile)] puts stderr "parsing done" # # load the nodetree from the parser into the triple database # #section Triples TripleVisitor tv -parser R tv proc interprete {} { my instvar topNode parser if {![my exists topNode]} {set topNode ${parser}::topNode1} my reset my interpretNodeTree $topNode } #### Define a simple Resource Database Class RDFdb -superclass RDFTripleDB RDFdb instproc isContainer c { regexp ^[self]::rdfdoc\# $c } RDFdb instproc add {predicate subject object} { set s [self]::$subject if {[my info children $s] eq ""} { #puts stderr "create new resource $s" Resource create $s } $s set $predicate $object next ;# for passing to RDFTripleDB (which provides e.g. prettyTriples) } RDFdb instproc reset {} { foreach c [my info children] { $c destroy } next } RDFdb instproc resources {} { set result "" foreach c [my info children] { if {![my isContainer $c] && [$c istype Resource]} {lappend result $c} } return $result } RDFdb instproc querySubject {subject} { set s [self]::$subject set result "" if {[my info children $s] ne ""} { foreach att [lsort [$s info vars]] { lappend result $att [$s set $att] } } return $result } # create an Instance of the Resource Database RDFdb tv::db # define Resources with its methods Class Resource Resource instproc dump {} { foreach att [lsort [my info vars]] { puts stderr "\t$att = [my set $att]" } } Resource instproc substitute {lines} { set result "" foreach line [split $lines \n] { if {[regexp {^ *http:} $line]} { set value "" set o [self] set line [string trim $line] foreach step $line { set value [$o set $step] set o tv::db::$value } append result $value } else { append result $line } } return $result } Resource instproc pretty {} { set q [univ selfAction "details [namespace tail [self]]"] my substitute " http://nm.wu-wien.ac.at/universal/rdf-lifecycle#Contribute \ http://nm.wu-wien.ac.at/universal/rdf-lifecycle#Entity : http://nm.wu-wien.ac.at/universal/rdf-general#Title , http://nm.wu-wien.ac.at/universal/rdf-education#LearningResourceType , http://nm.wu-wien.ac.at/universal/rdf-education#TypicalLearningTime , http://nm.wu-wien.ac.at/universal/rdf-lifecycle#Contribute \ http://nm.wu-wien.ac.at/universal/rdf-lifecycle#Date ([my pretty-access])" } Resource instproc pretty-title {} { my substitute "http://nm.wu-wien.ac.at/universal/rdf-general#Title" } Resource instproc pretty-access {} { set tech http://nm.wu-wien.ac.at/universal/rdf-technical set format [my substitute "$tech#Format"] set location [my substitute "$tech#Location"] if {$format eq "text/html"} { set label "go" } else { set label "Download [my substitute $tech#Size] bytes" } return "$label" } ### Definition of the Learning Resource Manager: Class LrManager -superclass WebDocument -parameter { {defaultUrl http://nm.wu-wien.ac.at/Lehre/oo2/} } LrManager instproc html-title {t} { my contentType text/html return "$t\n\n" } LrManager instproc html-head {t} { return "

$t

\n" } LrManager instproc details {subject} { set result [my html-title "Details about a Learning Resource"] append result [my html-head "Details about the Learning Resource
'[::tv::db::$subject pretty-title]'"] #append result "The subject: '$subject' has the following properties:

\n" append result [my attributeTable $subject outer] "" } LrManager instproc attributeTable {subject cls} { set result "" set lastns "" foreach {attr value} [tv::db querySubject $subject] { if {[tv::db isContainer $value]} { #set q [univ selfAction "details $value"]; set value "$value" set value [my attributeTable $value inner] } regexp {^(.*)\#(.*)$} $attr _ ns property if {$ns != $lastns} { if {$lastns ne ""} { append result

\n } append result "Attributes from namespace $ns:\n\n" set lastns $ns } append result \ "" \ "" \n } append result "
$property$value
\n" } LrManager instproc catalog {} { set result [my html-title "Universal Resources"] append result [my html-head "Local Learning Resources:"]

} LrManager instproc source {file} { my contentType text/plain return [loadFile $file] } LrManager instproc nav {} { set right [my selfAction "catalog"] set result [my html-title "Universal Navigation Bar"] set rdfsrc [my selfAction "source $::opts(-instanceFile)"] set csssrc [my selfAction "source $::opts(-root)/$::opts(-cssFile)"] set src [my selfAction "source [info script]"] append result \n \ "UNIVERSAL HOME \n\

All local Resources

Search for Title

Search for Authors


Internal Use only:

XML:RDF Source

CSS Source

Source of Meta-Data Application Server

" } LrManager instproc default {} { set right [my selfAction "catalog"] set nav [my selfAction "nav"] set result [my html-title "Universal"] append result " <body>\n\<h2>Query UNIVERSAL database for Resource:</h2>\n\ " } LrManager instproc init args { next ::receiver exportObjs [self] ;# export object my exportProcs details catalog nav source ;# export methods } # create an instance of the Learning Resource manager LrManager univ receiver proc default {} {univ default} ;# call it like index.html as default # Invoke Tiple Visitor to feed the database tv interprete #puts stderr [tv::db prettyTriples] receiver startEventLoop ;# Start event loop ./xotcl-1.6.8/apps/comm/._client.pem000644 000765 000024 00000000430 12161600406 017705 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/client.pem000644 000765 000024 00000006340 12161600406 017476 0ustar00neumannstaff000000 000000 issuer :/C=DE/ST=NRW/L=Essen/O=University of Essen/OU=SWT/CN=Fredj Dridi/Email=Fredj.Dridi@uni-essen.de subject:/CN=Fredj Dridi/Email=fredj_dridi@yahoo.com serial :02 Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) Signature Algorithm: md5WithRSAEncryption Issuer: C=DE, ST=NRW, L=Essen, O=University of Essen, OU=SWT, CN=Fredj Dridi/Email=Fredj.Dridi@uni-essen.de Validity Not Before: Apr 28 08:24:43 2000 GMT Not After : Apr 28 08:24:43 2001 GMT Subject: CN=Fredj Dridi/Email=fredj_dridi@yahoo.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:e4:df:a7:f3:ed:61:df:30:ad:d9:6f:63:f2:d1: 85:9b:72:b2:c6:e4:fd:50:11:c5:0a:29:59:02:60: 29:f6:2c:6a:35:08:89:49:ad:d4:44:1d:7f:14:18: 61:4d:e8:66:87:30:01:52:cd:7d:16:72:0e:24:38: 19:a5:a7:dc:cf:7a:5d:79:ea:48:c6:c4:ae:52:a6: 94:36:7f:f3:24:43:b0:21:5a:f2:d5:6d:66:38:4c: b7:7a:0e:ce:12:01:b0:46:4b:ea:08:b4:e0:aa:b8: 96:dc:3e:15:e0:24:92:84:1f:77:d0:8d:73:d2:f3: ac:82:b0:61:60:1a:6a:fc:b9 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Alternative Name: email:fredj_dridi@yahoo.com X509v3 Basic Constraints: critical CA:FALSE X509v3 Authority Key Identifier: keyid:D2:B8:E3:2D:A2:5A:22:78:3A:38:F1:1F:F5:7C:AD:8D:A6:C4:41:0F X509v3 Extended Key Usage: TLS Web Client Authentication, E-mail Protection Signature Algorithm: md5WithRSAEncryption 01:88:26:35:b9:c7:c9:5a:90:ff:b8:9c:37:fa:48:0e:03:82: b4:18:df:49:e7:5d:42:3a:48:e3:e4:84:c7:b6:ef:cc:91:4c: 47:9d:34:f9:51:0b:63:d0:35:f9:ad:a5:a9:3d:ef:75:23:0c: 14:77:59:79:59:58:c8:74:df:01:b8:de:f2:78:47:64:1a:7e: 4b:09:31:5e:f5:34:e2:ad:5e:e8:81:00:f1:af:fe:48:31:0b: a9:b1:4d:53:51:9a:15:1f:55:ba:30:e4:0e:02:05:20:4b:de: 9c:d9:86:f1:e4:d9:18:c4:93:03:19:06:a5:f3:cb:2a:28:a0: fd:de -----BEGIN CERTIFICATE----- MIICuzCCAiSgAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBljELMAkGA1UEBhMCREUx DDAKBgNVBAgTA05SVzEOMAwGA1UEBxMFRXNzZW4xHDAaBgNVBAoTE1VuaXZlcnNp dHkgb2YgRXNzZW4xDDAKBgNVBAsTA1NXVDEUMBIGA1UEAxMLRnJlZGogRHJpZGkx JzAlBgkqhkiG9w0BCQEWGEZyZWRqLkRyaWRpQHVuaS1lc3Nlbi5kZTAeFw0wMDA0 MjgwODI0NDNaFw0wMTA0MjgwODI0NDNaMDwxFDASBgNVBAMTC0ZyZWRqIERyaWRp MSQwIgYJKoZIhvcNAQkBFhVmcmVkal9kcmlkaUB5YWhvby5jb20wgZ8wDQYJKoZI hvcNAQEBBQADgY0AMIGJAoGBAOTfp/PtYd8wrdlvY/LRhZtyssbk/VARxQopWQJg KfYsajUIiUmt1EQdfxQYYU3oZocwAVLNfRZyDiQ4GaWn3M96XXnqSMbErlKmlDZ/ 8yRDsCFa8tVtZjhMt3oOzhIBsEZL6gi04Kq4ltw+FeAkkoQfd9CNc9LzrIKwYWAa avy5AgMBAAGjcjBwMCAGA1UdEQQZMBeBFWZyZWRqX2RyaWRpQHlhaG9vLmNvbTAM BgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFNK44y2iWiJ4OjjxH/V8rY2mxEEPMB0G A1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDANBgkqhkiG9w0BAQQFAAOBgQAB iCY1ucfJWpD/uJw3+kgOA4K0GN9J511COkjj5ITHtu/MkUxHnTT5UQtj0DX5raWp Pe91IwwUd1l5WVjIdN8BuN7yeEdkGn5LCTFe9TTirV7ogQDxr/5IMQupsU1TUZoV H1W6MOQOAgUgS96c2Ybx5NkYxJMDGQal88sqKKD93g== -----END CERTIFICATE----- ./xotcl-1.6.8/apps/comm/._filename.crt000644 000765 000024 00000000430 12161600406 020216 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/filename.crt000644 000765 000024 00000002432 12161600406 020005 0ustar00neumannstaff000000 000000 -----BEGIN CERTIFICATE----- MIIDmDCCAwGgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBlTELMAkGA1UEBhMCYXQx EDAOBgNVBAgTB0F1c3RyaWExDzANBgNVBAcTBlZpZW5uYTEQMA4GA1UEChMHV1Ut V2llbjELMAkGA1UECxMCV0kxHjAcBgNVBAMTFW1vaGVnYW4ud3Utd2llbi5hYy5h dDEkMCIGCSqGSIb3DQEJARYVbmV1bWFubkB3dS13aWVuLmFjLmF0MB4XDTAyMDQw MjEwNDUwN1oXDTAyMDUwMjEwNDUwN1owgZUxCzAJBgNVBAYTAmF0MRAwDgYDVQQI EwdBdXN0cmlhMQ8wDQYDVQQHEwZWaWVubmExEDAOBgNVBAoTB1dVLVdpZW4xCzAJ BgNVBAsTAldJMR4wHAYDVQQDExVtb2hlZ2FuLnd1LXdpZW4uYWMuYXQxJDAiBgkq hkiG9w0BCQEWFW5ldW1hbm5Ad3Utd2llbi5hYy5hdDCBnzANBgkqhkiG9w0BAQEF AAOBjQAwgYkCgYEA5iT1aT1zU5mfqabGQWcdLyGVFlJBuiKnD2wCVDBIJFVYk6EJ FrFadKgUXNa0Sxrav/5BJyG2ObOrS4BH6yAl8f90QbAokFp9HeW5wkkAhjkSe1Rw vcts9F+R6OhcBxO+tQ6maR9wIGfWoK+vWDyfO7wnHjiL2YZFW73mDBUuHO8CAwEA AaOB9TCB8jAdBgNVHQ4EFgQUbnmEzLNHBNqySdNmPzLSf+yjEc8wgcIGA1UdIwSB ujCBt4AUbnmEzLNHBNqySdNmPzLSf+yjEc+hgZukgZgwgZUxCzAJBgNVBAYTAmF0 MRAwDgYDVQQIEwdBdXN0cmlhMQ8wDQYDVQQHEwZWaWVubmExEDAOBgNVBAoTB1dV LVdpZW4xCzAJBgNVBAsTAldJMR4wHAYDVQQDExVtb2hlZ2FuLnd1LXdpZW4uYWMu YXQxJDAiBgkqhkiG9w0BCQEWFW5ldW1hbm5Ad3Utd2llbi5hYy5hdIIBADAMBgNV HRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBANj6u54TmwEJg/Ldvfx+Qrax+66n zh1EYzxrlYp6eNQVPEyOsF1DJh150Lci1Mm/i71D87yJRVjagTv5dAUdupy9Zf6c AMMv6KvK5G7q6LC9ArwNiBObsmQUlN7+PzRmG9CerRJ6W8eEYnYB0EHhYVKc8cED F4mixcF1HGQJI/qN -----END CERTIFICATE----- ./xotcl-1.6.8/apps/comm/._filename.key000644 000765 000024 00000000430 12161600406 020216 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/filename.key000644 000765 000024 00000001703 12161600406 020005 0ustar00neumannstaff000000 000000 -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,075071A5AF5C1D8A qmihZRxmNNlGCx9lVC4QQPQS25e4aAg3oHjxDaZ0yyDSKsWz4J04lo2x63QT/88i z9YUQqyC8ry53D5y3aQKiFuXlDDvX6PtPS+cQANA8g5qOIHsMF3yINfrVEmWkPjx xOYF2qIGI0ISPTT5AkTN3KVmYE7rbFvqgQMklj/SlNBqeUmKvn1rhUCFAd0jYXa9 imaKVMj08q4GItLAqPoJNY4K73IHZeaW8GEWAJ5E/KEzYFBnYUiPUN8UPCCQsC+b ViRF226hCFSu8yDBah8R/u6W9rEa+Vs/T7Cyklnot2FDyCU0EW/lhKBKfEKTmXAe sBzN7F1hrLFifUD7VzJ2K7zKh7pMy3X+D+0PUjVaIyZWDIH3nOiTzfK6kxksjoE5 P+fp5IL4okEJgD6MoLJHGWTwfhH9K6QBX01My3s22q5zuiJ3SajRCFlLDn7jTTPV 2OQ9+2FksxJYa5Z5/n63Vslz0+yKv9AVTbrtfrbbRJtmpbElCPrvhzVsuWksRS3A biZxD5PkWiYDvNm34eOAOARb7n0awTOZ1bqdccT+rhcvo7c+MypIY0/AfZKZK4hN bWxHR3wZUv+wffx1CBxvsBBomV8XqcqJliVHgdvwDdzl3Z2HbYK3w92RXNY36FYw C1iqALuxE9nhzyEv0ARfjcXTu0lUmFZOfi4oizzMVj7u2q4mGt0+ZuKBs/fTEEm1 3L1nLnalGb5ko5OTZ4DMQlP1HCU3UZslImAcc3FFa/WNzhG07/YAlcTS18YUbJYF 19Yx6qrYfrZA2UZq0+8DFa8XgOHCFO0KqQHRfRB/7tGNGxX5md8+9w== -----END RSA PRIVATE KEY----- ./xotcl-1.6.8/apps/comm/._ftp.xotcl000644 000765 000024 00000000430 12161600406 017570 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/ftp.xotcl000644 000765 000024 00000000416 12161600406 017357 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh package require XOTcl 1; namespace import -force xotcl::* @ @File {description { A tiny FTP client }} package require xotcl::comm::ftp SimpleRequest r1 -url ftp://prep.ai.mit.edu/README if {[r1 success]} { puts "Got:" puts [r1 getContent] } ./xotcl-1.6.8/apps/comm/._get-regression-nb.xotcl000644 000765 000024 00000000430 12161600406 022331 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/get-regression-nb.xotcl000644 000765 000024 00000030607 12161600406 022125 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh package require XOTcl 1; namespace import -force xotcl::* # ./get-regression-nb.xotcl -host swt -parallel 0 # ./get-regression-nb.xotcl -host swt -sequential 0 # # mit ~/wafe/src/cineast/webserver.xotcl (benotigt ~/wafe/test/*) # ./get-regression-nb.xotcl -port 8086 # # Vergleich webserver.xotcl mit Apache: # 1) installation von Apache auf port 80 # # 2) installation vom webserver.xotcl auf port 8086 # # 3) von beiden server sollend die files in wafe/test/* unter # http://SERVER+PORT/test/* # erreichbar sein. # # 4) test der installation # apache: # cd wafe/src/cineast # get-regression-nb.xotcl -sequential 0 # die ausgabe sollte mit totalbytes=6536120 # abgeschlossen werden # # webserver.xotcl: # cd wafe/src/cineast # get-regression-nb.xotcl -port 8086 -sequential 0 # die ausgabe sollte mit totalbytes=6536120 # abgeschlossen werden # # 5) grosser testlauf: # rsh muss funktionieren: z.B.: rsh localhost date # # apache: # cd wafe/src/cineast # time get-regression-nb.xotcl -sequential 0 -clients 1 # # webserver.xotcl: # cd wafe/src/cineast # time get-regression-nb.xotcl -port 8086 -sequential 0 -clients 1 # # Ergebnisse auf meinem Rechner: # # der xotcl-webserver ist etwa 20% langsamer als apache. # das logging (instproc log) aktivieren kostet ein paar weitere prozent.... # -gn # # mohegan:~/wafe/src/cineast> time ./get-regression-nb.xotcl -port 8086 -sequential 0 -clients 1 # Loading source file ~/wafe/src/cineast/Access.xotcl # Loading source file ~/wafe/src/cineast/PCache.xotcl # Loading source file ~/wafe/src/cineast/Connection.xotcl # Loading source file ~/wafe/src/cineast/trace.xotcl # 1 clients: 3.07 seconds (per client 3.07 seconds, 2127.31 KB/sec) server: 2127.31 KB/sec # 2 clients: 6.36 seconds (per client 3.18 seconds, 1028.10 KB/sec) server: 2056.20 KB/sec # 3 clients: 7.71 seconds (per client 2.57 seconds, 847.74 KB/sec) server: 2543.22 KB/sec # 4 clients: 11.21 seconds (per client 2.80 seconds, 582.92 KB/sec) server: 2331.66 KB/sec # 5 clients: 10.57 seconds (per client 2.11 seconds, 618.49 KB/sec) server: 3092.45 KB/sec # 10 clients: 25.07 seconds (per client 2.51 seconds, 260.68 KB/sec) server: 2606.79 KB/sec # 20 clients: 45.48 seconds (per client 2.27 seconds, 143.73 KB/sec) server: 2874.58 KB/sec #0.420u 0.450s 1:49.65 0.7% 0+0k 0+0io 113263310pf+0w # # # # mohegan:~/wafe/src/cineast> time ./get-regression-nb.xotcl -port 80 -sequential 0 -clients 1 # Loading source file ~/wafe/src/cineast/Access.xotcl # Loading source file ~/wafe/src/cineast/PCache.xotcl # Loading source file ~/wafe/src/cineast/Connection.xotcl # Loading source file ~/wafe/src/cineast/trace.xotcl # 1 clients: 1.85 seconds (per client 1.85 seconds, 3542.58 KB/sec) server: 3542.58 KB/sec # 2 clients: 4.71 seconds (per client 2.36 seconds, 1387.02 KB/sec) server: 2774.03 KB/sec # 3 clients: 4.09 seconds (per client 1.36 seconds, 1596.58 KB/sec) server: 4789.74 KB/sec # 4 clients: 7.74 seconds (per client 1.94 seconds, 844.43 KB/sec) server: 3377.71 KB/sec # 5 clients: 9.46 seconds (per client 1.89 seconds, 690.67 KB/sec) server: 3453.33 KB/sec # 10 clients: 20.91 seconds (per client 2.09 seconds, 312.52 KB/sec) server: 3125.24 KB/sec # 20 clients: 39.01 seconds (per client 1.95 seconds, 167.55 KB/sec) server: 3351.08 KB/sec #0.410u 0.360s 1:27.95 0.8% 0+0k 0+0io 112251994pf+0w # # set CACHE_DIR [::xotcl::tmpdir] package require xotcl::comm::httpAccess package require xotcl::trace set port "" set host localhost set cachingopts {0 1 2 2} set parallel 1 set sequential 0 set clients 0 set local 1 foreach {att val} $argv { switch -exact -- $att { -port {set port $val} -host {set host $val} -memory {set cachingopts 0} -parallel {set parallel $val} -sequential {set sequential $val} -clients {set clients $val} -local {set local $val} } } set hosts { R2H2-11 R2H2-12 R2H2-13 R2H2-21 R2H2-22 R2H2-23 R2H2-31 R2H2-32 R2H2-33 R2H2-41 R2H2-42 R2H2-43 R2H2-51 R2H2-52 R2H2-53 R2H2-61 R2H2-62 R2H2-63 R2H2-73 matush nashawag sagumumpsketuck wawog willimantic wonkituck mashipaug watuppa } #set hosts { # matush nashawag sagumumpsketuck wawog willimantic wonkituck mashipaug # R2H2-11 R2H2-12 R2H2-13 R2H2-21 R2H2-22 R2H2-23 R2H2-31 R2H2-32 # R2H2-33 R2H2-41 R2H2-42 R2H2-43 R2H2-51 R2H2-52 R2H2-53 R2H2-61 # R2H2-62 R2H2-63 R2H2-73 # watuppa #} set totalbytes 6536120 set totalbytes 1293240;# ohne 5m request if {$clients} { proc readable {handle rhost} { if {[eof $handle]} { incr ::running -1 if {[catch {close $handle} output]} { if {![string match *$::totalbytes $output]} { puts stderr "invalid output on client on host $rhost" puts stderr "***********************************" puts stderr $output puts stderr "***********************************" } } #puts stderr clients=$::running if {$::running == 0} { set ::xxx 1 } } else { gets $handle } } proc clients {clients} { append cmd "[pwd]/$::argv0 -host $::host " \ "-parallel $::parallel -sequential $::sequential" if {$::port ne ""} {append cmd " -port $::port"} set starttime [clock clicks] set ::running $clients for {set s 0} {$s < $clients} {incr s} { if {$::local} { set rhost localhost } else { set rhost [lindex $::hosts $s] } #puts stderr "rsh $rhost $cmd" puts -nonewline stderr "$rhost " set f($s) [open "| rsh $rhost $cmd"] fconfigure $f($s) -blocking 0 fileevent $f($s) readable "readable $f($s) $rhost" } puts stderr "" vwait ::xxx set secs [expr {([clock clicks] -$starttime)/1000000.0}] puts stderr "[format %3d $clients] clients: [format %6.2f $secs] seconds \ (per client [format %6.2f [expr {$secs/$clients}]] seconds,\ [format %7.2f [expr {$::totalbytes/($secs*1000.0)}]] KB/sec)\ server: [format %7.2f [expr {$::totalbytes*$clients/($secs*1000.0)}]] KB/sec" } clients 1 clients 2 clients 3 clients 4 clients 5 clients 10 clients 20 exit } persistentCache clear proc assert {f r} { set got [eval $f] if {$got ne $r } { puts stderr "assertion failed: \[$f\] == $r (got $got)" quit } else { puts stderr "OK $r = $f" } } proc head msg { puts stderr "" puts stderr "---------------------------- $msg" } proc test {msg cmd} { set r [Object autoname r] head $msg if {[catch {eval $cmd} msg]} { puts stderr "ERROR: $::errorInfo" quit } $r destroy } Object userPwd userPwd proc user {u} { my set user $u } userPwd proc show {realm userVar pwVar} { upvar $userVar u $pwVar pw set u [my set user] set pw jogl return 1 } # test "simple request" { # SimpleRequest $r -caching 0 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # SimpleRequest $r -caching 1 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # SimpleRequest $r -caching 1 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # persistentCache invalidate \ # http://localhost/index.html # SimpleRequest $r -caching 1 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # SimpleRequest $r -caching 0 \ # -url http://localhost/muster-d1klausur.ps # assert "$r getContentLength" 163840 # } set total 0 proc parallelRequests-1.0 {urls} { ParallelSink psink -httpVersion 1.0 -init -requests $urls incr ::total [psink set totalbytes] psink destroy } proc parallelRequests-1.1 {urls} { ParallelSink psink -init -requests $urls incr ::total [psink set totalbytes] psink destroy } if {$port ne ""} {set port :$port} if {$parallel} { parallelRequests-1.0 [list \ http://$host$port/test/file500.html \ http://$host$port/test/file5k.html \ http://$host$port/test/file50k.html \ http://$host$port/test/file500k.html \ http://$host$port/test/file5m.html \ http://$host$port/test/file500.html \ http://$host$port/test/file5k.html \ http://$host$port/test/file5k.html \ http://$host$port/test/file500.html \ http://$host$port/test/file500.html \ http://$host$port/test/file5k.html \ http://$host$port/test/file5k.html \ http://$host$port/test/file500.html \ http://$host$port/test/file5k.html \ http://$host$port/test/file5k.html \ http://$host$port/test/file500.html \ ] for {set i 1} {$i<10} {incr i} { parallelRequests-1.1 [list \ http://$host$port/test/file50k.html \ http://$host$port/test/file5k1.html \ http://$host$port/test/file5k2.html \ http://$host$port/test/file5k3.html \ http://$host$port/test/file5k4.html \ http://$host$port/test/file5k5.html ] } puts stderr totalbytes=$::total } if {$sequential} { set doc http://$host$port/test/suexec.html set size 20680 foreach c $cachingopts { test "caching $c $doc" { SimpleRequest $r -caching $::c -url $::doc assert "$r getContentLength" $::size #puts stderr c=<[$r getContent]> } } set doc http://$host$port/test/xvdocs.ps set size 3678303 foreach c $cachingopts { test "caching $c" { SimpleRequest $r -caching $::c -url $::doc assert "$r getContentLength" $::size } } } exit test "simple request" { SimpleRequest $r -caching 0 \ -url http://nestroy.wi-inf.uni-essen.de/Raumplan.html assert "$r getContentLength" 662 } test "simple request, larger file" { SimpleRequest $r -caching 0 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 } test "use cache" { SimpleRequest $r -caching 1 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 } test "specify filename, use cache and validate request" { persistentCache invalidate \ http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps exec rm -f test.ps SimpleRequest $r -caching 1 -fileName test.ps \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 assert {lindex [exec md5sum test.ps] 0} c6029c987e841430f3ca9bab157da12f } test "specify filename, and use cache and a validated file" { exec rm -f test.ps SimpleRequest $r -caching 1 -fileName test.ps \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 assert {lindex [exec md5sum test.ps] 0} c6029c987e841430f3ca9bab157da12f } test "specify filename, and do not use cache" { exec rm -f test.ps SimpleRequest $r -fileName test.ps -caching 0 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 assert {lindex [exec md5sum test.ps] 0} c6029c987e841430f3ca9bab157da12f } test "specify filesink and use cache; no copying neccesary" { persistentCache invalidate \ http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps SimpleRequest $r -useFileSink 1 -caching 1 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 } test "load a large file to the cache" { persistentCache clearEntry http://swt.wi-inf.uni-essen.de/lx2.1.55 SimpleRequest $r -caching 1 \ -url http://swt.wi-inf.uni-essen.de/lx2.1.55 assert "$r getContentLength" 522411 } test "load a validated large file" { SimpleRequest $r -caching 1 \ -url http://swt.wi-inf.uni-essen.de/lx2.1.55 assert "$r getContentLength" 522411 } test "pure loading test without cache" { SimpleRequest $r -caching 0 \ -url http://swt.wi-inf.uni-essen.de/lx2.1.55 assert "$r getContentLength" 522411 } test "redirect" { SimpleRequest $r -caching 1 \ -url http://mohegan.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 } test "authentication" { SimpleRequest $r -caching 1 \ -url http://nestroy.wi-inf.uni-essen.de/cgi-bin/w3-msql/Forschung/Publikationen/protected/index.html assert "$r getContentLength" 1164 } puts stderr after quit ### request joining ### load to file depending on content type ./xotcl-1.6.8/apps/comm/._get-regression.xotcl000644 000765 000024 00000000430 12161600406 021734 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/get-regression.xotcl000644 000765 000024 00000012166 12161600406 021530 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh package require XOTcl 1; namespace import -force xotcl::* package require xotcl::comm::httpAccess package require xotcl::trace persistentCache clear proc assert {f r} { set got [eval $f] if {$got ne $r } { puts stderr "assertion failed: \[$f\] == $r (got $got)" quit } else { puts stderr "OK $r = $f" } } proc head msg { puts stderr "" puts stderr "---------------------------- $msg" } proc test {msg cmd} { set r [Object autoname r] head $msg if {[catch {eval $cmd} msg]} { puts stderr "ERROR: $::errorInfo" quit } $r destroy } Object userPwd userPwd proc user {u} { my set user $u } userPwd proc show {realm userVar pwVar} { upvar $userVar u $pwVar pw set u [my set user] set pw jogl return 1 } # test "simple request" { # SimpleRequest $r -caching 0 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # SimpleRequest $r -caching 1 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # SimpleRequest $r -caching 1 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # persistentCache invalidate \ # http://localhost/index.html # SimpleRequest $r -caching 1 \ # -url http://localhost/index.html # assert "$r getContentLength" 81 # } # test "simple request" { # SimpleRequest $r -caching 0 \ # -url http://localhost/muster-d1klausur.ps # assert "$r getContentLength" 163840 # } proc parallelRequests {urls} { JoinSink joinsink -requests [llength $urls] set i 0 foreach url $urls { TimedMemorySink sink$i set t$i [Access [Access autoname a] -url $url \ -informObject [list joinsink sink$i] \ -caching 0] incr i } set i 0 foreach url $urls { sink$i reportTimes;incr i} joinsink destroy } # parallelRequests { # http://localhost/muster-d1klausur.ps # http://localhost/muster-d1klausur2.ps # } # quit foreach c {0 1 2 2} { test "caching $c" { SimpleRequest $r -caching $::c \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 } } test "simple request" { SimpleRequest $r -caching 0 \ -url http://nestroy.wi-inf.uni-essen.de/Raumplan.html assert "$r getContentLength" 662 } test "simple request, larger file" { SimpleRequest $r -caching 0 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 } test "use cache" { SimpleRequest $r -caching 1 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 } test "specify filename, use cache and validate request" { persistentCache invalidate \ http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps exec rm -f test.ps SimpleRequest $r -caching 1 -fileName test.ps \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 assert {lindex [exec md5sum test.ps] 0} c6029c987e841430f3ca9bab157da12f } test "specify filename, and use cache and a validated file" { exec rm -f test.ps SimpleRequest $r -caching 1 -fileName test.ps \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 assert {lindex [exec md5sum test.ps] 0} c6029c987e841430f3ca9bab157da12f } test "specify filename, and do not use cache" { exec rm -f test.ps SimpleRequest $r -fileName test.ps -caching 0 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 assert {lindex [exec md5sum test.ps] 0} c6029c987e841430f3ca9bab157da12f } test "specify filesink and use cache; no copying neccesary" { persistentCache invalidate \ http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps SimpleRequest $r -useFileSink 1 -caching 1 \ -url http://nestroy.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 assert "file size test.ps" 349970 } test "load a large file to the cache" { persistentCache clearEntry http://swt.wi-inf.uni-essen.de/lx2.1.55 SimpleRequest $r -caching 1 \ -url http://swt.wi-inf.uni-essen.de/lx2.1.55 assert "$r getContentLength" 522411 } test "load a validated large file" { SimpleRequest $r -caching 1 \ -url http://swt.wi-inf.uni-essen.de/lx2.1.55 assert "$r getContentLength" 522411 } test "pure loading test without cache" { SimpleRequest $r -caching 0 \ -url http://swt.wi-inf.uni-essen.de/lx2.1.55 assert "$r getContentLength" 522411 } test "redirect" { SimpleRequest $r -caching 1 \ -url http://mohegan.wi-inf.uni-essen.de/Lv/muster-d1klausur.ps assert "$r getContentLength" 349970 } test "authentication" { SimpleRequest $r -caching 1 \ -url http://nestroy.wi-inf.uni-essen.de/cgi-bin/w3-msql/Forschung/Publikationen/protected/index.html assert "$r getContentLength" 1164 } puts stderr after quit ### request joining ### load to file depending on content type ./xotcl-1.6.8/apps/comm/._link-checker.xotcl000644 000765 000024 00000000430 12161600406 021336 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/link-checker.xotcl000644 000765 000024 00000011135 12161600406 021125 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh # $Id: link-checker.xotcl,v 1.5 2006/09/27 08:12:39 neumann Exp $ # -gn july 2000 package require XOTcl 1; namespace import -force xotcl::* @ @File { description { A simple link checking program that checks in parallel pages of a site.

Options:

-url Start-URL
-foreign 0 or 1, specifies, whether foreign links of local pages should be checked (default 1)
-local A string match pattern to decide which url should be treated as local e.g. -local *wu-wien.ac.at/* Per default the locality filter ist set to the name of the host followed by '/*'
-restrict 0 or 1, sets the locality filter to the subtree implied by the URL
-verbose 0 or 1 or 2, verbosity level (default 0)
} } if {$tcl_version<8.2} { puts stderr "This script requires Tcl 8.2 or newer" exit -1 } set opt(-url) http://localhost:8000/ set opt(-url) http://nm.wu-wien.ac.at/Lehre/ set opt(-verbose) 0; # 0, 1 (show check), or 2 (show ignore) set opt(-foreign) 1; # 0, 1 (check foreign links on local pages) set opt(-restrict) 0; # 0, 1 ## per default, lc checks the array set opt $argv if {$opt(-restrict)} { regexp {://(.*)$} $opt(-url) _ opt(-local) set opt(-local) [string trimright $opt(-local) /]* puts stderr "locality filter set to '$opt(-local)'" } if {![info exists opt(-local)]} { regexp {http://([^/:]+)} $opt(-url) _ opt(-local) append opt(-local) /* puts stderr "locality filter set to '$opt(-local)'" } #package require xotcl::package; package verbose 1 package require xotcl::comm::httpAccess package require xotcl::trace proc printError {m} {} Class Checker -superclass ParallelSink \ -parameter {verbose foreign local} Checker array set ref {A HREF IMG SRC} Checker set ref_re {[[:space:]]*=[[:space:]]*([[:graph:]]+)} Checker instproc report {msg {level 1}} { my instvar verbose if {$verbose>$level} {puts stderr $msg} return 0 } Checker instproc isLocal {url} { my instvar local string match *://$local $url } Checker instproc isToCheck {url request methodvar} { my instvar foreign upvar $methodvar method if {![regexp -nocase {http://([^/:]+)} $url _ host]} { return [my report "ignored, no http: $url"] } set method GET if {![my isLocal $url]} { if {$foreign} { #puts stderr "parenturl: [$request set parentUrl] -> [my isLocal [$request set parentUrl]]" if {[$request info vars parentUrl] ne "" && ![my isLocal [$request set parentUrl]]} { return [my report "ignored, nor local: $url"] } else { set method HEAD } } else { return [my report "ignored, nor local: $url"] } } if {[regexp -nocase {[.](gif|jpg|ps|pdf|gz)$} $url]} { set method HEAD #return [my report "ignored due to extension: $url"] } return 1 } Checker instproc checkLink {request link} { set resolved [resolve $link [$request set url]] if {[my isToCheck $resolved $request method]} { my instvar checked if {![info exists checked($resolved)]} { my report "checking .......... $resolved" 0 set checked($resolved) 1 my scheduleRequest $method $resolved [$request set url] } else { #puts stderr "already checked $resolved" } } } Checker instproc checkText {request} { if {![my isLocal [$request set url]]} return [self class] instvar ref ref_re set content [$request getContent] set start 0 while {[regexp -nocase -indices -start $start -- \ {<(A|IMG)([^>]*?)} $content a b c]} { set elem [string toupper \ [string range $content [lindex $b 0] [lindex $b 1]]] set attribs [string range $content [lindex $c 0] [lindex $c 1]] #regsub -all {[\n ]+} $attribs " " attribs if {[regexp -nocase $ref($elem)$ref_re $attribs _ i]} { my checkLink $request [string trim $i '\"] } set start [lindex $c 1] } } Checker instproc endCb r { #showObj $r switch [$r set contentType] { text/html {my checkText $r} } next } Checker instproc cancelCb r { #$r showVars puts stderr "ERROR in page [$r set parentUrl]" puts stderr " Link: [$r set url]" puts stderr " cause [$r set errormsg]\n" next } Checker csink \ -verbose $opt(-verbose) -foreign $opt(-foreign) -local $opt(-local) \ -sinkClass MemorySink -httpVersion 1.0 -maxsimultaneous 30 csink requests $opt(-url) puts stderr "sumbytes: [csink set sumbytes] requests: [csink set numrequests]" csink destroy ./xotcl-1.6.8/apps/comm/._secure-webclient.xotcl000644 000765 000024 00000000430 12161600406 022237 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/secure-webclient.xotcl000644 000765 000024 00000003017 12161600406 022026 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh # $Id: secure-webclient.xotcl,v 1.2 2006/02/18 22:17:32 neumann Exp $ package require XOTcl 1; namespace import -force xotcl::* @ @File { description { A sample secure web client that queries an secure web-server. It needs to be adopted with different https URLs for testing... } } # package require xotcl::comm::httpAccess package require xotcl::comm::ftp package require xotcl::trace #set version 1.1 set hostport localhost:8086 set http_server http://localhost:8086/ set https_server https://localhost:8443/ set slowURL "http://quote.yahoo.com/q?s=^DJI&d=1d" set ftpURL "ftp://mohegan.wi-inf.uni-essen.de/welcome.msg" set secureURL "https://wawog.wi-inf.uni-essen.de/" set secureURL "https://test17.wu-wien.ac.at:1234/" proc printError msg {puts stderr !!!$msg!!!} puts "\nTrying to get a secure page ..... <$https_server>" SimpleRequest r0 -url $https_server puts stderr "\n content = {[r0 getContent]}" puts -nonewline "\nTrying to load image logo-100.jpg ... (not secure)" SimpleRequest r2 -url $http_server/logo-100.jpg if {[r2::sink set contentLength] == 1706} { puts "suceeded! Loaded 1706 bytes!" } else { puts "failed! Loaded [r2::sink set contentLength] (!= 1706) bytes" exit } puts -nonewline "\nTrying to load image logo-100.jpg secure ... " SimpleRequest r1 -url $https_server/logo-100.jpg if {[r1::sink set contentLength] == 1706} { puts "suceeded! Loaded 1706 bytes!" } else { puts "failed! Loaded [r1::sink set contentLength] (!= 1706) bytes" exit } exit ./xotcl-1.6.8/apps/comm/._secure-webserver.xotcl000644 000765 000024 00000000430 12161600406 022267 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/secure-webserver.xotcl000644 000765 000024 00000004022 12161600406 022053 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh # $Id: secure-webserver.xotcl,v 1.2 2006/02/18 22:17:32 neumann Exp $ package require XOTcl 1; namespace import -force xotcl::* @ @File { description { This small secure web server that provides its documents via SSL (https, port 8443) and plain http (port 8086).
This file requires TLS. If you experice problems with versions obtained from the Web, contact gustaf.neumann@wu-wien.ac.at for a patch. } } # # We load the following packages: # package require xotcl::trace package require xotcl::comm::httpd # # we set the default for document root to ../../src/doc and port to 8443 # set root ../../doc set port 8443 set class Httpsd set cb callback ;# use this for triggering the callbacks #set cb "" foreach {att value} $argv { switch -- $att { -root {set root $value} -port {set port $value} -class {set class $value} -cb {set cb $value} } } # # now we can start the web-server instance with these settings # Httpd h0 -port 8086 -root $root $class h1 -port $port -root $root -infoCb $cb \ -requestCert 1 -requireValidCert 0 # Start des HTTP-Servers mit port 8086 und dem angegebenen Verzeichnis #Httpd h2 -port 9086 -root $root \ -mixin {Responder BasicAccessControl} \ -addRealmEntry test {test test} -protectDir test "" {} Object callback callback proc error {chan msg} { puts stderr "+++TLS/$chan: error: $msg" } callback proc verify {chan depth cert rc err} { array set c $cert if {$rc != "1"} { puts stderr "+++TLS/$chan: verify/$depth: Bad Cert: $err (rc = $rc)" } else { puts stderr "+++TLS/$chan: verify/$depth: $c(subject)" } return $rc } callback proc info {chan state minor msg} { # For tracing #upvar #0 tls::$chan cb #set cb($major) $minor #puts stderr "+++TLS/$chan: $major/$minor: $state" puts stderr "+++TLS/$chan $state $minor: $msg" } callback proc unknown {option args} { return -code error "bad option \"$option\": must be one of error, info, or verify" } # # and finally call the event loop... # vwait forever ./xotcl-1.6.8/apps/comm/._server.key000644 000765 000024 00000000430 12161600406 017744 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/server.key000644 000765 000024 00000001567 12161600406 017543 0ustar00neumannstaff000000 000000 -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDVg+HdA4RAKyYRaxKRSdAw7mQpephZslIf/ZR7Oe3RKZjxu7Sj PYG56GSc8y6hiaKuGnDmJcEGXZCXWNtUuACVsNlFrlVbGSEfAbXbz6H4eaaX2d2P KzrjOc//8+5emaFZRelVTYY4sWNLcCuWV2FIhwMJMblYieXM6iEQg4XzdQIDAQAB AoGAVdY2OC8QvOdb34bHKSeejf1YwSArHWxF/dxpE/0e8YaimRQYM8QnYgDeagaN yZ1WjF3O44dsCU4WMfIkAvQSL19RLSgT+jPb3Uu9Aotwmg4x+55BKctRphXKiIfu +a0IfAFDIt8FMRS08AoSB6eBgOBlhTZM2Y0IuC6QTqaBcwUCQQD5XSiEzh44uMOl N4FbO0MI2NC3pbPg5u1fEJtIawoYOYxbeGHrlOYO2ZN3ZP6+2g5V0kX5tMMeObhE qQLlmNETAkEA2zJ/Tk3IE5ByEBcGjG26nJ1zLlY13NaiIg+AoSP+7rHg5TPhoQp1 VVwcqd4ZWCyqgYDFl2TsiiZwKcEIFJBCVwJBANoLpZSLD04V8a2UXV5C8ZjYzZjo IeP0yXco9D9cqZUJLTwGhckTiB9QDWyHOWH1FjfhCCMS9tKFMiWHi+rrt1UCQQDC rlvxURX1gmI8NicjzEVk2la1fe5C4QKJW9lzxUOj/qpvB6BK5r4FfVUb7d32uV0K vjNAXmvT24XdH8usb9/rAkBR1sqUkqwwm0CSe0Rz9IhSlkwWlmvEzSmEguqrd7Zb rbYJ9NTnV1uFSAX9vcU7lDRp69il6XmyhOL06FYLRaNa -----END RSA PRIVATE KEY----- ./xotcl-1.6.8/apps/comm/._server.pem000644 000765 000024 00000000430 12161600406 017735 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/server.pem000644 000765 000024 00000006764 12161600406 017540 0ustar00neumannstaff000000 000000 issuer :/C=DE/ST=NRW/L=Essen/O=University of Essen/OU=SWT/CN=Fredj Dridi/Email=Fredj.Dridi@uni-essen.de subject:/C=DE/ST=NRW/L=Essen/O=University of Essen/OU=SWT/CN=tp600e.wi-inf.uni-essen.de/Email=dridi@tp600e.wi-inf.uni-essen.de serial :01 Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=DE, ST=NRW, L=Essen, O=University of Essen, OU=SWT, CN=Fredj Dridi/Email=Fredj.Dridi@uni-essen.de Validity Not Before: Apr 28 08:21:19 2000 GMT Not After : Apr 28 08:21:19 2001 GMT Subject: C=DE, ST=NRW, L=Essen, O=University of Essen, OU=SWT, CN=tp600e.wi-inf.uni-essen.de/Email=dridi@tp600e.wi-inf.uni-essen.de Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:d5:83:e1:dd:03:84:40:2b:26:11:6b:12:91:49: d0:30:ee:64:29:7a:98:59:b2:52:1f:fd:94:7b:39: ed:d1:29:98:f1:bb:b4:a3:3d:81:b9:e8:64:9c:f3: 2e:a1:89:a2:ae:1a:70:e6:25:c1:06:5d:90:97:58: db:54:b8:00:95:b0:d9:45:ae:55:5b:19:21:1f:01: b5:db:cf:a1:f8:79:a6:97:d9:dd:8f:2b:3a:e3:39: cf:ff:f3:ee:5e:99:a1:59:45:e9:55:4d:86:38:b1: 63:4b:70:2b:96:57:61:48:87:03:09:31:b9:58:89: e5:cc:ea:21:10:83:85:f3:75 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Authority Key Identifier: keyid:D2:B8:E3:2D:A2:5A:22:78:3A:38:F1:1F:F5:7C:AD:8D:A6:C4:41:0F X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication, Microsoft Server Gated Crypto, Netscape Server Gated Crypto X509v3 Basic Constraints: critical CA:FALSE Signature Algorithm: md5WithRSAEncryption 38:b5:a1:1c:93:c4:aa:6e:3f:d6:ea:11:7f:7b:2b:11:db:7b: 22:b3:d2:a8:b3:f3:20:64:6a:25:b4:fe:0d:ac:12:49:a0:6e: 6d:ef:fb:99:a2:7c:bc:50:b0:eb:42:ef:0a:32:fa:a9:69:e0: 11:10:9b:00:05:15:97:59:ac:dc:5f:f2:cd:81:28:3e:e6:96: 86:f4:d7:99:71:52:c3:ca:0f:4a:48:d8:66:b0:da:e8:d1:45: 84:c4:12:b2:43:ec:63:b6:25:e8:0a:5a:4c:fb:e2:ec:03:36: 6f:cd:f9:2a:5c:52:ba:02:29:92:f5:bf:c4:96:ff:9e:ed:a3: cf:02 -----BEGIN CERTIFICATE----- MIIDIjCCAougAwIBAgIBATANBgkqhkiG9w0BAQQFADCBljELMAkGA1UEBhMCREUx DDAKBgNVBAgTA05SVzEOMAwGA1UEBxMFRXNzZW4xHDAaBgNVBAoTE1VuaXZlcnNp dHkgb2YgRXNzZW4xDDAKBgNVBAsTA1NXVDEUMBIGA1UEAxMLRnJlZGogRHJpZGkx JzAlBgkqhkiG9w0BCQEWGEZyZWRqLkRyaWRpQHVuaS1lc3Nlbi5kZTAeFw0wMDA0 MjgwODIxMTlaFw0wMTA0MjgwODIxMTlaMIGtMQswCQYDVQQGEwJERTEMMAoGA1UE CBMDTlJXMQ4wDAYDVQQHEwVFc3NlbjEcMBoGA1UEChMTVW5pdmVyc2l0eSBvZiBF c3NlbjEMMAoGA1UECxMDU1dUMSMwIQYDVQQDExp0cDYwMGUud2ktaW5mLnVuaS1l c3Nlbi5kZTEvMC0GCSqGSIb3DQEJARYgZHJpZGlAdHA2MDBlLndpLWluZi51bmkt ZXNzZW4uZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANWD4d0DhEArJhFr EpFJ0DDuZCl6mFmyUh/9lHs57dEpmPG7tKM9gbnoZJzzLqGJoq4acOYlwQZdkJdY 21S4AJWw2UWuVVsZIR8BtdvPofh5ppfZ3Y8rOuM5z//z7l6ZoVlF6VVNhjixY0tw K5ZXYUiHAwkxuViJ5czqIRCDhfN1AgMBAAGjZzBlMB8GA1UdIwQYMBaAFNK44y2i WiJ4OjjxH/V8rY2mxEEPMDQGA1UdJQQtMCsGCCsGAQUFBwMBBggrBgEFBQcDAgYK KwYBBAGCNwoDAwYJYIZIAYb4QgQBMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEE BQADgYEAOLWhHJPEqm4/1uoRf3srEdt7IrPSqLPzIGRqJbT+DawSSaBube/7maJ8 vFCw60LvCjL6qWngERCbAAUVl1ms3F/yzYEoPuaWhvTXmXFSw8oPSkjYZrDa6NFF hMQSskPsY7Yl6ApaTPvi7AM2b835KlxSugIpkvW/xJb/nu2jzwI= -----END CERTIFICATE----- ./xotcl-1.6.8/apps/comm/._test-tls-client.xotcl000755 000765 000024 00000000430 12161600406 022035 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/test-tls-client.xotcl000755 000765 000024 00000004231 12161600406 021623 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # # $Id: test-tls-client.xotcl,v 1.2 2006/02/18 22:17:32 neumann Exp $ package require tls proc bgerror {err} { global errorInfo puts stderr "BG Error: $errorInfo" } array set opts { -port 8443 -host localhost } array set opts $argv proc readCB {CHAN} { #puts stderr "*** CALL: readCB $CHAN" if {![eof $CHAN]} { set rData [gets $CHAN] puts stderr "\nREADING ..." puts stderr "------------------------------------------------------" puts stderr <$rData> puts stderr "------------------------------------------------------" #fileevent $CHAN writable [list writeCB $CHAN] } else { catch {close $CHAN} puts stderr "\nSocket ($CHAN) is closed." exit } } proc writeCB {CHAN} { #puts stderr "*** CALL: writeCB $CHAN" #puts stderr "fileevent $CHAN writable {}" fileevent $CHAN writable {} set wData "GET / HTTP/1.1\r\nHost: localhost\r\nAccept: */*\r\n\r\n" #set wData "GET\n" puts -nonewline $CHAN $wData flush $CHAN #puts stderr "\nfileevent $CHAN readable [list readCB $CHAN]" fileevent $CHAN readable [list readCB $CHAN] } puts stderr "\n\n\n~~~~~~~~~~~~ Trying $opts(-host):$opts(-port)" # # Create socket # set chan [socket -async $opts(-host) $opts(-port)] tls::import $chan -command callback -cafile cacert.pem -certfile client.pem -server 0 -keyfile client.key -request 1 -require 1 puts stderr "setting channel to auto binary" fconfigure $chan -translation {auto binary} puts stderr "fileevent $chan writable [list writeCB $chan]" fileevent $chan writable [list writeCB $chan] Object callback callback proc error {chan msg} { puts stderr "+++TLS/$chan: error: $msg" } callback proc verify {chan depth cert rc err} { array set c $cert if {$rc != "1"} { puts stderr "+++TLS/$chan: verify/$depth: Bad Cert: $err (rc = $rc)" } else { puts stderr "+++TLS/$chan: verify/$depth: $c(subject)" } return $rc } callback proc info {chan state minor msg} { puts stderr "+++TLS/$chan $state $minor: $msg" } callback proc unknown {option args} { my showCall return -code error "bad option \"$option\": must be one of error, info, or verify" } vwait forever ./xotcl-1.6.8/apps/comm/._test-tls-server.xotcl000755 000765 000024 00000000430 12161600406 022065 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/test-tls-server.xotcl000755 000765 000024 00000004203 12161600406 021652 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: test-tls-server.xotcl,v 1.5 2006/09/27 08:12:39 neumann Exp $ # # sample secure server that reflect all incoming data to the client # It uses tls1.3 package of Matt Newman # Fredj Dridi package require tls proc bgerror {err} { global errorInfo puts stderr "BG Error: $errorInfo" } # # Sample callback - just reflect data back to client # proc reflectCB {chan {verbose 0}} { puts stderr "\n*** reflectCB $chan $verbose" fconfigure $chan -translation {auto crlf} set data {} if {[catch {set n [::gets $chan data]} msg]} { set error $msg puts stderr "\nEOF ($data)" catch {close $chan} return 0 } puts stderr n=<$n> if {$verbose && $data ne ""} { puts stderr "data=<$data>" } if {[eof $chan]} { ;# client gone or finished puts stderr "\nEOF" close $chan ;# release the servers client channel return } #puts -nonewline $chan $data #flush $chan } proc acceptCB { chan ip port } { puts stderr "\n*** acceptCB $chan $ip $port" tls::import $chan -cafile cacert.pem -certfile server.pem \ -server 1 -request 1 -require 1 -keyfile server.key -command callback if {![tls::handshake $chan]} { puts stderr "\nHandshake pending" return } array set cert [tls::status $chan] puts stderr "\n" parray cert fileevent $chan readable [list reflectCB $chan 1] } set chan [socket -server acceptCB 8443] puts stderr "Server waiting connection on $chan (8443)" ## Sample Callback that gives SSL information Object callback callback proc error {chan msg} { puts stderr "+++TLS/$chan: error: $msg" } callback proc verify {chan depth cert rc err} { array set c $cert if {$rc != "1"} { puts stderr "+++TLS/$chan: verify/$depth: ** Bad Cert **: $err (rc = $rc)" } else { puts stderr "+++TLS/$chan: verify/$depth: $c(subject)" } return $rc } callback proc info {chan state minor msg} { puts stderr "+++TLS/$chan $state $minor: $msg" } callback proc unknown {option args} { my showCall return -code error "bad option \"$option\": must be one of error, info, or verify" } # Go into the eventloop vwait forever ./xotcl-1.6.8/apps/comm/._webclient.xotcl000644 000765 000024 00000000430 12161600406 020753 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/webclient.xotcl000644 000765 000024 00000000425 12161600406 020542 0ustar00neumannstaff000000 000000 #!../../src/xotclsh package require XOTcl 1; namespace import -force xotcl::* @ @File {description {For a sample webclient, see packages/comm/xocomm.test}} package require xotcl::comm::httpAccess set hostport localhost:8086 SimpleRequest r0 -url http://$hostport/logo-100.jpg ./xotcl-1.6.8/apps/comm/._webserver.xotcl000644 000765 000024 00000000430 12161600406 021003 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/comm/webserver.xotcl000644 000765 000024 00000007415 12161600406 020600 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: webserver.xotcl,v 1.9 2007/08/14 16:38:26 neumann Exp $ array set opts {-root ../../doc -port 8086 -protected-port 9096 -pkgdir .} array set opts $argv lappend auto_path $opts(-pkgdir) #if {$::tcl_platform(platform) eq "windows"} {lappend auto_path .} package require XOTcl 1 1; namespace import -force xotcl::* proc ! string { set f [open [::xotcl::tmpdir]/log w+]; puts $f "[clock format [clock seconds]] $string" close $f } @ @File { description { This small demo program starts two different webservers:

To see, how it works, contact it e.g. from netscape. } } ! "#### webserver starting" # We load the following packages: # #::xotcl::package import ::xotcl::comm::httpd package require -exact xotcl::comm::httpd 1.1 ! "#### httpd required" # now we can start the web-server instance with these settings # Httpd h1 -port $opts(-port) -root $opts(-root) @ Httpd h1 {description "unprotected web server"} ! "#### h1 started" # specialized worker, which executes tcl commands in web pages @ Class SpecializedWorker { description { Specialized worker that can be passed to any webserver }} Class SpecializedWorker -superclass Httpd::Wrk @ SpecializedWorker instproc respond {} { description { This method handles all responses from the webserver to the client. We implent here "exit", and we return the information about the actual request and user in HTML format for all other requests.

This method is an example, how to access on the server side request specific infomation. }} SpecializedWorker instproc respond {} { if {[my set resourceName] eq "exit"} { set ::forever 1 #my showVars #my set version 1.0;### ???? #puts stderr HERE } # return for all other requests the same response foreach {a v} [my array get meta] { append m $a$v\n } set content {

Request Info

method:[my set method]
resource:[my set resourceName]
user:[my set user]
version:HTTP/[my set version]
response port:[my set port]
request comes from:[my set ipaddr]

Request Header Fields

$m
} set c [subst $content] my replyCode 200 my connection puts "Content-Type: text/html" my connection puts "Content-Length: [string length $c]\n" my connection puts-nonewline $c my close } @ Httpd h2 { description "Web server with basic authentication using the specialied worker"} if {[info exists env(USER)]} { set USER "$env(USER)" } elseif {[info exists env(USERNAME)]} { set USER "$env(USERNAME)" } else { set USER unknown } if {$::tcl_platform(platform) eq "windows"} { set USER unknown } Httpd h2 -port $opts(-protected-port) -root $opts(-root) \ -httpdWrk SpecializedWorker \ -mixin Httpd::BasicAccessControl \ -addRealmEntry test "u1 test $USER test" -protectDir test "" {} ! "#### h2 started" # # and finally call the event loop... # vwait forever ./xotcl-1.6.8/apps/._COPYRIGHT000644 000765 000024 00000000430 12327000526 016265 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/COPYRIGHT000644 000765 000024 00000003401 12327000526 016051 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/apps/persistence/._persistenceTest.xotcl000644 000765 000024 00000000430 12161600406 023554 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/persistence/persistenceTest.xotcl000644 000765 000024 00000002466 12161600406 023352 0ustar00neumannstaff000000 000000 #!../../src/xotclsh package require XOTcl 1; namespace import -force xotcl::* package require xotcl::store::persistence package require xotcl::mixinStrategy PersistenceMgr jufpMgr PersistenceMgr tclpMgr -dbPackage TclGdbm Class PersistenceTest -parameter {{countVar 0} {appendVar ""} pm} PersistenceTest instproc init args { my mixinStrategy Persistent=Eager my persistenceMgr [my set pm] my persistent {countVar appendVar} next } PersistenceTest instproc incrCount {} { puts "in [self] countVar now is [my countVar]" my incr countVar } PersistenceTest instproc appendV {x} { my append appendVar $x puts "append is: [my appendVar]" } PersistenceTest instproc test {} { # first we increment a counter: my incrCount # now we 5x append something to appendVar for {set i 0} {$i<5} {incr i} { my appendV a } # now we list all keys in the database puts "Variables stored in [my persistenceMgr].db: [[my persistenceMgr] names]" # now we delete append var puts "Deleting append:[[my persistenceMgr] delete [self]::appendVar]" # now we list the keys again puts "Variables stored in [my persistenceMgr].db: [[my persistenceMgr] names]" } PersistenceTest persistenceJufTest -pm jufpMgr -init -test #PersistenceTest persistenceTclTest -pm tclpMgr -init -test #PersistenceTest instproc count ./xotcl-1.6.8/apps/scripts/._adapter.xotcl000644 000765 000024 00000000430 12161600406 021153 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/adapter.xotcl000644 000765 000024 00000001304 12161600406 020737 0ustar00neumannstaff000000 000000 # $Id: adapter.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ Class Adapter -superclass Class @ @File { description { Simple adapter pattern meta-class taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. } } Adapter instproc adapterFilter args { set r [self calledproc] my instvar adaptee specificRequest if {[info exists specificRequest($r)]} { return [eval $adaptee $specificRequest($r) $args] } next } Adapter instproc init args { my instfilterappend adapterFilter next my instproc setRequest {r sr} { my set specificRequest($r) $sr } my instproc setAdaptee {a} { my set adaptee $a } } ./xotcl-1.6.8/apps/scripts/._adapterExample.xotcl000644 000765 000024 00000000430 12161600406 022467 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/adapterExample.xotcl000644 000765 000024 00000001353 12161600406 022257 0ustar00neumannstaff000000 000000 # $Id: adapterExample.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ # include the adapter pattern source adapter.xotcl @ @File { description { Simple adapter pattern example class (FTP requests) taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. } } Class FTPLIB FTPLIB instproc FTPLIB_connect args { puts "in ftplib connect" } Class Connection Connection instproc connect args { puts "in Connection connect" } Connection instproc discard args { puts "in Connection discard" } Adapter FTP -superclass Connection FTP instproc init args { FTPLIB ftpAdaptee my setRequest connect FTPLIB_connect my setAdaptee ftpAdaptee } FTP f f connect f discard ./xotcl-1.6.8/apps/scripts/._composite.xotcl000644 000765 000024 00000000430 12161600406 021535 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/composite.xotcl000644 000765 000024 00000002314 12161600406 021323 0ustar00neumannstaff000000 000000 #$Id: composite.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ Class Composite -superclass Class Composite metadata add description @ @File { description { Simple composite pattern meta-class taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. } } Composite instproc addOperations args { foreach op $args { if {![my exists operations($op)]} { my set operations($op) $op } } } Composite instproc removeOperations args { foreach op $args { if {![my exists operations($op)]} { my unset operations($op) } } } Composite instproc compositeFilter args { # get the operations class variable from the object's class set registrationclass [lindex [self filterreg] 0] $registrationclass instvar operations # get the request set r [self calledproc] puts ***compositeFilter--${r}--[self] # check if the request is a registered operation if {[info exists operations($r)]} { foreach object [my info children] { # forward request eval $object $r $args } } return [next] } Composite instproc init {args} { my array set operations {} next my instfilterappend compositeFilter } ./xotcl-1.6.8/apps/scripts/._compositeExample.xotcl000644 000765 000024 00000000430 12161600406 023051 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/compositeExample.xotcl000644 000765 000024 00000001766 12161600406 022651 0ustar00neumannstaff000000 000000 # $Id: compositeExample.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ # include the pattern source composite.xotcl Class Graphic @ @File { description { Simple Graphics example of the composite pattern taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. They demonstrate instfilters, filter chains and filter inheritance. } } Graphic instproc draw {} { puts "in--- draw SELF: [self] CLASS: [self class]" } Composite Picture -superclass Graphic Class Line -superclass Graphic Class Rectangle -superclass Graphic Picture addOperations draw #Picture removeOperations draw Picture aPicture Picture aPicture::bPicture Line aPicture::aLine Rectangle aPicture::aRect Line aPicture::bPicture::aLine Rectangle aPicture::bPicture::aRect Picture aPicture::bPicture::cPicture Picture aPicture::bPicture::dPicture Line aPicture::bPicture::cPicture::cLine # draw eines Composites puts "DRAW im Composite: aPicture" aPicture draw ./xotcl-1.6.8/apps/scripts/._observer.xotcl000644 000765 000024 00000000430 12161600406 021362 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/observer.xotcl000644 000765 000024 00000004245 12161600406 021155 0ustar00neumannstaff000000 000000 #$Id: observer.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ Class Observer -superclass Class Observer metadata add description @ @File { description { Simple observer pattern meta-class taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. } } Class Observer::Subject -superclass Class Observer::Subject instproc notificationFilter {args} { set procName [self calledproc] my instvar preObservers postObservers if {[info exists preObservers($procName)]} { foreach obj $preObservers($procName) { $obj update [self] $args } } set result [next] if {[info exists postObservers($procName)]} { foreach obj $postObservers($procName) { $obj update [self] $args } } return $result } Class Observer::SubjectMgt Observer::SubjectMgt instproc attach {hook objs} { upvar $hook observers foreach obj $objs { if {![info exists observers] || [lsearch $observers $obj] == -1} { lappend observers $obj } } } Observer::SubjectMgt instproc detach {hook objs} { upvar $hook observers if {[info exists observers]} { foreach obj $objs { set p [lsearch $observers $obj] set observers [lreplace $observers $p $p] } } } Observer::SubjectMgt instproc attachPre {procName args} { my instvar preObservers my attach preObservers($procName) $args } Observer::SubjectMgt instproc attachPost {procName args} { my instvar postObservers my attach postObservers($procName) $args } Observer::SubjectMgt instproc detachPre {procName args} { my instvar preObservers my detach preObservers($procName) $args } Observer::SubjectMgt instproc detachPost {procName args} { my instvar postObservers my detach postObservers($procName) $args } Observer::Subject instproc init args { next my superclass [list Observer::SubjectMgt [my info superclass]] my instfilter notificationFilter } Observer instproc timeout t { my set timeout $t } Observer instproc update {subject args} { #addTimeOut [my set timeout] "[self] update $subject $args" #$subject getResponse # do something with the response puts [self]---update } Observer instproc init args { next } ./xotcl-1.6.8/apps/scripts/._parameter.xotcl000644 000765 000024 00000000430 12161600406 021513 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/parameter.xotcl000644 000765 000024 00000012005 12161600406 021277 0ustar00neumannstaff000000 000000 # -*- Tcl -*- ### Sample file for parameter testing.... ### For every class "-parameter" can be specified which accepts ### a list of parameter specifications. ### ### * If a parameter specification consists of a single word, ### the word is considered as the parameter name and ### a standard setter/getter method with this name is created. ### ### * If the parameter specification consists of two words, the ### second word is treated as the default value, which is stored ### in the class object. ### ### * If a default value exists in the class object, a ### corresponding instance variable with the name of the ### parameter is created automatically during initialization ### of the object. ### ### * If the parameter specification consists of more than two words, ### various parameter methods (starting with "-") with arguments ### can be specified. In the following example ### Class C -parameter {{a 1} {b -default 1}} ### C c1 ### both a and b receive 1 as default value. ### ### * In order to call the standard getter method use the method ### with the name of the parameter with one parameter. For example, ### in order to call the standard getter for parameter a, use ### puts [c1 a] ### In order to use the standard setter for b, use the method with ### two parameters. ### c1 b 123 ### ### * There are two ways to specify custom setter/getter methods for ### parameters: (a) the custom setter/getter can be defined within the ### class hierarchy of the object, or (b) the custom getter/setter can ### be specified on a different object. The custom setter/getter ### method are called, from the standard setter/getter methods ### automatically if specified. ### * In order to use approach (a) the parameter methods -getter ### and -setter can be used to specify the custom getter and ### and setter methods: ### Class D -parameter {{a -setter myset -getter myget}} ### The methods myset and myget are called like set with ### one or two arguments. They are responsible for setting and ### retrieving the appropiate values. It is possible to ### specify any one of these parameter methods. ### * In order to use approach (b) a parameter methods -access ### is use to specify an object responsible for setting/getting ### these values. This has the advantage that the custom getter and ### setter methods can be inherited from a separate class hierarchy, ### such they can used for any object without cluttering its ### interface. ### * In order to keep the parameter specification short the access ### object my contain instance variables setter or getter, naming the ### setter/getter methods. If these instance variables are not ### in the access object, "set" is used per default for getter and ### setter. These default values can be still overridden by the ### parameter methods -setter or -getter. ### * If the access object is specified, ### are passed to the setter method and are passed ### to the custom getter method (in approach (a) the object is ### is not needed). Object different different set setter myset different set getter myget different proc myset {o var value} { $o set $var $value } different proc myget {o var} { $o set $var } Object print print proc set {o args} { ::set var [lindex $args 0] if {[llength $args]==1} { puts "*** $o get $var" $o set $var } else { ::set value [lindex $args 1] puts "*** $o set $var $value" $o set $var $value } } print proc myset {o var value} { puts "*** $o myset $var $value" $o set $var $value } Class P P instproc set {o args} { puts stderr "instance [self] of parameter class P called for $o $args" if {[llength $args] == 1} { $o set [lindex $args 0] } else { $o set [lindex $args 0] [lindex $args 1] } } P p Class M M instproc mset args { puts stderr "Mixin [self class] called for [self] $args" if {[llength $args] == 1} { my set [lindex $args 0] } else { my set [lindex $args 0] [lindex $args 1] } } set x different Class C -parameter { {c [self]} d {e ""} {f -default 123 -setter setf -getter getf} {g -default 1000 -access print} {h -default 1001 -access print -setter myset} {i -default 1002 -access different} {j -default $x -access ::p} {k {[self class]}} {l -default {[self class]} } } C parameter [list [list z -access [P new -childof C] -default zzz]] C instmixin M C parameter {{x -default 333 -setter mset -getter mset}} puts stderr +++[C info parameter] C instproc setf {var val} { puts stderr "... setting $var to $val" my set $var $val } C instproc getf var { puts stderr "... getting value of $var" my set $var } #puts stderr "body of f: [C info instbody f]" puts stderr "body of x: [C info instbody x]" puts ======================create C c1 -f 133 -g 101 -h 102 -i 103 puts ======================readvars foreach v [lsort [c1 info vars]] { puts "$v = <[c1 $v]>" } puts "instances of P: [P info instances]" puts "instances of C: [C info instances]" ./xotcl-1.6.8/apps/scripts/._pinger.xotcl000644 000765 000024 00000000430 12161600406 021017 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/pinger.xotcl000644 000765 000024 00000003175 12161600406 020613 0ustar00neumannstaff000000 000000 #$Id: pinger.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ # include the pattern source observer.xotcl Class Pinger @ @File { description { Pinger example for the observer pattern taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. It demonstrates how to observe a network connection. } } Observer::Subject Pinger::Collector -parameter {hostName {update 1}} Observer Pinger::Diagram Observer Pinger::TextOutput Pinger::Collector instproc init args { my instvar update hostName set f [open "| ping -i $update $hostName" r] fconfigure $f -blocking false fileevent $f readable "[self] ping \[gets $f\]" } Pinger::Collector instproc getResponse {} { puts "in--- [self] [format %-12s [self proc]] ([self class])" } Pinger::Collector instproc ping {string} { puts "in--- [self] [format %-12s [self proc]] ([self class])" puts $string } Pinger::Diagram instproc update {subject args} { puts "in--- [self] [format %-12s [self proc]] ([self class]) -- SUBJECT: $subject" $subject getResponse # do something with the response } Pinger::TextOutput instproc update {subject args} { puts "in--- [self] [format %-12s [self proc]] ([self class]) -- SUBJECT: $subject" $subject getResponse # do something with the response } namespace eval ::Pinger { Collector ::c1 -hostName 132.252.180.231 Collector ::c2 -hostName 137.208.7.48 Diagram ::d1 Diagram ::d2 Diagram ::d3 TextOutput ::t1 } c1 attachPre ping d1 d2 c1 attachPost ping d2 d3 c1 attachPost ping t1 c2 attachPost ping t1 d2 #c1 detachPre ping d1 #c1 detachPost ping d2 d3 vwait forever ./xotcl-1.6.8/apps/scripts/._simpleFilters.xotcl000644 000765 000024 00000000430 12161600406 022355 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/simpleFilters.xotcl000644 000765 000024 00000002343 12161600406 022145 0ustar00neumannstaff000000 000000 # $Id: simpleFilters.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ @ @File { description { Some simple examples of (inst)filters taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. They demonstrate filters, filter chains and filter inheritance. } } Class A A instproc Filter-1 args { puts " pre-part of [self proc]" ;# pre part next ;# next call puts " post-part of [self proc]" ;# post part } A instproc printSomething args { puts " actual called proc: [self proc]" } A a1 A instfilter Filter-1 #a1 set x 1 puts "A call surrounded by pre/post messages:" a1 printSomething A instfilter {} A instproc Filter-2 args { puts " only a pre-part in [self proc]" next } A instproc Filter-3 args { next puts " only a post-part in [self proc]" } A instfilter {Filter-1 Filter-2 Filter-3} puts "Now a filter chain:" a1 printSomething A instfilter {} Class B -superclass A B instproc Filter-B args { puts " entering method: [self proc]" next } B b1; B b2 A instfilter {Filter-1 Filter-2 Filter-3} B instfilter Filter-B puts "And finally inheritance:" b1 printSomething B instfilter {} A instfilter {} ./xotcl-1.6.8/apps/scripts/._soccerClub.xotcl000644 000765 000024 00000000430 12161600406 021617 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/scripts/soccerClub.xotcl000644 000765 000024 00000017700 12161600406 021412 0ustar00neumannstaff000000 000000 # $Id: soccerClub.xotcl,v 1.7 2007/08/14 16:38:26 neumann Exp $ # This is a simple introductory example for the language XOTcl. # It demonstrates the basic language constructs on the example of # a soccer club. package require XOTcl 1; namespace import -force xotcl::* # All the characters in this example are fictitious, and any # resemblance to actual persons, living or deceased, is coincidental. # In XOTcl we do not have to provide the above file description # as a comment, but we can use the @ object, which is used generally # to provide any kind of information, metadata, and documentation on # a running program. Here, we just give a file description. # Now makeDoc.xotcl will automatically document this file for us. @ @File { description { This is a simple introductory example for the language XOTcl. It demonstrates the basic language constructs on the example of a soccer club. } } # # All things and entities in XOTcl are objects, a special kind of objects # are classes. These define common properties for other objects. For a # soccer club, we firstly require a common class for all kinds of members. # # Common to all members is that they have a name. Common properties defined # across all instances of a class are called "Parameters" in XOTcl. # Class ClubMember -parameter {{name ""}} # A special club member is a Player. Derived classes can be build with # inheritance (specified through 'superclass'). Players may have a # playerRole (defaults to NONE): Class Player -superclass ClubMember -parameter {{playerRole NONE}} # other club member types are trainers, player-trainers, and presidents Class Trainer -superclass ClubMember Class President -superclass ClubMember # the PlayerTrainer uses multiple inheritance by being both a player # and a trainer Class PlayerTrainer -superclass {Player Trainer} # # Now we define the SoccerTeam class. # Class SoccerTeam -parameter {name location type} # We may add a player. This is done by a method. Instance methods are # in XOTcl defined with 'instproc'. All club members are aggregated in # the team (denoted by :: namespace syntax). SoccerTeam instproc newPlayer args { # we use a unique autoname for the object to prevent name # collisions, like ::player01, ::player02, ... eval Player [self]::[my autoname player%02d] $args } # A player can be transfered to another team. The player object does # not change internally (e.g. the playerRole stays the same). Therefore we # 'move' it to the destination team. SoccerTeam instproc transferPlayer {playername destinationTeam} { # We use the aggregation introspection option 'children' in order # to get all club members foreach player [my info children] { # But we only remove matching playernames of type "Player". We do # not want to remove another club member type who has the same # name. if {[$player istype Player] && [$player name] == $playername} { # We simply 'move' the player object to the destination team. # Again we use a unique autoname in the new scope $player move [set destinationTeam]::[$destinationTeam autoname player%02d] } } } # Finally we define two convenience methods to print the members/players to # stdout with puts. SoccerTeam instproc printMembers {} { puts "Members of [my name]:" foreach m [my info children] {puts " [$m name]"} } SoccerTeam instproc printPlayers {} { puts "Players of [my name]:" foreach m [my info children] { if {[$m istype Player]} {puts " [$m name]"} } } # Now let us build to example soccer team objects. SoccerTeam lyon -name "Olympique Lyon" -location "Lyon" SoccerTeam bayernMunich -name "F.C. Bayern München" -location "Munich" # With 'addPlayer' we can create new aggregated player objects # # Let us start some years in the past, when "Franz Beckenbauer" was # still a player. set fb [bayernMunich newPlayer -name "Franz Beckenbauer" \ -playerRole PLAYER] # 'playerRole' may not take any value. It may either be NONE, PLAYER, # or GOALY ... such rules may be given as assertions (here: an instinvar # gives an invariant covering all instances of a class). In XOTcl # the rules are syntactically identical to 'if' statements Player instinvar { {[my set playerRole] eq "NONE" || [my set playerRole] eq "PLAYER" || [my set playerRole] eq "GOALY"} } # If we break the invariant and turn assertions checking on, we should # get an error message: $fb check all if {[catch {$fb set playerRole SINGER} errMsg]} { puts "CAUGHT EXCEPTION: playerRole has either to be NONE, PLAYER, or TRAINER" # turn assertion checking off again and reset to PLAYER $fb check {} $fb set playerRole PLAYER } # But soccer players may play quite different, orthogonal # roles. E.g. Franz Beckenbauer was also a singer (a remarkably bad # one). However, we can not simply add such orthogonal, extrinsic # extensions with multiple inheritance or delegation. Otherwise we # would have either to build a lot of unnecessary helper classes, like # PlayerSinger, PlayerTrainerSinger, etc., or we would have to build # such helper objects. This either leads to an unwanted combinatorial # explosion of class or object number. # # Here we can use a per-object mixin, which is a language construct # that expresses that a class is used as a role or as an extrinsic # extension to an object. # First we just define the Singer class. Class Singer Singer instproc sing text { puts "[my name] sings: $text, lala." } # Now we register this class as a per-object mixin on the player object: $fb mixin Singer # And now Franz Beckenbauer is able to sing: $fb sing "lali" # But Franz Beckenbauer has already retired. When a player retires, we # have an intrinsic change of the classification. He *is* not a player # anymore. But still he has the same name, is club member, and # is a singer (brrrrrr). # Before we perform the class change, we extend the Player class to # support it. I.e. the playerRole is not valid after class change # anymore (we unset the instance variable). Player instproc class args { my unset playerRole next } # Now we can re-class the player object to its new class (now Franz # Beckenbauer is President of Bayern Munich. $fb class President # Check that the playerRole isn't there anymore. if {[catch {$fb set playerRole} errMsg]} { puts "CAUGHT EXCEPTION: The player role doesn't exist anymore (as it should be after the class change)" } # But still Franz Beckenbauer can entertain us with what he believes # is singing: $fb sing "lali" # Now we define some new players for Bayern Munich: bayernMunich newPlayer -name "Oliver Kahn" -playerRole GOALY bayernMunich newPlayer -name "Giovanne Elber" -playerRole PLAYER # if we enlist the players of Munich Franz Beckenbauer is not enlisted # anymore: bayernMunich printPlayers # But as a president he still appears in the list of members: bayernMunich printMembers # Now consider an orthonogal extension of a transfer list. Every # transfer in the system should be notified. But since the transfer # list is orthogonal to SoccerTeams we do not want to interfere with # the existing implementation at all. Moreover, the targeted kind of # extension has also to work on all subclasses of SoccerTeam. Firstly, we # just create the extension as an ordinary class: Class TransferObserver TransferObserver instproc transferPlayer {pname destinationTeam} { puts "Player '$pname' is transfered to Team '[$destinationTeam name]'" next } # Now we can apply the class as a per-class mixin, which functions # exactly like a per-object mixin, but on all instances of a class and # its subclasses. The 'next' primitive ensures that the original # method on 'SoccerTeam' is called after notifying the transfer (with # puts to stdout) SoccerTeam instmixin TransferObserver # If we perform a transfer of one of the players, he is moved to the new # club and the transfer is reported to the stdout: bayernMunich transferPlayer "Giovanne Elber" lyon # Finally we verify the transfer by printing the players: lyon printPlayers bayernMunich printPlayers ./xotcl-1.6.8/apps/utils/._xo-daemon000755 000765 000024 00000000430 12161600406 017746 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/utils/xo-daemon000755 000765 000024 00000012215 12161600406 017535 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh package require XOTcl 1; namespace import -force xotcl::* @ @File { description { This script can be used to start/stop/restart xotcl daemons and maintains the process IDs, log files and means for easy restart. <@p> It receives as first parameter the name of the xotcl script to be executed followed by the desired action and optional parameters. The specified action can be <@UL> <@LI> <@EM>start: the specified script is started in the background, an entry to restart is generated in the run-directory as well as the process id of the started script. In addition a logfile is created in the log directory. If the start of the script fails, the error messages are shown. <@LI> <@EM>startall: all scripts that were started before via this script, are started <@LI> <@EM>stop terminates te specified script. <@LI> <@EM>stopall terminates all scripts started via this command <@LI> <@EM>restart tries to restart the specified script. The optional parameters are: <@UL> <@LI> <@EM>-logir specifies the directory for logging. The default is ~/.xotcl/log. <@LI> <@EM>-rundir specifies the directory where the information about the running processes is kept. The default is ~/.xotcl/run. } authors { Gustaf Neumann, Gustaf.Neumann@wu-wien.ac.at } date "[::xotcl::rcs date {$Date: 2006/02/18 22:17:32 $}]" } array set opt [list \ -rundir $::xotcl::confdir/run \ -logdir $::xotcl::confdir/log \ ] if {$argc < 2} { puts "Usage:\n\t$argv0 \ ?options?\nOptions:\n\ \t-logdir dirname (default: $::opt(-logdir))\n\ \t-rundir dirname (default: $::opt(-rundir))\n" exit -1 } foreach {daemon action} $argv break array set opt [lreplace $argv 0 1] # The daemon scripts should be # - location independent (if the script assumes to be started from # a certain directory, it should cd to it) # - parameter less (required for restart, startall, etc.) # # configuration set ::kill /bin/kill set ::ps /bin/ps set ::ln /bin/ln set ::sleep /bin/sleep set ::xotclsh /usr/bin/xotclsh Class Daemon -parameter progname Daemon instproc readfile {n} { set f [open $n r] set c [read $f] close $f return [string trim $c \n] } Daemon instproc init {} { if {![file isdirectory $::opt(-rundir)]} {file mkdir $::opt(-rundir)} if {![file isdirectory $::opt(-logdir)]} {file mkdir $::opt(-logdir)} } Daemon instproc progname name { set n [file tail $name] set n [file rootname $n] [self] set pidfile $::opt(-rundir)/$n.pid [self] set logfile $::opt(-logdir)/$n.log [self] set shortname $n [self] set progname $name } Daemon instproc report string { puts stderr "[[self] set shortname]: $string" } Daemon instproc running pid { set r [catch {exec $::ps -h $pid} msg] #if {$r} { [self] report "msg=$msg" } #[self] report "running returns $r" return [expr {!$r}] } Daemon instproc kill {sig pid} { #[self] report "kill $sig $pid" exec $::kill $sig $pid } Daemon instproc start {} { [self] instvar pidfile logfile progname if {[file exists $pidfile]} { set pid [[self] readfile $pidfile] [self] report "seems already running $pid" if {[[self] running $pid]} { [self] report "... no need to restart" return } else { [self] report "... but disappeared $pid" } } set linkname $::opt(-rundir)/[file tail $progname] if {[string match *~* $linkname]} { # file dirname ~ -> requires env(HOME) regsub ^~ $linkname [file dirname ~]/$::env(USER) linkname } if {$progname != $linkname} { #puts stderr "exec $::ln -sf $progname $linkname" exec $::ln -sf $progname $linkname } set pid [exec $::xotclsh $progname >>& $logfile &] set F [open $pidfile w] puts $F $pid close $F exec sleep 1 if {![[self] running $pid]} { [self] report "start of $pid failed" set size [file size $logfile] set F [open $logfile] if {$size > 500} {seek $F [expr {$size-500}]} puts [read $F] close $F } else { [self] report "started $pid" } } Daemon instproc stop {} { [self] instvar pidfile logfile if {[file exists $pidfile]} { set pid [[self] readfile $pidfile] #[self] report "Got PID $pid" if {[[self] running $pid]} { [self] report "stopping $pid" [self] kill -KILL $pid #if {[running $pid]} {kill -KILL $pid} } else { [self] report "not running $pid" } file delete $pidfile } else { [self] report "was not started before" } } Daemon instproc restart {} { [self] stop [self] start } Daemon instproc stopall {} { foreach pidfile [glob -nocomplain $::opt(-rundir)/*.PID] { set n [file rootname [file tail $pidfile]] [self] configure -progname $n -stop } } Daemon instproc startall {} { foreach file [glob -nocomplain $::opt(-rundir)/*] { if {[string match *.PID $file]} continue [self] configure -progname $file -start } } Daemon d -init -progname $daemon -$action ./xotcl-1.6.8/apps/utils/._xo-whichPkg000755 000765 000024 00000000430 12161600406 020247 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/utils/xo-whichPkg000755 000765 000024 00000001163 12161600406 020036 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh # $Id: xo-whichPkg,v 1.2 2006/02/18 22:17:32 neumann Exp $ package require XOTcl 1; namespace import -force xotcl::* @ @File { description { A small sample script to show which package is loaded from where when a target package is loaded. <@p> Usage: "xo-whichPkg -pkg PACKAGENAME" } authors { Fredj Dridi dridi@nestroy.wi-inf.uni-essen.de } date "[::xotcl::rcs date {$Date: 2006/02/18 22:17:32 $}]" } array set opts { -pkg xotcl::comm::httpd } array set opts $argv package require xotcl::package package verbose 1 puts stderr [package require $opts(-pkg)] ./xotcl-1.6.8/apps/utils/._xotclsh.in000644 000765 000024 00000000430 12161600406 020145 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/utils/xotclsh.in000644 000765 000024 00000000537 12161600406 017740 0ustar00neumannstaff000000 000000 #!@TCLSH_PROG@ if {$argc == 0} { puts "Don't use [info script] as interactive shell! Use instead:" puts " @TCLSH_PROG@" puts " package require XOTcl 1; namespace import ::xotcl::*" } else { package require XOTcl 1 namespace import ::xotcl::* set argv0 [lindex $argv 0] set argv [lreplace $argv 0 0] incr argc -1 source $argv0 } ./xotcl-1.6.8/apps/utils/._xowish.in000644 000765 000024 00000000430 12161600406 020002 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/utils/xowish.in000644 000765 000024 00000000646 12161600406 017576 0ustar00neumannstaff000000 000000 #!@WISH_PROG@ ###!@TCLSH_PROG@ ###package require Tk if {$argc == 0} { puts "Don't use [info script] as interactive shell! Use instead:" puts " @WISH_PROG@" puts " package require XOTcl 1 1; namespace import ::xotcl::*" exit } else { package require XOTcl 1 namespace import ::xotcl::* set argv0 [lindex $argv 0] set argv [lreplace $argv 0 0] incr argc -1 source $argv0 } ###catch {vwait forever} ./xotcl-1.6.8/apps/xml/._rdfExample.xotcl000755 000765 000024 00000000430 12161600406 020736 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/xml/rdfExample.xotcl000755 000765 000024 00000004064 12161600406 020530 0ustar00neumannstaff000000 000000 #!/usr/bin/env tclsh # $Id: rdfExample.xotcl,v 1.2 2006/02/18 22:17:33 neumann Exp $ # # small Example for usage of xoXML # package require XOTcl 1; namespace import -force xotcl::* package require xotcl::package package require xotcl::trace package require xotcl::rdf::parser package require xotcl::rdf::recreatorVisitor package require xotcl::xml::printVisitor # # instantiate parser and parser an example text into a node tree # RDFParser x x parse { Mary Andrew Jacky Crystal The Coolest Web Page Il Pagio di Web Fuba some text } proc run {} { # # print the node treee to the std output # puts ************************************************************************ puts "Node Tree:" puts ************************************************************************ PrintVisitor pv foreach tn [x info children topNode*] { pv interpretNodeTree $tn } # # recreate xml text and print it to the std output # puts \n puts ************************************************************************ puts "Recreated RDF Text:" puts ************************************************************************ RDFRecreatorVisitor rv foreach tn [x info children topNode*] { set result [rv interpretNodeTree $tn] puts $result } } run ./xotcl-1.6.8/apps/xml/._xmlExample.xotcl000755 000765 000024 00000000430 12161600406 020763 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/apps/xml/xmlExample.xotcl000755 000765 000024 00000005677 12161600406 020570 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # # small Example for usage of xoXML package require xotcl::package package require xotcl::trace package require xotcl::xml::parser package require xotcl::xml::recreatorVisitor package require xotcl::xml::printVisitor # # instantiate parser and parser an example text into a node tree # XMLParser x #x parse { # x parse { a b c b c a b c b d Mary Andrew Jacky Crystal The Coolest Web Page Il Pagio di Web Fuba some text } proc run {} { # # print the node treee to the std output # puts ************************************************************************ puts "Node Tree:" puts ************************************************************************ PrintVisitor pv pv interpretAll x # # recreate xml text and print it to the std output # puts \n puts ************************************************************************ puts "Recreated XML Text:" puts ************************************************************************ XMLRecreatorVisitor rv puts [rv interpretAll x] } run XMLParser y y parse { olla hallo } XMLRecreatorVisitor rv puts [rv interpretAll y] ./xotcl-1.6.8/._autoclean.sh000644 000765 000024 00000000430 12161600305 016333 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/autoclean.sh000644 000765 000024 00000000145 12161600305 016121 0ustar00neumannstaff000000 000000 #!/bin/sh make distclean for configscript in `find . -name configure` do rm -f $configscript done./xotcl-1.6.8/._autogen.sh000644 000765 000024 00000000430 12161600305 016022 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/autogen.sh000644 000765 000024 00000000134 12161600305 015606 0ustar00neumannstaff000000 000000 #!/bin/sh for pdir in `find . -name configure.in` do (cd `dirname $pdir`; autoconf) done ./xotcl-1.6.8/._ChangeLog000644 000765 000024 00000000430 12327773256 015622 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/ChangeLog000644 000765 000024 00000503274 12327773256 015423 0ustar00neumannstaff000000 000000 2014-04-29 * Release of XOTcl 1.6.8 2014-04-29 * some more cleanup of autoconf (more quoting, remove obsolete file, use recent install-sh) * try to stick closer to current tcl conventions 2014-04-29 * unix/tclAppInit.c: Fix one more compiler warning: undeclared Xotcl_Init() * Removing configure artifact, otherwise lintian complains * Makefile.in: LDFLAGS must be referenced differently under TEA * fixed "make install" problem, fix build problem for xowish 2014-04-28 * library/xml/TclExpat-1.1/xmltok_impl.c: fix for CVE-2009-3720 2014-04-25 * follow modern autoconf conventions * configure.a: use TEA 3.9 * use new tcl.m4 * Makefile.in: remove hard-coded "-rdynamic" from build of xotclsh and xowish * generic/xotclTrace.c: remove obsolete test 2014-04-24 * Makefile.in: Make sure that xotclsh + xowish are explicitly linked against libtclstub*.so, rather than libtcl*.so. Otherwise, building with --with-xotclsh + --with-xowish fails starting with 8.6 (which effectively hides the various stub structures in libtcl*.so). * AppInit.c: Use the stubbed variant of Tcl_Init(). * Tested under 8.6 (fossil trunk as of commit date) and 8.5 (fossil core-8-5-branch as of commit date). Thanks to Sergei Golovan (Debian Tcl/Tk Package Maintainers) for reporting the issue and an initial patch (see Debian bug #724816). 2013-07-16 * library/actiweb/HttpPlace.xotcl: add URL query variables as arguments 2013-06-23 * make version management simpler and freeze XOTcl 1.* versions In order to avoid bad interactions between XOTcl 1.0 and XOTcl 2.0 the version dependency in 1.0 where changed to "package require -exact ... 1.0" where possible, and the provides where upgraded to 1.0 in most cases * make sure that packages from XOTcl 1 require XOTcl 1 * generic/xotcl.c: code cleanup 2013-03-26 * doc/langRef.xotcl: update documentation 2012-10-13 * Make sure to NS_EXPORT Ns_ModuleVersion for people using still the old-style aolserver module. 2012-01-16 * xotcl.c Extend backport of handling of dashes in XOTcl's configure method to perform a more eager search for command begins. Extended regression test 2012-01-14 * xotcl.c Don't overwrite error messages from __unknown handler in several situations (superclass, parameter class, mixin class) 2012-01-12 * xotcl.c Backport from nsf: when processing arguments with leading dashes in "configure", accept only method names without spaces. This solves a problem with Tcl8.4 + ns_eval where the output of the serializer could not be processed by eval (a [list ..] was lost). 2011-12-22 * Httpd: force GMT dates as required by RFC 2011-11-12 * Removed obsolete CVS-$Ids * Updated dates of Copyrights * Removed unneeded c++ hints for Emacs 2011-11-02 * Release of XOTcl 1.6.7 2011-11-01 * xotcl.c: some c-cleanup * library files: require exact version numbers to avoid conflicts with XOTcl 2.0 2011-08-07 * backport of autoname fix from nsf 2011-04-28 * serializer: fix allChildren to handle names with semicolons * serializer: fix allInstances to handle names with semicolons 2011-02-09 * Backport of nsf to handle partial implicit deletes 2011-01-20 * Change backport of fix below to a check of numEntries 2011-01-20 * Backport of fix for nsf : fixed a nasty bug within namespace deletion, when a deletion of one tcl cmd caused implicit deletions of other cmds in the same namespace. The classical idiom for looking over hash tables with Tcl_GetHashValue() and Tcl_NextHashEntry(hSrch) can lead to crashes (and has different behavior depending on the number of buckets). This fix handles complete implicit deletes. 2010-12-26 * Make cppcheck happy 2010-08-29 * Fixed bug in filters reported by Kristoffer Lawson. When a filter chain reaches its end without finding the invoked method, the unknown state was not resetted correctly and affected method invocations in the filter after "next". 2009-11-13 * Release of XOTcl 1.6.6 2010-04-01 * make sure, Tcl var traces are not called twice for volatile objects * fix for info: make sure, value is always initialized 2010-03-27 * avoid cyclic dependencies with namespace imported command during final cleanup 2010-03-26 * fixed 64bit problem in expat code * fixed memory leaks in info methods and forward (error case) 2010-03-22 * clean up compilation when compile with assertions turned on * make sure to use xotcl 1.* when regression testing xotcl 1.* 2010-03-06 * use installed expat when specified This option is needed fro Debian packaging rules. (Many thanks to Stefan Sobernig for this contribution) * cleanup of redundant section in configure.in * update to TEA 3.7 2010-02-09 * provide compatibility with 8.6b1 * bumped version number to 1.6.6 2010-12-29 * fix example in tutorial 2009-11-13 * Release of XOTcl 1.6.5 2009-11-06 * applied per-object slot changes from Stefan Sobernig * extended regression tests * fix package resolution, if multiple XOTcl versions are installed 2009-11-02 * fixed namespace visibility problem reported by Mykhaylo Sorochan 2009-10-24 * fixed var resolver/memory leak problem reported by Victor Mayevski * bumped version number to 1.6.5 2009-10-17 * clean removal of __trace__ method in serializer * Some documentation fixes, added stack example to documentation * Bumped version number to 1.6.4 * Release of XOTcl 1.6.4 2009-06-19 - minor variable renaming to follow tcl naming conventions more closely 2009-06-14 - fixed potential access to deleted command list item in FilterSearchAgain() - fixed potential access deleted xotcl object by switching order in a condition - some minor cleanup for configuration flags 2009-03-19 * Release of XOTcl 1.6.3 2009-03-19 - removed references to 1.6.2 2009-03-04 - re-enable small optimization - factor out common code - fix compatibility with Tcl 8.4 - bump version number to 1.6.3 2009-03-03 - simplify semantics of MixinSeekCurrent and FilterSeekCurrent, improve speed - remove necessity to have tclCompile.h - improve documentation 2009-03-02 - some small performance improvements (use CreateHashEntry instead of FindHashEntry, remove unneeded argument, improve order of long and expressions) - some code cleanup - new methods, when compiled with tcl 8.5; + MakeProcError (producing error messages from xotcl methods) + PushProcCallFrame (compile method to byte-code) The new support allows to call code at the begin of a proc without using the old approach based on :xotcl::initProcNS 2009-02-19 - add comments to var resolution tests for objects without namespaces - fixed reference counting - removed temporary hacks - added CONST to several functions - added relative namespace handling 2009-02-18 , sobernig@wu-wien.ac.at - added Stefan's work for namespace resolvers - fixed a memory leak for "obj exists" due to the changes - found another memory leak, when e.g. "::info" is added as an alias and "info exists" is tested against non-existing vars 2009-01-19 - Finish work on deletion of user-metaclasses - commenting existing and potential usage of namespace resolvers 2008-12-01 * Correct deletion of user-metaclasses: Deletion of user-metaclasses could lead to undestroyable objects, since the instances of the user-metaclasses were reclassed to ::xotcl::Object instead of ::xotcl::Class. * extend regression test for such situations 2008-11-02 * Release of XOTcl 1.6.2 2008-11-01 * added command ::xotcl::finalize This command has the only purpose to delete all objects and classes of an interpreter in a multi-threaded environment at a safe time. Background: when XOTcl is used in a threaded environment such as for example in AOLserver, one has to take care that the deletion of objects and classes happens in a safe environment, where the XOTcl destructors (destroy methods) are still able to run. Without ::xotcl::finalize the deletion happens in Tcl_FinalizeThread(), after thread cleanup (where e.g. the thread local storage is freed). This can lead to memory leaks in AOLserver, which allocates e.g. some structures on demand, but since this happens after cleanup, it will leak. A simple ns_log in a destructor might lead to this problem. The solution is to call ::xotcl::finalize in the "delete trace" in AOLserver (as it happens in OpenACS). Note, that ::xotcl::finalize is not intended for application programs. * some code cleanup 2008-10-17 * handle nonposargs in method "copy" properly * extend regression test for copy * added " mixinof -closure ?pattern?" Query the objects for which is used as a per-object-mixin (directly or indirectly) * extended regression test for mixinof * updated documentation 2008-09-11 * Implement proper downgrading of Classes to Objects: In cases where a class ::C is created, which is later downgraded to an object ::C (either via "::C class ::xotcl::Object" or via "::xotcl::Object ::C"), earlier versions of XOTcl were to liberal. The major problem is to invalidate all places, where ::C might be used as a class, and were only classes are allowed (e.g. mixin chains, precedence orders). The new version does not allow downgrading via the class method and does a destroy/create instead of a recreate when a same-named class existed before. * reset mixin order for per-object mixins, when the superclass of a class is deleted, which is used as per-object mixin * extended regression test * Updating and improving documentation 2008-06-24 * Release of XOTcl 1.6.1 2008-06-23 * remove pattern argument from "info class" * additional argument for "info precedence": "-intrinsic" Syntax: info precedence ?-intrinsic? ?pattern? If "-intrinsic" is specified, only the classes of the superclass type hierarchy are returned. Otherwise, the precedence contains mixin classes as well. * Check results for guards to be boolean instead of int (now, guards are allowed to return e.g. "true") 2008-05-30 * updating language reference * Fix contents for %proc in forwarders in cases, where the forwarder was called via next and the argument list for next was provided. Previously, "next" was used for %proc. 2008-05-28 * make "info (inst)?forward -definition name" more robust (provide an error message, if is not given * New info subcommands "info parametercmd" and "info instparametercmd" * export *parametercmds in Serializer, use "-noinit" on slots as well 2008-05-26 * fixed bug in info instdefault, when the given argument name is an empty string. Example: X info instdefault crash "" var 2008-05-09 * used catch in the deprecated package xotcl::upvar-compat as suggested by Jeff Hobbs 2008-03-18 * allowed "abstract method" in addition to "abstract instproc" and "abstract proc" 2008-02-26 * xotcl.c: The double ;; chokes MSVC6 in the next line. (many thanks for Andreas Kupries for reporting) 2008-02-25 * Fix for "x configure -set"; many thanks to Rene Zamseil for reporting. 2008-02-24 * Release of XOTcl 1.6.0 2008-02-22: * Update of documentation 2008-02-21: * Clear XOTCL_MIXIN_ORDER_VALID flag unconditionally in MixinInvalidateObjOrders() for mixins (Neophytos had problems in naviserver; many thanks for reporting!) 2008-02-21: * Replaced Tcl_ObjSetVar2() with Tcl_SetVar2Ex() in nonposargs, since Tcl 8.5 seemed to optimize local variables away, if these not referenced directly from from Tcl. Tcl 8.5 seems to optimize proc-local variables away, which are not directly referenced by the Tcl proc body. In the following example, "ot" is set from C (via nonposargs, previously via Tcl_ObjSetVar2()) and consumed via C (from the db-driver, using :ot). SomeClass instproc foo {-ot} { #ns_log notice ot=$ot return [db_string [my qn check_type] { select 1 from acs_object_types where object_type = :ot } -default 0] } When the logging command is added, the statement works fine. When the logging command was deactivated, the variable ot was not seen from the consumer. By changing the variable setting command to Tcl_SetVar2Ex(), it works fine. 2008-02-08: * New info option "-closure" for "info instmixin" with -guards and -closure support * Extended test cases for "info instmixin" 2008-02-06: * Continued with info orthogonality change info mixin ?pattern? info instmixin ?pattern? ?pattern? behaves exactly like in the change of two days ago. Preceding colons in the name of the queried class are not required. * In all mentioned calls, where pattern refers to an object/class and it contains wild-cards, a preceding :: is added automatically to the search pattern, if it is missing. Since all object names start with ::, an omitted leading :: in a search pattern is an obvious mistake * Made the behavior "pattern" in the following calls identical concerning wild cards and object lookups mixin delete pattern instmixin delete pattern superclass delete pattern * extended regresson test 2008-02-05: * fix getAllClassMixinsOf to handle combinations of transitive per class mixins and inheriting per-class mixin via the class hierarchy, removed getAllSubClasses * extend test cases 2008-02-04: * Potential incompatibility: provide a uniform interface to the following info subcommands info superclass ?-closure? ?pattern? info subclass ?-closure? ?pattern? info instances ?-closure? ?pattern? info instmixinof ?-closure? ?pattern? info mixinof ?pattern? In cases, where the option "-closure" is defined, the values are computed transitively. In cases, where a pattern is specified, and the pattern contains meta-characters, a list of results is returned matching the pattern (like "string match"). When no matching value is found, an empty list is returned. In cases, where a pattern is specified, and the pattern contains no meta-characters, a single value is returned corresponding to the specified value. The pattern is used to lookup an object or class, such it is not necessary to provide fully qualified names). if there is no match, empty is returned. Previously, "info superclass" and "info subclass" returned a boolean value and performed always a transitive search. Returning "" is more consistent and more in line with Tcl. By using the option "-closure" one can perform the lookup in the transitive or in the intransitive sets. 2008-02-03: - fix getAllSubClasses - fix "info mixinof -closure", when pattern was provided - streamline code (AppendMatchingElement) - new info option "-closure" for "info instances" (equiv. to "allinstances", but 5 times faster) - new info option "-closure" for "info superclass" (equiv. to "info heritage") 2008-02-02: - Improving regression test: + added ::xotcl::test::case + shortened output - Makefile.in: added missing src_man_dir - fixed softcrecreate cases: * update caches for subclasses of recreated classes * fixed recreate when it defines different superclasses * extended test cases for mixinoftest 2008-02-01: - new info option "-closure" for "info mixinof" (transitive version) - process subclasses for getAllClassMixinsOf 2008-01-23: - saving object->id in cl->opt->id (probably a temporary solution) - improving reset of affected objects, when (transitive) per class mixins change - extended regression test 2008-01-07: - don't call unset traces during an object move (related to fix below) 2008-01-04: - preserving var traces when copying objects (Many thanks to Florian Murr for reporting the bug) 2008-01-02: - fixed evaluation context in guard expressions ([self callingproc] returned "" in cases, where the callingproc was possible to determine) 2007-12-28: - fixed crash for deleted classes in new code (mixinof) - changed name from MixinResetInstanceOrder() to MixinResetOrderForInstances() - improving documentation - made code more local - activate assertion during development - changed names * MixinResetInstanceOrder() -> MixinResetOrderForInstances() * mixinofs -> isObjectMixinOf * instmixinofs -> isClassMixinOf * getAllInstMixinofs -> getAllClassMixinsOf * RemoveFromMixinofs -> removeFromObjectMixinsOf * RemoveFromInstmixinsofs -> removeFromClassMixinsOf 2007-12-28: - new function from Martin MixinResetInstanceOrder() - better cleanup when classes are deleted 2007-12-13: * fix alias command for aliasing to Tcl procs 2007-11-09: * added missing file (install.sh from tclconfig) 2007-10-30: * change Tcl_ObjSetVar2() to Tcl_SetVar2Ex() to address problem in setting variables from C. The set variable was not seen in an eval. * extended regression test 2007-10-29: * return mixins before procs in procsearch * added regression test * Don't through error when the last argument of "obj info class <...>" or "cl info superclass <....>" is a non-existing class, but return false instead. This leaves room for pattern matching. 2007-10-28: * some code refactoring * making new code more robust 2007-10-23: * First version of new info methods "mixinof" and "instmixinof" - new class info options: "mixinof" and "instmixinof" - on class destroy entry is now removed from mixin and instmixin lists 2007-10-12: * Release of XOTcl 1.5.6 2007-10-09: * More fixes for treating global volatile objects during shutdown: - do not allow to create new objects during shutdown - do not allow objects to be set volatile during shutdown - handle cases, where application level destroy methods fail (this could lead to remaining tcl traces pointing to destroyed objects) - handle namespaced variables helding deletion traces for volatile objects Guess, it would be much simpler to use Tcl-level unset traces than C-level unset traces... 2007-10-04: * Revise fix below. The problem was apparently that change of a call of Tcl_FindCommand to Tcl_GetCommandFromObj(), where the latter one had bad side-effects when it is called during deletion. Although the fix below fixed the symptoms, the new approach is better since it is apparently not required any more to fetch the cmd during PrimitiveODestroy to ensure it is not called twice. The problem appeared in XOTcl between 1.5.3 and 1.5.4 and happens only in 8.4.* Tcl. * Improve debugging code to make it easier to trace problems with Tcl_Objs. * Serializer: Added dependency rule in serializer to ensure slots of superclasses are listed before subclasses. (Thanks to Stefan Sobernig for reporting the problem) * Serializer: moved deactivation of traces into "Serializer all" to get simpler results on "o serialize". * Regression tests: extended tests to address the newly identified and fixed problem cases. 2007-09-29: * Fix for Tcl 8.4.16 (and maybe some other recent tcl 8.4.* versions, 8.5 is fine) for situations, where Tcl variable contain references to deleted XOTcl objects. The fix added a epoch increment to CallStackDoDestroy(). 2007-09-29: * Fix for cases, where volatile objects are deleted before the corresponding trace variable. 2007-09-18: * Release of XOTcl 1.5.5 2007-09-18: * Fix rpm build (most probably due to TEA 3.6) 2007-09-13: * Use AssocData instead of the clientdata of the global namespace to store the XOTcl interpreter's 2007-09-13: * Upgrade to TEA 3.6 2007-09-10: * Make forward option -earlybinding more robust, when forwards are done to Tcl procs 2007-08-16: * Fix introspection problem for copied objects and classes (remove superfluous ::xotcl::initProcNS) Must have been a bug from before XOTcl 1.0 * Allow to load XOTcl compiled for Tcl 8.4 to be loaded into a tclsh8.5 (again, substantial change). The behavior can be turned off by setting FORWARD_COMPATIBLE to 0 One can now test now 4 versions: a) a native version for Tcl 8.4 (without compatibility layer) b) a native version for Tcl 8.5 c) a version compiled for Tcl 8.4 with compatibility layer in tclsh8.4 d) a version compiled for Tcl 8.4 with compatibility layer in tclsh8.5 Tests showed that the overhead is for the compatibility layer is between 1.1% and 2.3%, the difference between tcl8.5 and tcl8.4 is much larger. 2007-08-10: * Release of XOTcl 1.5.4 2007-08-10: * fixed regression test in rdf-tests (introduced due to autoname changes in 1.4.0) 2007-08-10: * Fixing bugs introduced by VarReform * Extending regression test to handle the cases 2007-08-07: * More work on Tcl 8.5 and VarReform Compiles now with stock Tcl 8.5 from CVS * Make more use faster Tcl_Obj based interfaces (Many thanks to Miguel Sofer for the suggestions and patch) 2007-08-06: * Changed all references to /tmp to [::xotcl::tmpdir] to honor TMPDIR TEMP TMP if set * Handling of variable traces in serializer: traces might require a different topological sort, which is hard to handle. Similar as with filters, we deactivate the variable traces during initialization. This happens by (1) replacing the XOTcl's trace method by a no-op (2) collecting variable traces through collect-var-traces (3) re-activating the traces after variable initialization (Many thanks to Stefan Sobernig for the help!) 2007-08-05: * Changes to compile xotcl with the new Var structures in the head version of Tcl 8.5. This is a rather large change, the patch is more than 800 lines. (Many thanks to Miguel Sofer for the help!) From the Tcl Changelog *** POTENTIAL INCOMPATIBILITY *** (tclInt.h and tclCompile.h) Extensions that access internals defined in tclInt.h and/or tclCompile.h may lose both binary and source compatibility. The relevant changes are: 1. 'struct Var' is completely changed, all accesses to its internals (either direct or via the TclSetVar* and TclIsVar* macros) will malfunction. Var flag values and semantics changed too. 2. 'struct Bytecode' has an additional field that has to be initialized to NULL 3. 'struct Namespace' is larger, as the varTable is now one pointer larger than a Tcl_HashTable. Direct access to its fields will malfunction. 4. 'struct CallFrame' grew one more field (the second such growth with respect to Tcl8.4). 5. api change for the functions TclFindCompiledLocal, TclDeleteVars and many internal functions in tclVar.c 2007-07-27: * fixed a compile problem with a superfluous semicolon in a macro (Many thanks for Andreas Kupries for reporting and sending a patch) * fixed two compiler warnings in gcc 4.1.2 2007-07-23 * Pre-Release of XOTcl 1.5.4 2007-07-23: * fixed a bug with empty argument names (Many thanks for Stefan Sobernig for reporting the bug) 2007-07-03: * allow to call methods from the class to be called from slot objects (Many thanks for Nico L'INSALATA for noting this problem). 2007-06-05: * Fixed spelling mistakes in the tutorial (Many thanks to Robert Hicks for reporting) 2007-05-27: * Fixed potential error with default values for parameters starting with a "-". (Many thanks to Shishir Ramam for reporting) 2007-03-16: * fixed a bug where a Tcl call adds a namespace to an object, but xotcl did not notice it. (Many thanks for Stefan Sobernig for reporting the bug) 2007-01-14: * fixing error message propagation for methods called via configure. (Many thanks for Kristoffer Lawson for reporting the bug) 2006-12-12 * changing "test == " to "test =" as required by FreeBSD (many thanks to Martin Matuska for providing the patch) 2006-12-07 * MinGW patches (many thanks to Martin Matuska for providing the patch) 2006-11-25 * Release of XOTcl 1.5.3 2006-11-24 * provided compatibility with Tcl 8.5 (checking callframe level instead of empty varframe for toplevel frames) * provided compatibility with Tcl 8.4.14 proc->cmdPtr was used in prior releases only to determine the namespace in which the proc is executed (documented in tclInt.h). Starting with Tcl 8.4.14, this cmdPtr is used as well for updating the client data of a cmd, in case the proc is recompiled. Since XOTcl used the cmdPtr to control the namespace, this code had to be rewritten differently. The new version is faster, but uses for filters or mixins slightly more storage. * reduced calling overhead of methods with non-positional arguments by about 10 percent by avoiding shimmering. * fixed handling of "return -code break" from xotcl methods (thanks to Artur Trzewik for the bug report) * library/comm/Access.xotcl: fixed handling of chunked encoding 2006-09-29 , Uwe Zdun * Release of XOTcl 1.5.2 2006-09-28 * Extended regression test for nested contains * fix potential bug in copy-command with c-level client data (don't copy commands with client data for the time being, rely on introspection) 2006-09-27 * Fixed memory corruption (accessing feed memory) in the invalidation of transitive mixins (many thanks to Don Porter for reporting it and providing suggestions, how to trigger the bug via Tcl memory debug) * Removed c++ style comments (many thanks to Andreas Kupries for reporting) * package xotcl::trace: allow to trace objects with "Trace add trace " not only classes as before (many thanks to jima for suggesting this) * fix for nested -contains with new (many thanks to Stefan Sobernig for pointing this out) * Added a target test-nohttp for automated regression tests on machines with firewalls (used for FreeBSD build system) 2006-09-26 * xotcl.c: improved portability for 64bit AMD on FreeBSD (and maybe on other 64bit platforms as well) all vararg lists are now terminated by ..., (char *) NULL Previously, some were terminated by an integer typed zero-value, which can lead to problems when sizeof(int) != sizeof(char *) * The vararg interface is used by the following API calls in the XOTcl code: Tcl_AppendResult(), Tcl_AppendStringsToObj(), Tcl_VarEval(), XOTclVarErrMsg(). all occurrences are fixed. * All occurrences of Tcl_AppendResult() removed form xotcl.c 2006-09-24 * xotcl.c: make sure, that no Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); happens on shared objects. 2006-09-22 , Uwe Zdun * Release of XOTcl 1.5.1 2006-09-22 * XOTclNextCmd() exported to external (stub) interface, to allow applications to call next without going through a Tcl_Eval() (Many thanks to Scott Gargash for the constructive discussions) * removed XOTclGetSelfObj() again from the external interface since the object/class is passed anyhow. * some minor cleanups and additions to tutorial. * added small fix mentioned in c.l.t for a more backwards compatible old parameter interface. 2006-09-21 * Changed interface of XOTclCallMethodWithArgs to contain the specified number of elements in objv[] rather than the absolute number. Changed name from XOTclCallMethodWithArg to XOTclCallMethodWithArgs * Added XOTclCallMethodWithArgs() to he external interface to allow C applications faster invocation of XOTcl methods * Simplified and standardized calling conventions for C-implemented methods. ClientData receives always the XOTcl_Object, no matter, what client data was specified during registration (e.g. XOTCL_NONLEAF_METHOD). Users can rely on using ClientData for Objects * Some performance improvements in invocation of XOTcl methods 2006-09-20 * added XOTclGetSelfObj() to he external interface to obtain the current object from a C application from the callstack * fixed genstubs target in Makefile.in regenerated all stub files * removed a few more compiler warnings for the power64 bit architecture 2006-09-19 * added XOTCL_NONLEAF_METHOD: This constant must be used when registering C-implemented methods that call "::xotcl::next" to push the XOTcl activation record. Example: XOTclAddIMethod( interp, MyClass, "mymethod", MyMethod, XOTCL_NONLEAF_METHOD, 0 ); 2006-09-18 * fixed a bug in parsing non-positional arguments, when e.g. square brackets are used in type declarations for parameters. Class C C instproc foo {{-q:mult[2],optional 1} -x:boolean,optional args} {puts hu} Tcl lists add another layer of braces ... foo {{{-q:mult[2],optional} 1} -x:boolean,optional args} .... which have to be removed at the definition time of the parameters. * fixed a 64-bit problem for POWER5+ machines * fixed serializer to handle deeper stratification layers * fixed an autoname crash under NT (Many thanks to Mark Jannsen for the patch) 2006-09-17 * fixed a bug in deprecated part, when -setter is used in parameter options. 2006-09-15 * Changed "test -e" to "test -f" in Makefile.in, since the standard test command in Solaris does not understand "test -e" (Many thanks to Andreas Kupries for reporting) 2006-09-14 , Uwe Zdun * Release of XOTcl 1.5.0 2006-09-13 Uwe Zdun * Update of build files for windows 2006-09-10 * added method "contains" to create objects aggregated into other objects (essentially a value added back-port of the OpenACS version). * based method "slots" on method "contains" for improved orthogonality * rearranging sections in the tutorial * deleted obsolete sections from the tutorial * serializer: when an object is defined as exported, export the whole object tree (no need to specify export of all slots for exported objects) 2006-09-08 * added -verbose to forward options * added subst to the tcl-impored methods * fixed a bug with .... -slots {Attribute new -name a1} (Many thanks to neophytos for reporting} * provide method serialize (for Object), when the serializer package is loaded 2006-09-07 * provided Tcl 8.5a4 compatibility * spellechecking langref, make terminology more consistent (naming of arguments like .e.g methodName) 2006-09-04 * update of tcl.m4 for newest TEA from CVS 2006-09-03 * "mixin|filter|instmixin|instfilter set ..." deprecated, use "mixin|filter|instmixin|instfilter assign ..." instead 2006-09-01 * fixed a bug in the xotcl trace module (many thanks to jima for reporting) * extended procsearch to report parametercmd and instparametercmd 2006-08-30 * extended procsearch to report as well [inst]parametercmd 2006-08-26 * extended procsearch to report as well [inst]forward and [inst]cmd 2006-08-25 * new subcommand "info slots" * implemented backwards bug-compatible "info parameter", deprecated 2006-08-23 * added system slots and attribute slots (see documentation) 2006-08-21 * changed the implementation of the configure command and setrelation command to use Tcl_GetIndexFromObj(); * added the subcommand "class" and "superclass" to the the setrelation command. 2006-08-22 * fixed a bug with non-positional arguments, some positional arguments and "args" * fixed a bug in non-positional arguments when called without arguments * improved error messages in connection with non-positional arguments * extended interface of XOTclErrBadVal() to provide better error messages (this changes the stub interface, so we have to change the version number) 2006-08-21 * new command for registering predefined C-implemented Tcl commands as methods ::xotcl::alias | \ ?-objscope? ?-per-object? "-objscope" has the same meaning as for forwarder, "-per-object" has the same meaning as for the method "method", This command is somewhat similar to "[inst]forward -earlybinding", but can be used to bootstrap xotcl (when e.g. no methods are available). 2006-07-20 * Documentation bug: method volatile was documented as a method of class, but is documented as a method of object (Many thanks to Kristoffer for reporting) 2006-05-22 * package.xotcl: evaluating calls to "tcl_package" in the global namespace instead of the current. This fixes problem of xotcl 1.4.* with xotclide. Many thanks to Bill Paulsen and Artur Trzewik for identifying the problem and suggesting a fix. 2006-04-20 * xotcl.c: new option for the argument substitution. When the argument list of the forward command contains "%argclindex {a b c}", then depending of the number of arguments at invocation "a", "b" or "c" is substituted. * New option for forwarder: The option -earlybinding can be used to look up the function pointer of the called Tcl command at definition time of the forwarder instead of invocation time. This option should only be used for calling C-implemented Tcl commands) 2006-03-22 * deprecated command filterappend, instfilterappend, mixinappend, instmixinappend, tclcmd, insttclcmd deleted 2006-03-20 * allow single colons in method names (fix in xotcl.c, NSTail()) 2006-02-17 , Uwe Zdun * release of 1.4.0 2006-02-17 * fixed a bug with nonpositional arguments in connection with "args" (Many thanks for Kurt Stoll pointing this out) * added more regression tests * fixed dependencies created for rpm binaries * mak compile cleaner for gcc 4.* under linux 2006-02-08 Uwe Zdun * fixed a bug with transitive mixins 2006-02-02 * Upgrade to TEA 3.5 2006-01-10 * fixing exit behavior with variable traces in multi-threaded environments (volatile objects could be demalloced twice before) 2006-01-08 * allowing tcl commands and variables as default values for parameters; previously, only one-word commands were allowed. 2006-01-07 * ::xotcl::configure options can be called with one (for query) and two (for setting) arguments (similar to set) * new option: ::xotcl::configure softrecreate on|off if softrecreate is set, class relations (superclass, subclass, class, instances) are not affected by a recreate; this allows files with class definitions more easily to reload * don't destroy namespace imported child objects 2006-01-06 * unsetting the global variable "cmd" from predefined.xotcl (Many thanks to Koen Danckaert for reporting) 2006-01-05 , Uwe Zdun * fixing incorrect state in filters after next * extended regression test 2006-01-02 * info children returns true children, no namespace imported objects/classes * extended regression test 2005-12-20 * upgrading configure scripts of subcomponents to TEA 3.4 2005-12-17 * fixing missing omitted message for unknown subcommand to self 2005-12-07 , Uwe Zdun * release of 1.3.9 2005-12-06 * fixed bug with error propagation when gett/setter methods are used for parameters (many thanks to Manfred Stelzhammer for pointing this out) 2005-12-04 * Upgraded TEA to 3.4 * updated rpm build (many thanks to Ildiko Schmidt and Alexander Bergolth) 2005-11-28 * new command ::xotcl::__qualify: convert an relative name into an command name (exactly as create does it, ignoring namespaces from transparent interceptors) 2005-11-26 * require automatically a namespace when a childobject is added 2005-11-18 * new switch -nocomplain for "mixin|instmixin|filter|instfilter delete" to avoid error messages when deleting entries not there (similar unset) 2005-11-10 * " info vars" does not trigger read traces anymore * fixing version numbers for package require (many thanks to Andreas Kupries for the report) * Serializer: exportMethods accepts forwards/instforwards now as well 2005-11-02 * new subcommand of self: [self args] return the full argument list of the current call 2005-10-02 , Uwe Zdun * release of 1.3.8 2005-10-01 * fixed a bug concering __unknown called via mixin method (many thanks to Zoran for the report) * fixed a memory leak in isMetaClass() in connection with instmixins (many thanks to Ben Thomasson for the report) 2005-09-28 * fixed bug in instvar (many thanks to Koen Danckaert for the report) extended regression test 2005-09-27 , Uwe Zdun * release of distribution XOTcl 1.3.7 2005-09-26 * new check option "switch" for non positional arguments. If .... -somearg:switch is specified in the definition of a method, this behaves like "boolean", except that no additional argument is specified during invocation. A default value of "off" can be turned on, as well as the default value "on" can be turned off by specifying the switch in an invocation. 2005-09-25 * defined an experimental method named "method" * new global command "::xotcl::configure filter on|off" to deactivate all filters for an interpreter. This is needed for serializing code with active filters. * Changed xotcl serializer to use "::xotcl::configure" 2005-09-14 * Fixing serializer to enforce methods on ::xotcl::Object or ::xotcl::Class before other objects and classes 2005-09-13 * adding two package require into library files (many thanks to Andreas Kupries for the report) 2005-09-09 * fixing various namespace issues in library files to make regression test working again. 2005-09-08 * documentation and regressiontest for "self isnextcall" added * added further regression tests, documentation improvements * Httpd: changed classes AccessControl BasicAccessControl DigestAccessControl Responder to Httpd::AccessControl ... Httpd::Responder in order to reduce namespace pollution; applications refering to these must use now these names 2005-09-07 * fixed callstack information for expr; old code could believe (in connection with forward) to be in an uplevel when a forward to expr was called. This could result in a wrong result for [self].... * merged first bunch of files from Andreas Kupries to make libraries more namespace clean. fixed a few namespace iusses in the libraries. Many thanks to Andreas Kupries! * fixed refrence resolving in istype; the following works now the same way: C create c1 c1 istype ::C c1 istype C 2005-09-02 * code cleanup: removed ifdefs for TCLCMD 2005-08-04 * fixed instvar implementation when variable names are empty strings (many thanks to Zoran for reporting this) 2005-07-13 Uwe.Zdun@wu-wien.ac.at> * new subcommand for self: [self isnextcall] is true, if the current method was called via next. This fixes the abstact method. 2005-05-04 * prevent new from overwriting an existing object (increment further until unused name is found) 2005-07-04 Jeff Hobbs * providing update for configure 2005-04-04 * allow xotcl to be used in safe safe interpreters ~rlwrap /usr/bin/tclsh % package req XOTcl 1.3.7 % interp create -safe slave slave % load "" xotcl slave % slave eval ::xotcl::Object o1 ::o1 2005-03-24 * implemented resolving for references to classnames not in the current namespace such that the following works namespace eval foo { Class M -superclass Class } without the need of specifying "-superclass ::Class" * implemented resolving for references to imported class names such that the following works namespace eval foo { namespace import ::bar::A Class M -superclass A } 2005-03-17 , Uwe Zdun * release of distribution XOTcl 1.3.6 2005-03-16 * extended semantics of meta class definitions: old: a meta class is either ::xotcl::Class or one of its direct subclasses new: a meta class is either ::xotcl::Class or a class inheriting from ::xotcl::Class The subtle difference is that with the new definition every class can be made to a superclass by adding an instmixin of Class (or one of its subtypes) to it. Before this change it was necessary to alter the Class hierary explicitely. In order to define that every class should be a metaclass, one can use now Object instmixin Class instead of the rather complicated solution i posted on the xotcl mailing list not long ago. * new info subcommand: info precedence * fixed possible crashes of objects are called with class methods (e.g. due to instmixins) * fixed bug when instmixins are defined recursively (e.g. Class instmixin Class) * code refactoring, fixed erroneous documentation of c code * improved documentation in tutorial, als syntactically such that htmldoc 1.8.24 works with it * extended regression test, reduced dependency on tests 2005-03-11 * fixed bug noted by Kristoffer Lawson: - Don't allow an object to be changed to a class via "o class Class" - Don't allow an object to be recreated (without alloc) to a Class * fixing the following command namespace eval foo { Class m Object o -mixin m } such that m is resolved from the foo namespace. The ::xotcl:: namespace is now skipped, since a helper method that calles the primitive setting command is defined there 2005-03-01 * improved documentation of next in langRef 2005-02-23 * fixed passing of error code from init methods (thanks to Fabrice Pardo for noting it) * returning PACKAGE_VERSION after a package require (e.g. 'package req XOTcl' returns now 1.3.6) 2005-01-15 , Uwe Zdun * release of distribution XOTcl 1.3.5 2005-01-10 * added instproc for ::xotcl::Class allinstances to return all instances for the actual class 2005-01-07 * code cleanup for nonpos args * new methods for Serialzer: - Serializer methodSerialize (to serialize methods) - Serializer exportMethods (to export methods from the xotcl namespace via ::Serializer all - Serializer exportObjects (to export Objects from ::xotcl::*) * put Serializer into a namespace (::Serializer is auto-exported) * fix for serializer, when xotcl is not imported globally * aolserver: support for namespaced objects in xotcl.tcl 2005-01-06 * made introspection options for methods with nonpos args compatible with Tcl * adding functionality to allow nonpos args and positional args to be specified in the same argument list (still supporting the syntax with separate lists) 2005-01-05 Uwe Zdun * Added support for defaults + non-pos args in info args, default, instargs, instdefault * fixed bug: Check Boolean in non-pos args crashed with 2 args 2004-12-15 * fixed crash for empty arguments (thanks to Gerald Stermsek for reporting this bug) 2004-12-02 , Uwe Zdun * release of distribution XOTcl 1.3.4 2004-12-02 * changed metadata analyser from recursive to iterative 2004-11-30 * various fixes to improve portability 2004-11-27 , Uwe Zdun * release of distribution XOTcl 1.3.3 2004-11-20 * fixed [self callinglevel] in nested uplevel loops in the presence of filters, extended regression test 2004-11-19 Uwe Zdun * fixed bug: empty non-pos args, double dash alone. Thanks to Bryan Schofield for reporting this bug. Added tests. 2004-11-18 * changed internal communication between end-of-filterchanin and "unknown" to flag instead of return code XOTCL_UNKNOWN * fixed [self callinglevel] in nested uplevel loops (many thanks to MichaelL@frogware.com for reporting the problem) 2004-11-14 * fixed yet another free memory read (many thanks for Zoran for help with purify) 2004-11-13 * fixed entries for aolserver in configure.in (many thanks for Zoran reporting this problem) * fixed --enable symbols (many thanks for Zoran reporting this problem) * fixed free memory read in namespace deletes 2004-10-30 * added error message when someone tries to delete a non-existing proc/instproc * using less memory for objects and classes with procs/instprocs, when they do not use assertions (saving 14%) * prettified langref with css * documented deletions of object procs and instproc through proc/instproc with empty args and empty body 2004-10-13 * make namespace handling code more orthogonal * using resolver for exists method (might be used in future for other methods as well) * cleanup of dead code 2004-10-09 * fixed recreation bug in connection with namespace eval * fixed exists for objects with own namespaces 2004-09-20 * Fixed bin-tar target to include sdbm+gdbm+expat * Improved documentation (tutorial and langref) for forwarding options * using $prefix in install-aol, provided a README.aol file * more general fix for namespace handling; still possible problem with shared Tcl_Objs of type XOTclObject, when referred to from different namespaces. 2004-09-15 Uwe Zdun * fixed bug: non-pos args did not work correctly with default values. Thanks to Bryan Schofield for reporting this bug. Added tests for non-pos args + default values. 2004-09-09 Uwe Zdun * fixed possible accesses to object namespaces that got already destroyed by TCL, by checking for ((Namespace *)nsPtr)->deleteProc is not NULL, ie. it is still set to XOTcl's Namespace Delete Proc, and not invalidated by TclTeardownNamespace yet. add test for this to testx. Thanks to Kristoffer Lawson for reporting this bug. * fixed mis-formating in tutorial (only visible in browsers other than Mozilla) 2004-09-02 Uwe Zdun * temporary fix for alloc behavior to deal with explicit namespace changes by user, thanks to michael.heca@email.cz for reporting the bug. Added a test for this change. 2004-08-26 , Uwe Zdun * release of distribution XOTcl 1.3.1 2004-08-26 * removed dependencies on TclGetInterpProc(), added define USE_INTERP_PROC if someone needs this. If nobody complains, we will remove this in the future 2004-08-22 * fixed nonposargs, when used with checker procs and spaces in arguments * auto-generating docs in build tree (instead in source tree) * cleanup and documentation of somewhat confusing declations in xotcl.h and xotclInt.h (XOTcl_Object and XOTclObject) * make tar makes distclean first 2004-08-19 * if configure is run outside the src tree the directory structure is now built on the fly. All binary output files are now placed in the built-tree. 2004-08-18 * added a regresion test for serialzer * fixed a "last minute" bug in serializer * configure changes: made subdirs relative to $srcdir, set XOTCL_SRC_DIR to $srcdir to make build succeed from outside dir 2004-08-17 , Uwe Zdun * release of distribution XOTcl 1.3.0 2004-08-17 * fixing make for rpm * tweaking configures stuff to work with rpm 2004-08-16 * adding two sections to tutorial, updated langref.xotcl 2004-08-15 * Adding non positional arguments to serializer 2004-08-12 * fixed a possible core dump when 'my' was called without args (many thanks to Bryan Schofield for noting) * some code generalization and cleanup 2004-08-01 * changes to forward and instforward: providing positional arguments for the forwarder. It is now possible to prefix the arguments with "%@POS ", where POS can be a positive or negative number or "end". A negative offset can be used to address relative to the end 2004-08-01 * xotcl.c: calling __unknown when an object with an unknown parent namespace is called (for handling nested object classes in Zoran's ttrace package) 2004-08-01 * yet another fixed access to freed memory (when the configure method returned a non numerical value, which was tried to be converted into a number; setting refcounts properly helped. (thanks to Zoran for his help with Purify ) * minor code cleanup * test with tcl 8.4.7 2004-07-29 * changes to forward and instforward: + %some-command executes some-command at invocation time and substitutes result + substitution extended to all arguments (also on callee) 2004-07-28 * yet another fixed access to freed memory (thanks to Zoran for his help with Purify ) 2004-07-26 * fixed bug in filters in connection with instmixin; inactive tcl callstack frame was dereferenced. This fixed as well a potential uplevel bug * fixed access to freed memory (thanks to Zoran for his help with Purify ) 2004-07-23 * implemented experimental next method for delegating same-named procs to different objects 2004-07-20 * fixed a potential crash when a instmixin was registered on itself 2004-07-19 Uwe Zdun * added checkoptions to non pos args * added tests & documentation of non pos args 2004-07-18 jim@jam.sessionsnet.org * Added file autogen.sh, to generate all configure files * Added file autoclean.sh, to clean whole source tree, incl. configure 2004-07-18 * added removal of autom4te.cache to distclean * make doc added to "all" target * auto-generated html docs are removed in a make clean * remove all *~ files in directory tree via find (ok with TEA3?) 2004-07-11 jim@jam.sessionsnet.org * revamped configure recursion * added "--with-xotcl=" to child configure.ins * arranged for root configure to call child configures specifying path * located and fixed bug where parts of the build cannot find xotcl.h if xotcl was not "make install"ed (bug implies build always finds old includes) * ensured "make clean" and "make distclean" still worked * TODO: clean should remove emacs backup files distclean should remove autom4te.cache docs should be built during make, installed during make install and removed from the build dir during make clean. 2004-07-03 * extended commands filter, mixin, instfilter, instmixin: These commands are changed in a backward compatible manner. They can be used as follows obj mixin same as: obj info mixin obj mixin {C1 C2} same as: obj mixin set {C1 C2} obj mixin set {C1 C2} sets the mixins for obj obj mixin get same as: obj info mixin obj mixin add C3 adds a mixin on front of the mixin list obj mixin add C3 end adds a mixin at the end the mixin list obj mixin add C3 3 adds a mixin at the 3rd position obj mixin delete ::C3 removes the mixin from the mixin list The same semantics are available as well for filter, instmixin and instfilter. The implementation uses the forwarder and is extensible, new subcommands can be added. As a side effect, the c-code was reduced by 50 lines. * the commands mixinappend, filterappend, instmixinappend and instfilterappend were marked as deprecated and will be removed in future versions 2004-07-02 Uwe Zdun * integrated support for non-positional arguments for procs and instprocs 2004-07-02 * rename forward option -inscope to -objscope * xotcl.c: added current namespace prefix, when a forwarder is defined with -objscope and no namespace prefix was specified * optimized forward/instforward such it reaches practically same speed as tclcmd/insttclcmd. * removed tclcmd/insttclcmd * added tests for forward to regression test suite * applied and fixed the config improvements by Jim Lynch 2004-07-01 * xotcl.c: allow literal %self, %proc, %1 etc. as arguments of the forwarder: arguments in the definition of a forwarder proc starting with two %-characters are changed into arguments starting with one % * xotcl.c: forced options to be placed in forward definition after before * xotcl.c: new info option for Object and Class: info forward ?-definition? ?pattern? list the defined forwarder for the class/object. * Serializer.xotcl; Added handling of the forwarders to the serializer. Therefore forwarders are kept in the serialized state. 2004-06-29 * changed name of delegator methods to forward/instforward * removed most of the switches of the forwarder. We have now obj forward ?options? ?arglist? where arglist might contain * %self for inserting the forwarding object * %proc for inserting the forwarding method * %1 for using the first argument of the invocation options might contain: -inscope: evalute method in obj scope -methodprefix: prefix, to be added in front of called method (to avoid name clashes with methods like "set", "mixin" etc.) -default list-of-methods: to be used in connection with %1, when there are not enough arguments in the actual call. 2004-06-24 * fixed coredump for delegation to object without method specified (many thanks for Bryan Schofield for the bug report) 2004-06-20 * removed inclusion of * second version of delegator methods cmd and instcmd A delegator method is defined via Class instcmd method COMMAND ARGS a call to the defined method with some args obj method arg1 arg2 arg3... is mapped to COMMAND ARGS arg1 INSERTTOKENS arg2 arg3... Class instcmd \ ?-nocaller? \ ?-nomethod? \ ?-inscope? \ ?-skip nr_of_tokens? \ ?-insert tokens? ?-prefix string? \ ?-defaultmethod subcommand? \ where methodname: name of an instcommand for the class to be registered, commandname: command that receives delegation -nomethod: don't insert the callers method -nocaller: don't insert caller after method -inscope: evalute method in obj scope -skip: skip n arguments from the call. "-skip 1" means that not the "method" from the invocation is used as the method call, but the first argument -prefix: prefix, to be added in front of called method (to avoid name clashes with "set", etc.) -insert: tokens to be inserted after the caller -defaultmethod: when number of arguments is not sufficient to determine the called method, use the specified value to be used as method name (only useful when -skip is used and the arguments run out) (e.g. [$obj info] be mapped to COMMAND showInfoOptions) 2004-06-18 * added *.a to CLEANFILES in configure.in to rm stublibfile on a "make clean" * added subdir traversal for distclean 2004-06-13 jim@jam.sessionsnet.org * fixed make distclean target factored list of configure output files into macro made sure value of output files got through to make distclean target 2004-06-12 * changed namespace treatment in procs/instprocs in provious versions, methods were evaluated in the namespace where they are invoked. This has the problem that either the xotcl primitives (next,my,self) have to be prefixed in methods by ::xotcl::, or ::xotcl::* has to be imported globally. Now, the instprocs are evaluated in the namespace where they are defined. * computing default prefixes in insttclcmd/tcllcmd for not fully qualified commands 2004-05-29 * first version of instdelegatecommand * defined metaclass ::xotcl:.SelfApplicableClass to allow for instprocs of this class to be applicable for itself (useful for delegation objects) * first version of ::xotcl::relations (for relations between objects and classes and for inter-class-relations) 2004-05-22 * fixed path for installing files in Makefile.in (many thanks to Jeffrey Hobbs) * fixed path searching in xotcl.m4 2004-05-07 * fixed compile problems under HPUX (with the help of Attila Dona') * fixed some compiler warnings in tcl-expat showing up (some are still missing) with -Wall -Wconversion -Wno-implicit-int 2004-04-30 * removed duplicates from results from [obj info methods] * fixed GENERIC_HDRS in configure.in and Makefile.in * fixed documentation bugs for "info children" and "info classchildren" * fixed an incorrect error message, when method called from a mixin was not found. 2004-04-25 * alloc returns name of created object * On an "Object create ::o1 -noinit" the noinit option deactivates the search for default values (as used in the serializer) * TEA3 changes: - re-included xotclConfig.sh file in xotcl dependent libraries - fixed variable contents in xotclConfig.sh file - passing of include and spec file for gdbm 2004-04-10 * start to move to TEA3 * moved tcl scripts xotclsh and xowish into apps/utils * made minimal build independent from tclsh; new target libraries-pkgindex, fulldoc, doc removed from default targets * at least for the time being, no static shells 2004-03-23 * added a flag --with-aolserver3 to configure and removed the checking of the current directory to determine whether or not to compile an AOLserver 3.* module. Thanks to Jim Lynch to suggestion it. 2004-03-03 * fixed a potential crash in procSearch method (Thanks to Artur Trzewik for the good error report) 2004-02-29 * callMethod* calls DoDispatch instead of ObjDispatch * adding a callStackPush() for XOTclOEvalMethod() such that 'o eval self' returns '::o' 2004-02-21 * added link to XOTcl wiki to xotcl homepage. 2004-02-20 , Uwe Zdun * release of distribution XOTcl 1.2.0 2004-02-17 Uwe Zdun * fixed a Tcl_Obj ref count free that was called too early. * fixed support for Visual CC debugger * fixed Win version info 2004-02-16 * fixed a reference to a structure of a destroyed object 2004-02-16 Uwe Zdun * added self class and self proc context to GuardCall * removed guardedScope and info guardedlevel completely from the code -> use parameters instead (see tutorial) * rewritten the tutorial text for mixin/filter guards completely * added new files to Win makefile.vc 2004-02-14 * experimental new command "self guardedlevel" as replacement for getGuardedScope * added documentation for self callinglevel, self activelevel and the methods upvar and uplevel * used a bold font for predefined Tcl and XOTcl words in the HTML version of the tutorial 2004-02-13 * xotcl.c more code cleanup: - some minor performance improvement - used the same idiom for iterating over a class hierarchy consistently - simplified the usage of ComputeOrder() and let the optimizer do more work 2003-02-04 Uwe Zdun * xotcl: removed MixinRemoveFromMixinStack, MixinRemoveFromCmdPtr, MixinRemoveOnObjFromCmdPtr, FilterRemoveFromFilterStack, FilterRemoveFromCmdPtr, FilterRemoveOnObjFromCmdPtr ... and replaced with simple forward stepping in cmd list. * made the mem count work with multi, single-threaded interpreters 2003-02-03 Uwe Zdun * testx: tests for CmdListReplaceCmd, MixinRemoveFromMixinStack, MixinRemoveFromCmdPtr, MixinRemoveOnObjFromCmdPtr, XOTclOGetGuardedScopeMethod, XOTcl_InterpObjCmd, XOTclOVwaitMethod, * xotcl: removed XOTclAssertionRename, simplified XOTcl_RenameObjCmd * corrected mistakes in tutorial code for filterguards. 2004-01-31 * performed coverage analysis of regression test * changed unsuccessful branches into asserts * extended testx.xotcl for better coverage 2004-01-28 * Streamlined code; removed mixinChainOn from mixinStack and filterChainOn from filterStack and use callstack frameTypes instead. * some performance improvements 2004-01-27 * implemented uplevel method (uses [self callinglevel] when no level specified) * fixed a bug in next, when methods on the same object are called from within a mixin class and filters are defined * some performance improvements 2004-01-19 * added more test cases, * upvar method fully functional * simplified CallFrame management on XOTcl stack (wish, CallFrame had ClientData !!!) * Reduced size of XOTclCallStackContent * modularized xotcl more (new file xotclShadow.c; all shadowing of Tcl commands and access of global tcl obj commands is treated there) * included a fix from Zoran for thread exit handlers. 2004-01-16 * defined upvar method (uses [self callinglevel] when no level specified) * simplified stringIncrement method and added a couple of assert(). 2004-01-15 * allow volatile to be called from toplevel * decrementing refcount of global objects as needed (some had a high increment) 2004-01-14 * method 'new' now uses stringIncrement, which replaces the name generation based on numbers by a name generation based on strings. The strings are constructed by small and capital letters plus digits and correspond to a number of a number system with the basis of 26+26+10=62. These strings can grow up to memory size. XOTcl can run as a server practically infinitely long generating objects with 'new'. * new package xotcl::upvar-compat This package provides backward compatibility with earlier versions of xotcl that redefined upvar/uplevel such that these commands ignore inactive filter and mixin frames (upvar behaves the same whether or not a filter is installed). Newer scripts should use upvar/uplevel [self callinglevel] var/command instead. This package can be used via package require xotcl::upvar-compat * moved resetting of shadowed tcl commands after the deletion of object (as suggested by Zoran) 2004-01-11 * all occurrences of uplevel/upvar equipped with [self callinglevel] such that library works with standard uplevel/upvar * faster version of 'new' method (more than 20% faster, using c-variable, faster long to ascii conversion) * objinst (of oo-bench) about 17% faster 2004-01-10 * polished macros XOTcl_FrameDecls, XOTcl_PushFrame, XOTcl_PopFrame (2 versions, slower version with less dependencies on tclInt.h) * removed mixinCalls and filterCalls from interpreter state. * removed unneeded macros 2004-01-08 * fixed bug on exit, when no threads are enabled (different cleanup strategy in threads) * fixed crash on deleted Tcl_Cmd, when xotcl debugging output is turned on * some more code cleanup 2004-01-07 * removed varFramePtr from xotcl callstack * removed unneeded variables from runtime state * resetting of csc->callsNext after a next call * added "methods" to info info 2004-01-06 * cutting of callframes removed completely * 2 new subcommands for self: - self callinglevel: returns the tcl stack level to address the invocation of the actual method - self activelevel: returns the topmost active stack entry from the xotcl stack Both commands return the absolute level number (syntax #n) if called from an xotcl method or 1 if called from a tcl proc. These subcommands are designed to be used in the form of "upvar [self callinglevel] a b" * Replaced C implementation of uplevel and upvar (with callstack manipulation) by a simple Tcl proc that uses [self callinglevel] as default level (if is was not called with an explicit level). * Extended test suite * Changed all variables of type "Interp *" to "Tcl_Interp *" and defined macros Tcl_Interp_XXXX to access component XXXX * Changed all variables of type "CallFrame *" to "Tcl_CallFrame *" and defined macros Tcl_CallFrame_XXXX to access component XXXX 2004-01-04 * callstack manipulation reduced significantly * speedup on xoRDF.test about 7% * self callingobject/callingclass/.... refers always to last invocation (ignoring next-chain) * consequence: mixins and filters are transparent on the callstack * possible extension "self previous ?n?" similar to "self next" to obtain information about next chain * possible extension "self level ?n?" similar to "info level ?n?" to obtain information about call stack 2004-01-02 * Changed all variables of type "Namespace *" to "Tcl_Namespace *" and defined macros Tcl_Namespace_XXXX to access component XXXX * generalized invocation on callProcCheck and handling of calldata in new function DoCallProcCheck * overall code cleanup * extended test suite with tclmd and insttclcmd 2004-01-01 * fixed loop on invocation of methods registered by the tclcmd method * allowed to register fully qualified commands via tclcmd or insttclcmd * made insttclcmd to work from mixin or instmixclasses * renamed "next" method to "__next" * restored old behavior of defaultmethod 2003-12-31 * Changed all variables of type "Command *" to "Tcl_Command" and defined macros Tcl_Command_XXXX to access component XXXX * new predefined method self: [ self] returns fully qualified name of object * potential incompatibility: calling an object without name does not return fully qualified name, use "self" method (see above) instead. To keep backward compatibility, define Object instproc defaultmethod {} {return [my self]} * New method " next" can be used to invoke next on the last recent invocation of a method on . must be on the callstack, otherwise an error message is generated * The new defaultmethod calls next on parent object to prohibit shadowing of methods through sub-objects 2003-12-28 * new functions: CallStackUseActiveFrames()/CallStackRestoreSavedFrames() to to avoid walking through and modifying the whole stack when locating an active frame to set variables (using in -volatile, instvar, info defaults) callstackcutframes still used in info level, uplevel, upvar, info callingproc, callingclass, callingobject 2003-12-25 * update of various library functions (such as Httpd) to use sub-objects as methods (avoids calls of [self]::objname) 2003-12-19 * xotcl.c: allow to call sub-objects as methods via "my" 2003-12-16 * added logdir as parameter for Place (HttpPlace) * fixed handling of content-length == 0 in Httpd.xotcl to avoid Problem with microsoft explorer's WebDav queries 2003-11-13 , Uwe Zdun * release of distribution XOTcl 1.1.1 2003-12-13 * Removed dependency that certain variable references in tclConfig.sh (such as TCL_SHARED_LIB_SUFFIX='${VERSION}${DBGX}.so'); There was a problem on freebsd systems that use hardcoded "84" instead of version in this definition, which leads to a problem when the SHARED_LIB_SUFFIX is used with different VERSIONs (such as in XOTcl). We set now the suffixes as follows eval "SHARED_LIB_SUFFIX=${VERSION}${TCL_DBGX}${TCL_SHLIB_SUFFIX}" eval "UNSHARED_LIB_SUFFIX=${VERSION}${TCL_DBGX}.a" and pass it through xtoclConfig.sh to the c based c-components (sdbm, gdbm, expat) 2003-12-08 * Some cleanup in tclexpat.c to make it compile on freebsd * configure: made --with_gdbm configurable such that include path and library path can be configured * Httpd.xotcl: added simple redirects, can be used like e.g. Httpd h2 -port 9086 -root /tmp \ -redirect {^(mailman|pipermail|cgi-bin) http://alice.wu-wien.ac.at>:80} 2003-12-07 * incorporated more fixes for build system suggested by Daniel Steffen * changed version number to 1.1.1 * further cleanup in Makefiles, reduced redundancy in distro by using symbolic links * used everywhere for SHLIB_LD_LIBS XOTCL_BUILD_STUB_LIB_SPEC instead of XOTCL_STUB_LIB_SPEC 2003-12-06 * httpd.xotcl: fixed return format in HTTP reply header parameters Allow: and Public: for HTTP OPTIONS method * library/store/XOTclGdbm/: fixed initialization of xotcl stubs, usage of ck{free,alloc} vs. {free,malloc}. * library/store/XOTclSdbm/: fixed handling of O_SYNC on system that do not have it * Configure can run now as well from outside of xotcl sources; One can use now for example the following commands to compile and install XOTcl % mkdir -p /tmp/xotcl/unix % cd /tmp/xotcl/unix % ~/xotcl-1.1.1/unix/configure --with-all % make % make test % make install DESTDIR=/tmp 2003-12-05 * incorporated changes as suggested by Daniel Steffen - using consequently DESTDIR for all directory references - made procs in predefined.xotcl independent from namespace import ::xotcl::* - make references relative to $(srcdir) in all Makefile.in 2003-12-02 * added "--with-tkinclude" * fixed "--with-tclinclude" to set TCL_INCLUDES (for all subdirs) 2003-11-29 , Uwe Zdun * release of distribution XOTcl 1.1.0 2003-11-29 * moved tcl command hooks into thread local storage to fix a bug, when xotcl is loaded into a thread * fixed various documentation bugs, added style files for XOTcl tutorial, made presentation more uniform, made distinction between literals and placeholders visible * fixed a few issues with purify and mt (many thanks to Zoran!) * some Makefile improvements (removed the need to generate documentation on each run of make) * Fixed compilation issues of expat with tcl 8.3 or younger 2003-11-28 * fixed include path for actiweb components (sdbm and expat) * extended transparent mixins for upvar, uplevel * extended regression test 2003-11-27 Uwe Zdun * added new version of Klaus' securePlaceDemo, some minor corrections for new XOTcl version * installed XOTcl library into lib directory under windows instead of bin 2003-11-26 * removed ::xotcl::lib from predefined variables and from man page * added namespace require to xotclsh * added transparent mixins for instvar 2003-11-25 * xotcl.c: further generalization of call stack entry skipping; cutFrames can skip now over filters and/or mixins * "Class new -volatile" works now through filters and mixins * regression test updated * reduced size of xotcl distro * fixed various typos in language reference 2003-11-22 * xotcl.c: generalized cutting of call stack entries to skip either filters or mixins * "Class new -volatile" works now through mixins for create * added test to regression test (testx) * xotcl.c: some cleanup and speedup * updated aol-xotcl.tcl (for loading xotcl into aolserver 4.0) 2003-11-20 Uwe Zdun * updated documentation: - added a section "Integrating XOTcl Programs with C Extensions (such as TK)" to the tutorial - updated tutorial, readme, compile, compile.win 2003-11-16 * Httpd.xotcl: forced HTTP/1.1 requests over SSL to use HTTP/1.0 due to a problem between OpenSSL and certain incarnations of IE. * Documenting requireNamespace in more detail. 2003-11-13 Uwe Zdun * various changes to support conditional shell building with stubs * various changes to build libxotcl/xotclsh with tcl 8.0 (stub dependencies) * Httpd.xotcl: added parameter to web server to configure timeout for persistent connections * eliminated a few compiler warnings from xotcl.c 2003-11-12 * removed namespace import/forget in predefined.xotcl * Makefile cleanup (fixed duplicate dependencies, quoting in loops) * added tests for xoRDF and Persistence, when actiweb is enabled * building expat, when actiweb is enabled * removed needless files from xotcl-distribution. 2003-11-09 * xotcl.c: fixed calling exit-handler twice for threads 2003-11-06 * xotcl.c: simplified handling of command substitutions; starts to work with Zoran's nstrace.tcl for AOLserver 2003-11-02 MichaelL@frogware.com * XOTcl Stub lib configure files for C-based extensions. 2003-11-02 * XOTcl intercepts a few commands (info, rename, uplevel and upvar) and assumed that these commands are defined in C. Command intercepting was fixed such that intercepting a proc info works as well; before xotcl produced a core. Example: % rename ::info ::tcl::info % proc ::info args {uplevel ::tcl::info $args} % package req XOTcl 2003-10-31 * Substituted config/config.sub and config/config.guess (many thanks to Zoran) * unix/Makefile.in fixed target install-aol 2003-10-23 * xotcl.c: new proc "__unknown" for Class; whenever XOTcl references a class, which is not defined yet, "Class __unknown" is called; this mechanism can be used to autoload classes in a lightweight fashion * fixes in the built system to avoid two different "package ifneeded" (seems to cause troubles under certain circumstances) 2003-10-20 MichaelL@frogware.com * Fixed the return value of TclExpatUnknownEncodingHandler in tclexpat.c. The return value of the handler is now correctly passed to expat. 2003-10-14 MichaelL@frogware.com * Changed library names on Windows to make library names more similar across platforms. Changed xotcl.c and xotclStubLib.c to support XOTcl stubs. Changed Windows Makefile.vc's to build all libraries with XOTcl stubs by default. Changed Windows Makefile.vc's to specify base load addresses for all libraries. Fixed compiler warnings in winMain.c. Fixed compiler warnings in tclexpat.c. 2003-10-08 Uwe Zdun * a number of changes to make XOTclSdbm and XOTclGdbm work with xotcl.h solely ... in particular, introduced new stub functions and Interface structs for XOTclClass and XOTclObject: XOTcl_Class and XOTcl_Object. Changed XOTcl's core to expose these in the extern functions that are exposed via xotcl.decls. 2003-09-10 Uwe Zdun * Integrated bug fixes provided by Klaus Kolowratnik for the secure http server. 2003-08-27 Uwe Zdun * moved config.vc, installWin.tcl to win dir and corrected them * merged /makefile.vc and /win/makefile.vc; everything for win now works from the win dir * adapted other makefile.vc's in distro * corrected stub table decls and auto generated table .h files that where incorrect due to recent changes in external API (XOTclRemoveClass, XOTclAddClass) * corrected README * added pkgIndex file for win local dir * win version change to 1.1 * corrected the wrong local TCLLIBPATH on unix from '$(TOP_DIR)' to '$(TOP_DIR)/unix $(TOP_DIR)/library' to circumvent the win dir on the auto_path * added locale support to xotclAppInit 2003-08-27 * went with spell checker over tutorial and fixed a hundred of typos * fixed install of shells * fixed optional built of xowish (TK_LIB_SPEC was not passed correctly) * removed obsolete check_library_path in predefined.xotcl * some fixes in ::xotcl::config mkindex for autoloadine files 2003-08-26 Uwe Zdun * doc for precedence order and transitive instmixins in tutorial 2003-08-25 * Generate library/pkgIndex.tcl from configure (contains version numbers) * Fixed script for changing version numbers in xotcl * Changed version of XOTcl to 1.1.0 2003-08-22 Uwe Zdun * Added support for transitive instmixins in xotcl.c, added test for transitive instmixins * Various fixes for new build stuff on Windows 2003-08-20 * Fixed configure problem with autoconf coming with RH 9.0 * Allow for the definition of parameters as objects. It is now possible to have parameters with properties (See tutorial, section "Objects as Parameter") * fixed various bugs in the documentation. MAKE TODO: make rpm, bin-tar, version-change, install-aol 2003-07-13 * Fixed potential crash with shared objects in configure * First version of object tree creation via parameter 2003-07-11 * extended parameter handling code to support the creation of parameter objects * fixed a few documentation bugs 2003-07-05 * xotcl.c: if object is called without method and arguments, xotcl calls now a method named 'defaultmethod'; the default behavior (defined as an instproc on Object) is that the name of the object is returned. Example: Object o puts <[o]> ;# outputs <::o> puts <[o defaultmethod]> ;# outputs <::o> 2003-06-28 * added --with-xotclsh and --with-xowish to create shell optionally 2003-05-28 Uwe Zdun * added "info mixinguard" and "info instmixinguard" * changed GuardList behavior to tolerate qualified names * added tests for 'info instmixinguard' and 'info mixinguard' * made -withGuard and -order work together for "info filter" on objects. * checked that guard is deleted, when redefined with FilterAdd/MixinAdd * add -guard modifier into filter, mixin definitions and infos * updated tests 2003-05-23 * removed toplevel configure and Makefile for better TEA compliance (configure should be called from xotcl*/unix) * added --with-actiweb to configure; (use --with-actiweb=yes to enable it) * standarized tests (using the same Test classes) 2003-05-16 * removed binary shells and XOTcl's context depending auto_path setting; consequences: - in order to invoke xotcl before installation, use export TCLLIBPATH=`pwd` in XOTcl's build directory - instead of using the environment variable XOTCL (as described in this Changelog on 2001-01-08, use TCLLIBPATH * Two small tcl scripts "xotclsh" and "xowish" are provided for backward compatibility with xotclsh applications * For interactive use, adding package require XOTcl; namespace import -force xotcl::* into your ~/.tclshrc is recommended * Various changes and simplifications in configure and Makefiles * XOTclGdbm: fixed it such it works with enable-threads without crashing immediately 2003-05-12 Uwe Zdun * removed various bugs in new code and added tests for redefinition and removal of filterguards * added tests for 'instmixinguard' and 'mixinguard' 2003-05-11 Uwe Zdun * added new methods 'instmixinguard' and 'mixinguard' 2003-05-09 Uwe Zdun * changed the filter, mixin, and guard code to provide a new composition strategy for (filter- and mixin-)guards, in case a guard is defined more than once for the same filter or mixin... now only the most specific guard counts, all others are overridden by this guard. Example: Class B -superclass A A instfilter {{f2 {[self] == "::b2"}}} B instfilter {{f2 {[self calledproc] == "set"}}} Here: for an instance of B only the guard on B counts. * updated the tests accordingly * performance improvement: removed ::xotcl::Object from mixin full list computation * added new tests for mixinguards to testx.xotcl 2003-05-03 * xotcl.c: Changed mixinlist creation from quadratic to linear (both, in XOTclAddClass and CmdListAdd) 2003-04-29 * xotcl.c: cleanup to avoid potential crashes on error messages (varargs not terminated by NULL) * introspection for mixin guards (o|cl info instmixin|mixin -guards) * new option for info methods to return only those methods where the guard holds in the current context (info methods -incontext) 2003-04-25 * fixed various typos in examples in tutorial * first implementation of guarded mixins 2003-04-24 Uwe Zdun * document "info instdefault" in the language reference * corrected a problem with move: it did not prevail the subclass relationships; also added a regression test 2003-04-22 * xotcl.c: calling the "create" method from the "new" method through the dispatcher (previous version used a direct call, now create can be overloaded) 2003-04-17 Uwe Zdun * Unified ListObjChildren and ListClassChildren into one method ListListChildren 2003-04-16 * xotcl.c: fixed segfault from classchildren (many thanks to Michael Cleverly for pointing this out) 2003-04-16 * xotcl.c: Fixed passing of error codes from constructors (instproc init). In previous releases, errors were ignored * xotcl.c: Passing correctly error messages from "set" to the XOTcl set method. 2003-03-19 , Uwe Zdun * release of full distribution XOTcl 1.0.2 2003-03-19 , Uwe Zdun * release of full distribution XOTcl 1.0.2 2003-03-19 Uwe Zdun * changed requireNamespace so that contents of a Tcl Namespace with the same name as the XOTcl Namespace to be created survive the requireNamespace invocation & added tests in testx.xotcl. Example: namespace eval a {proc o args {puts o}} Object a -requireNamespace ### -> a::o survives * some minor issues to everything work with tcl/tk 8.4.2 2003-03-08 , Zoran Vasiljevic * some more code cleanup (do not abort when my is called outside the scope of an object) * Makefile less verbose 2003-03-07 * Made output of the serializer more compact (omitting unnecessary references to ::xotcl::Object 2003-03-07 Uwe Zdun * Copy/Move to self had undefined or wrong results; corrected both methods so that the objects stay untouched when copied or moved to self. Added test in testx.xotcl. 2003-03-04 , Zoran Vasiljevic * Made xotcl capable to be loaded via "package require" into aolserver-4 * To build and install XOTcl for the aolserver-4 the following commands can be used # cd /usr/homes/zv/tmp/xotcl-1.0.2 # CC=gcc;export CC ./configure --enable-threads --prefix=/var/tmp/aolserver \ --enable-symbols --without-tk --without-gdbm \ --with-tcl=/usr/homes/zv/dev/tcl8.4.1/unix # make # make install-aol This installs libxotcl*.so, the serializer, and the file xotcl.tcl into aolserver/modules/tcl. The file xotcl.tcl contains a "package require XOTcl" and "... serializer" and sources the files aolserver/modules/tcl/*.xotcl 2003-03-04 * xotcl.c: abort, when a non-threaded xotcl version is loaded into a threaded environment (e.g. aol-server) 2003-02-28 * xotcl.c: fixed a bug the lead to a crash in "self x" 2003-02-20 * fixes to compile xotcl as a module for aolserver-4 2003-02-06 * made -volatile a method rather than an option of the new method 2003-01-18 * aol-server adjustments (fix the documentation for new directory structure, update serializer code, testing) * provided simple replacements for xotclsh and xowish scripts in the unix subdir for testing purposes (not yet installed) 2003-01-17 Uwe Zdun * new directory structure with no version information * removed pwd from make.xotcl * new method "ismixin": Test whether the argument is a mixin or instmixin of the object. * new method "hasclass": Test whether the argument is either a mixin or instmixin of the object or if it is on the class hierarchy of the object. This method combines the functionalities of istype and ismixin. * documented and tested new methods. 2003-01-12 * Changed calls in the form of "[self] method" to "my method" in 59 files in the xotcl distribution * changed Serializer to use [list] in configure where necessary 2003-01-09 * configure methods can be placed into a list to avoid ambiguity of "-". This character is used as a meta-char to denote method names, but it has to be used in values as well. Example: Class Book -parameter {title author} Book b1 -title "--the title--" -author a.b.c has to be written as Book b1 [list -title "--the title--"] -author a.b.c Note, that XOTcl allows us to provide multiple arguments to methods called via configure 2003-01-05 * configure returns now the number of preceding elements without a "-" in its first place. This is needed for convenient processing of argument lists with trailing options from tcl. * avoid processing configure list twice in c code. 2002-12-29 * some cleanup in c-code (to make -Wall slient) * fixed a bug in the "all" method of the Serializer, changed package name to "xotcl::serializer" 2002-12-27 * removed deprecated methods "parameters", "applymethods", "newChild", "newChildOf" 2002-12-23 * release of full distribution XoTcl 1.0.1 2002-12-22 * xotcl.c: some cleanup * aol-server: improved namespace.tcl (using Serializer) 2002-12-19 * New Serialzer: - up to 30% faster recreation of objects - more control of objects or variables to be omitted - provide mappings for (relative) object names In general, the Serializer - is used to generate the blueprint of a workspace (e.g. in the aolserver) - can be used migate objects between threads - to cache objects in the aol-server For details, see doc. 2002-12-18 * xotcl.c: new predefined method 'noinit' can be used to create an object without calling its constructor (used in the serializer to recreate objects from a snapshot) 2002-12-17 Uwe Zdun * installWin.tcl: correction for patchlevel * changed version to 1.0.1 2002-12-14 * xotcl.c fixed a bug in "info default arg var" and "info instdefault arg var" in connection with filters. The output variable was created in the filter frame. Many thanks to Oumung Mehrotra for reporting the problem. * New switch for compilation USE_ASSOC_DATA to use Tcl_AssocData instead of namespace client data for the runtime state (without assoc data, 10-15% faster) 2002-12-06 Uwe Zdun * changed recreate semantics: recreate now calls the cleanup method; so that one can preserve object information in the recreate, call next (and do the cleanup), and finally handle the correction for recreation. * tutorial: added example of structure preserving recreate and updated langRef.xotcl accordingly 2002-11-22 * fixes in documentation * automatic generation of pdf files and make target for the tutorial and the language reference 2002-11-19 * fixes for configure for aolserver 3.5.* 2002-11-13 Uwe Zdun * correct check for XOTcl lib on auto_path in predefined.xotcl; it was checked for xotcl$VERSION, should be xotcl$VERSION 2002-11-08 2002-11-08 Uwe Zdun * Win makefile.vc: let nmake install call the install script * removed "class" hook from recreate ... * updateding AOL-server patch and README * finshing rpm and bin-tar generation * release of full distribution XoTcl 1.0 2002-11-06 Uwe Zdun * let the Unix Makefile also (try to) cleanup Win->Release dirs 2002-10-30 Uwe Zdun * fixes for tcl 8.0.5 2002-10-28 Uwe Zdun * used a proc for exit handler (instead of Object variable), old interface for exitHandler does still work * eliminated a mem leak in FilterFindReg as indicated by Zoran. 2002-10-26 * xotcl.c: fixed problem with external symbol for cmdType and reactivated KEEP_TCL_CMD_TYPE for all tcl versions 2002-10-25 Zoran Vasiljevic * xotcl.c: fixed memory leak for new method. 2002-10-23 Uwe Zdun * Object instproc extractConfigureArg: get one configure argument (and possibly cut it) from a given args list. Especially used in create before init is called with next to get args before the object is actually created (& documentation). 2002-10-22 Uwe Zdun * used Tcl's Assoc structures for runtime state 2002-10-21 Uwe Zdun * corrected "abstract" next handling in predefined.xotcl 2002-09-19 * xotcl.c: prevent duplicate destroy calls during cleanup * xotcl.c: error in exit handler does not panic anymore, but writes to stderr (panic can't be used when exit handler is called by a thread) * Serializer.xotcl: {Serializer all] return exit handler as well. 2002-09-14 * Trace.xotcl: fixed typos in documentation code, changes for "my". 2002-08-29 Uwe Zdun * corrected findXOTcl.c: it got confused by an toplevel XOTcl dir, like: ~/xotcl-1.0/x/xotcl-full-1.0 and didn't find the libs then. 2002-08-27 Uwe Zdun * disabled KEEP_TCL_CMD_TYPE for 8.4, as it did not compile for 8.4b1 2002-08-04 * Httpd.xotcl: order directories before files in directory listings 2002-07-18 * Httpd.xotcl: fix for handling broken links 2002-07-12 Uwe Zdun * Win fixes for compilation with Tcl 8.4b1 * fixed mem leak of filter search 2002-07-10 * fixes for compilation with Tcl 8.4b1 2002-07-06 * Fixed a compilation bug concerning Tcl 8.2 and younger 2002-05-30 * xotcl.c: fixed destroy bug, when object was destroyed during init * xotcl.c: minor cleanup 2002-05-16 Uwe Zdun * xotcl.c: searching filter start commands again, if order is invalidated. Otherwise filter commands of de-registered mixins persist to be a filter. If no other filter or instfilter with the name is found, the filter entry is removed from the filter list. 2002-05-15 Uwe Zdun * COMPILE: an explicit sentence in the beginning that you need Tcl/Tk sources to compile XOTcl. * xotcl.c: FilterSearch has only search for object-specific filters in the object's current order ... that was a bug. It has to search for filters on mixins and instmixins as they are specified by filter and instfilter. fixed. * xotcl.c: Filter application order was: object filters -> mixin filters -> class filters. Corrected to mixin filters -> object filters -> class filters. Now it conforms to the order on normal dispatches. * xotcl.c: changed fatal abort to error, when self is called without an active object 2002-05-05 * fixed UTF-8 conversion for filenames 2002-04-30 * Httpd.xotcl: minor cleanup (removed superfluous instvars) * xotcl.c: removed incr/decr refcount on cl-names in DoDispatch 2002-04-21 * fixed a bug in path settings: when xotclsh was called from an xotcl source directory where no libxotcl*.so was located (e.g. before a compile) an error was produced during load; xotclsh checks now whether it can locate the .so file before setting the path. 2002-04-20 Uwe Zdun * fixed a bug in filter code (recursion blocking) 2002-04-20 * Http client code: fixed several small bugs: - url composition - error handling - redirects to different ports 2002-04-09 Uwe Zdun 2002-04-09 * finshing rpm and bin-tar generation * patch release of full distribution (0.9.4) 2002-04-08 * fixed a bug in copy/move (the constructor was called during copying without instvars etc.; now the construcor is not called here) Many thanks for Artur Trzewik for noting this. 2002-04-08 Uwe Zdun * fixed .add files for Windows 2002-04-07 * removed persistence dir in actiweb regression test to achieve same behavior on each run of the test * Storage.xotcl: fixed a bug when new persistence directories are created * fixed a small memory leak in autonames 2002-04-05 * defined the following policies for excplicit freeing in the exit handler: NO_CLEANUP for processes, the physical free in the exit handler is not needed CLEANUP for threads, just the xotcl classes/objects with its instvars are reclaimed, annother mechanism should take care of the global procs and vars (automatically choosen, when compiled with TCL_THREADS) FULL_CLEANUP for testing purposes, to check, whether xotcl has memory leaks; all global procs and vars are deleted as well. 2002-04-04 * fixed a bug with duplicated tcl_objs of XOTclObjectType that could cause double frees. 2002-04-02 * Less agressive converison to tcl_objs of XOTclObjectType. It will try to keep objects of type tclCmdType when KEEP_TCL_CMD_TYPE is activated during compilation (default). 2002-03-28 * horrible bug fixed, when USE_ALLOCA or USE_MALLOC was defined (macro substitution lead to wrong arithmetic). These macros were defined for c-compilers that do not support variable sized arrays as local variables. Gcc were always fine, but e.g. under the standard AIX compiler array boundaries were overwritten... I wonder, why we have seen no bug reports, this bug was in since ages.... 2002-03-27 Zoran Vasiljevic * more code for volatile objects moved to C 2002-03-26 * Fixed a few more places, where recounted xotcl-objects can cause troubles (mem-leaks + invalid pointers) 2002-03-24 * auto-deletion of global vars and proc to get rid of references to xotcl-objects for deletion 2002-03-20 Uwe Zdun * added reference counts for xotcl objects to avoid crashes for recreated objects (thanks for Artur Trzewik for sending a good bug report) 2002-03-11 Zoran Vasiljevic * xotcl.c: fixed XOTclReplaceCommand for AOL-Server (multi threading bug) 2002-03-11 * Httpd.xotcl: fixed relative pathname-bug for basic authentification 2002-03-02 * marked newChild as deprecated (use new -childof) 2002-03-02 * Changed name of selfdispatch to "my" 2002-03-01 * Httpd.xotcl: allow encoded characters in path and resource names * Httpd.xotcl: use dictionary oder for directory listings * Mime.xotcl: added some more default mime times 2002-02-24 * Httpd.xotcl: added functionality to provide directory listings * Httpd.xotcl: create specified root directory if it does not exist 2002-02-13 * Makefile.in: fixed a bug in make install ("package require package" did not work) 2002-02-12 * HttpPlace: added Pragma no-cache for dynamic contents * overworked persistence manager to separate storage specific concerns (like directory checking) from generic ones * new storage manager multi-storage to multiplex storage requests to multiple sinks. 2002-01-10 Uwe Zdun * removed duplicated system library in library/system. The correct one is in xotcl-XXX/library!! 2002-01-09 * fixed path determination code during startup to avoid "cant read 'pf'" messages 2002-01-08 Uwe Zdun * introduced bcc (copy) database option for persistent databases and configuration option for db file names and dirs in actiweb places * xotcl.c: found and fixed a small bug in unknown: Object o; o r with no unknown defined has looped (not for class -> unknown). corrected it and added it to testx.xotcl 2002-01-06 * further improvement of bytecode compilation * new bytecode instruction SELFDISPATCH * methcall benchmar now more than 40% faster than in 0.9.3 * some cleanup in xotcl dispatch code * fixing external references for symbols not starting with xotcl 2002-01-02 * new xotcl byte codes for XOTcl primitives next, self, and initProcNS. Speedup for the oo-shootout + methcall 30% + objinst 9% some tests are now twice as fast than before, self is now 10 times faster (about 1 microsecond on a 600 MHz PIII) 2001-12-28 * fixed changeXOTclVersion, made more generic * fixed Agent migration, made all migrations synchronous (for the time being) 2001-12-17 Uwe Zdun 2001-12-17 * finshing rpm and bin-tar generation * patch release of full distribution (0.9.3) 2001-12-10 Uwe Zdun * removed two "! test" so that configures work with sh on Solaris * added make bin-tar target * removed all compiler warnings on windows 2001-12-09 * revived configure-code for aolserver, added patchlevel to log message, updated aolserver README file * renamed directory "script-creation" to "serialize" * deactivated create of unneeded installed dirs (xotclexpat, xotclgdbm, xotclsdbm) 2001-12-07 Uwe Zdun * documented recent changes in XOTcl for release 2001-12-05 * fixed call to unknown in copy method 2001-12-01 Uwe Zdun * xotcl.c: xotcl::interp rewritten 2001-11/12 Uwe Zdun * changed xotcl support a (more or less) TEA compliant build process, use Tcl stub lib, and make shells only shallow wrappers that load the XOTcl package on demand 2001-10-23 * removed code for calling variable command 2001-10-22 * xotcl.c: fixed bug for empty superclass list * fixed stub-install under 8.0.5 2001-10-20 2001-10-20 Uwe Zdun * patch release of source distribution (0.9.1) 2001-10-20 * reimplemented method 'new' of Class in C * various cleanups for stub handling * added regression test for stub library 2001-10-18 Uwe Zdun * removed linking glitch in 0.9: stub enabled lib was linked with non-stub enabled obj-files. * added a stub enabled lib to Windows make procedure * renamed stub enabled lib to (lib)xotcl-tclstubs.(so|dll) 2001-10-17 Uwe Zdun * removed "can't instvar to link" problem during aliasing to a link var 2001-10-15 2001-05-15 Uwe Zdun * XOTcl 0.9 Release 2001-10-14 * new method of Object: parametercmd: a convenient way to define a new getter/setter for individual objects (similar to parameters for classes) * polishing docu 2001-10-11 * improved make clean * fixed incompatibilities in various scripts distributed with xotcl 2001-10-11 Uwe Zdun * configure.in: fixed that --without-tk functions ensured that user-defines with --with-tcl/tk override found settings. * xotcl.c: - conditional for different TclIncrVar2 interfaces in Tcl 8.05 and Tcl 8.3 - added TCL_PARSE_PART1 to variable lookup in GetInstVarIntoCurrentScope. TclLookupVar in 8.05 requires it for looking up arrays with only part1 given. 2001-10-10 * fixed autoname method for Tcl 8.0.5 2001-10-10 Uwe Zdun * finished polishing mem leaks (thanks to Zoran Vasiljevic again) * disallowed "[self] next" ... next is now only a command * Gdbm,Sdbm,Expat: corrected Makefile.in to rely on -L$(TCLLIBDIR) (thanks to Jrg Rudnik for the hint) 2001-10-08 * configure.in: fixes for AOLSERVER to ease configuration * aolstub.c: fixes for namespace handling (XOTcl is now a "well behaved" Tcl extension) 2001-10-05 Uwe Zdun * added PRESERVE and RELEASE functions for Tcl_Objs so that we remember all Tcl_Objs that are temporarily allocated, otherwise the ExitHandler would not free Tcl_Objs, like: INCR_REF_COUNT(tclobj); callaMethodContainingExit(); /* "exit" call */ DECR_REF_COUNT(tclobj); /* not reached */ * corrected filtersearch and procsearch to return the new proc qualifier format: proc|instproc as a Tcl list. filtersearch does now operate on objs as well, procsearch does support mixins now. Added tests for both. * documented new features in tutorial and langRef 2001-10-04 Uwe Zdun * minor fixes to get WIN version to run again 2001-10-03 Uwe Zdun * removed some more mem leaks, * reworked exit handler to destroy metaclasses and operate on a instance list, instead of namespace cmdTable * pop remaining callstack entries in ExitHandler to prevent from false deletion order, if "exit" is called from within a method * changed XOTclErrInProc not to rely on obj/class Tcl_Obj* so that we do not have to preserve them in DoDispatch (mem problem) 2001-10-02 Uwe Zdun * added a optional simple mem counter functionality. DEFINE XOTCL_MEM_COUNT so that you get a mem count dump after exit. * removed some mem leaks 2001-10-01 Uwe Zdun * new info option "info methods" ... returns all methods (procs and cmds) defined along the hierarchy for an object. accepts modifiers: -noprocs, -nocmds, -nomixins 2001-09-30 Uwe Zdun * don't allow duplicates in filter/mixin structures (e.g. info filter has returned "b c b", now the filter appears only once. Filterguards are merged into one guard. * new modifier "-order" for info filter and info mixin -> returns order on a particular object, for filters with syntax " proc/instproc " for mixins just a class list 2001-09-26 * cleanup, removed a few bugs * new instproc for Class: insttclcmd creates an instmethod with the given name that calls the Tcl command with the given name in the variable environment of the object * renamed instproc of Class parameteradd to: instparametercmd * xotcl.c: more complete set of tracing options for debugging * some speedups: - instcommand array, append, lappend trace are now more than 3 times faster than before (through insttclcmd) - condition checking (for pre and post conditions and guards) is as well more than 3 times faster than before * configure.in: made -Wall conditional for gcc 2001-09-25 Uwe Zdun * merge with * xotcl.c: new XOTclObject member "flags", which is a bitmap for various object states (isClass, isDestroyed, etc.). Defined several according macros XOTclObjectIsClass(obj), XOTclObjectToClass(obj), etc. * revitalized Tcl_Obj of type XOTclObj to speedup access of Objects and classes by using GetXOTclObjectFromObj GetXOTclClassFromObj (speedup of create by 15%, a few simple commands are now more than twice as fast (Object isclass)) 2001-09-20 Uwe Zdun * xotcl.c: - made objectData structure optional and moved functions into file xotclObjectData.c use XOTCL_OBJECTDATA to compile it in - moved obj & cl clientDatas into optional memory, new extern getter/setter functions: XOTclSetObjClientData, XOTclGetObjClientData, XOTclSetClassClientData, XOTclGetClassClientData. Used them in persistence store wrappers xotclSdbm.c & xotclGdbm.c * testx.xotcl: - Added some obj filter tests 2001-09-19 Uwe Zdun * xotcl.c: - added "opt" structures to XOTclObject and XOTclClass so that optional info (filters, mixins, asssertion,...) is only allocated on demand - corrected bug ... search for epoched filter cmd in FilterRemoveOnObjFromCmdPtr also in mixins - added flags to XOTclObject instead of filterDefined, mixinDefined, and destroyCalled shorts 2001-09-18 Uwe Zdun * xotcl.c: removed object reference code ... I guess we won't do references this way 2001-09-17 Uwe Zdun * xotcl.c: added new instcommand "vwait" on object that mirrors the behavior of Tcl's vwait, but does not operate on flag TCL_GLOBAL_ONLY. The new xotcl obj var tables do not operate with that. E.g.: Object instproc vwait {varName} { [self] instvar $varName ::vwait [list $varName] } would wait for a global variable varName ... though: Object instproc vwait {varName} { [self] requireNamespace ::vwait [self]::[list $varName] } should work ... * xotcl.c: info classparent now returns object name of class, not ::xotcl::classes*** * xotcl.c: new method "objeval" on Object. It executes an command in the scope of an object. This is an important convenience method because something like: Object instproc lappend {varName args} { [self] instvar varName eval ::lappend [list $varName] $args } is problematic if the object has a namespace and varName is an array element ... then Tcl does want to upvar it (was also present in all earlier xotcl versions ... we have used an instvar alias then). Now we can do: Object instproc lappend {varName args} { [self] objeval [concat ::lappend [list $varName] $args] } This is easier an faster than using an alias ... 2001-09-16 Uwe Zdun * predefined.xotcl: - new method "trace" on Object ... simple forwarder to tcl's trace - eliminated "cset" on Object and from the distribution, seems to be nearly unused * whole distr: - replaced direct namespace variable accesses with [self] or instvar accesses. Here's what I did: (a) grep for <[self]::> (b) grep for plus <::> together in one line (c) grep for <}::> to get e.g. ${a}::b that should find most occurrences of variable namespace access, except for direct accesses like: set y::x, where y is an object name and c a variable to be set. 2001-09-15 Uwe Zdun * xotcl.c: - Namespaces of objects are now created only on demand, that is when: - obj proc is created - obj command is created with XOTclAddPMethod - child is created on the object Note that this is a prominent change. Especially it saves a significant amount of memory allocation per object. But you cannot assume the existence of object namespaces anymore. That means: Object o set o::var 1 returns TCL_ERROR: parent namespace does not exist. Use o set var 1 instead. Same appears for append, lappend, trace, array and other Tcl variable handling commands. "info exists" is problematic because it does not return an error message: Object o o set i 1 info exists o::i returns 0. It is save to use all Tcl command together with instvar. - new method "requireNamespace" on Object. Creates an object namespace explicitly. - new info option "hasNamespace" on Object: returns 1, if the obj currently has a namespace, otherwise: 0. - eliminated "returnCode" on RUNTIME_STATE due to several bugs, why was it there??? 2001-09-14 Uwe Zdun * xotcl.c: - Changed XOTclCInfoMethod to be based on two switch statement instead of ifs. Let List* functions return the state (such as TCL_OK). - introduced code for modifiers in info methods. Modifiers are "-" options that change the behavior of an info method - introduced -guard modifier for filter and instfilter (it prints a filter list with guards) 2001-09-13 Uwe Zdun * xotcl.c: - eliminated some flaws in filterguards - forbid "new" filtering during checking a filterguard 2001-09-06 Uwe Zdun * xotcl.c: - also allowed instfilters on a mixin class of an object 2001-09-03 Uwe Zdun * xotcl.c: - bug corrected: filter correctly removed from all dependent classes when filter proc is deleted or superclass is changed - bug corrected: added cmdEpoch check on computation of full filter/mixin lists 2001-09-03 * various cleanup and fixes due to new features 2001-09-03 Uwe Zdun * testx.xotcl: - filterguard tests * xotcl.c: - bug corrected: filter order invalidation upon new proc/instproc ... for filter inheritance 2001-08-25 Uwe Zdun * xotcl.c: - new filter guards language construct for constraining filter appliance - introduced generic Tcl_obj* list instead of XOTclAssertion*, 2001-08-24 Uwe Zdun * xotcl.c: - CallStackGetFrame: iterate only over INACTIVE filters (was a bug) - self filter & mixin infos: determine info position from callstack with CallStackGetFrame, so that uplevel functions with [self calling*,called*] - NextMethod: passed XOTCL_UNKNOWN through at end of mixin/filter chain, if no method was found. * testx: added tests for these corrections. 2001-08-23 Uwe Zdun * xotcl.c and tests: added initProcNS command executed at beginning of all XOTcl procs/instprocs ... it prevents from jumping to the object's namespace, when a proc is opened. Now: namespace eval html { Object o o proc t {} {puts ns=[namespace current];li} o t } results in: li ns=::html Now inside of a namespace, like ::Object, you can call global methods, like ::set without preceding "::" ... => Incompatibility to former versions: direct XOTcl proc calls, like: Object rp rp proc time {cmd time} {...} rp proc x { time "set x 3" t } are invalid ... you have to write: rp proc x { [self] time "set x 3" t } 2001-08-20 Uwe Zdun * xotcl.c and all tests: moved Object, Class, and @ into ::xotcl namespace, now namespace import -force xotcl::* has to be written at the beginning of each script to have them in the global namespace. - info options now return ::xotcl::Object, ::xotcl::Class, and ::xotcl::@ - direct sets and unsets of variable are not possible anymore: "Object set a 5" functions, but not "set Object::a 5", but "set xotcl::Object::a 5" is ok 2001-08-20 Uwe Zdun * xotcl.c and all tests: moved xotcl classes from ::XOTclClasses to ::xotcl::classes 2001-08-20 Uwe Zdun * Actiweb -> made it run with new filter code ... what you have to change on your existing code to make it run: 1. change all invocations of "filter" to "instfilter" 2. same for "info filter" to "info instfilter" 3. same for "filterappend" to "instfilterappend" 4. for all filters on metaclasses: you must not provide the metaclass name anymore, the filter finds it automatically, say, if you have a metaclass C and a filter f, you had to write: A filter C::f now this is A instfilter f 5. replace regclass with [lindex [self filterreg] 0] ... may be changed again 2001-08-17 Uwe Zdun * xotcl.c: integrated complete rewrite of filter code with per-object filters 2001-08-13 * patch release of source distribution (0.85.3) * following naming conventions of Tcl for minor changes 2001-08-11 * xotcl.c. predefined.xotcl: fast parameter inst-commands * xotcl.c: new instcommand for Object: parameteradd (to register the instcommand for parameters) * xotcl.c: applymethods renamed to configure * xotcl.c: small speedup for assertion checking * xotcl.c: simplified set methods 2001-08-09 * fixes for actiweb (agent migration was broken) * comm/Access.xotcl: a response to an HTTP-PUTS request should not contain a body. If it does, Httpd complains shortly and accepts it. * mos/Agent.xotcl: fixed obsolete code (callcoder) * mos/AgentManagement.xotcl: fixed broken RDF-interface 2001-08-04 * xotcl.c reduced size of XOTclObject structure from 172 bytes to 68 bytes by allocating assertion structures on demand and by deactivating per default the old metadata structures 2001-08-02 * integrating AOL-server-changes from Zoran, solution for threads, stublib and older tcl-versions * improved stubs support * generating a stub library src/libxotclstub.so * AOL_DEFINES in Makefile (automatically activated when xotcl is compiled within the source tree of aolserver * configure.in: using exec_prefix for platform dependent files * new target: make libs (for AOL-server) 2001-07-23 * improved parameter support (see apps/scripts/parameter.xotcl) * custom setter/getter methods * xotcl.h: make it usable from C++ 2001-07-13 Uwe Zdun * TextFileStorage: bug in opening files with TextFileStorage eliminated * MemStorage: fix for Mem Storage to support lazy persistence (mem store persists object destroy) * Persistence.test: new test LotsOfObjects 2001-07-13 * patch release of source distribution (0.85-p2) 2001-07-10 * xotcl.c: first draft of new implementation of parameter see apps/scripts/parameter.xotcl for a list of features 2001-07-06 * xotcl.c: fix for propagating special return codes through next calls (e.g. ... return -code continue). This is needed for Tk integration; thanks to catherine letondal@pasteur.fr for pointing out the problem * Mime.xotcl: handling yet another file format for ~/.mime.types 2001-06-21 Uwe Zdun * fix for tclexpat in Tcl 8.2 versions 2001-06-21 * xotcl.c: more fixes for bug in copy/move for object names with spaces * predefined.h: fixes for xotcl methods for spaces in object names (eval) 2001-06-20 * xotcl.c: fixes for bug in copy/move for object names with spaces * xotcl.c: reporting error codes when copy move does not work 2001-06-13 * AIX compatibility fixes (thanks to Adrian Wallaschek) * improved portability * easier export from bk * Httpd.xotcl: added -ipaddr option to configure IP-address of server 2001-06-12 Uwe Zdun * xotcl.c: fixed reference counting for volatile objects 2001-05-01 * patch release of source distribution (0.85p1) 2001-05-30 * new predefined method: newChildOf 2001-05-28 * HttpPlace.xotcl: added call to replyCode in front of replyErrorMsg * Httpd.xotcl: made httpd more robust in error cases (invalid first line) * ignore attic in tar * xotclgdbm.c: faster exists test * lib/xml/TclExpat-1.1/Makefile.in: better make clean 2001-05-22 2001-05-22 Uwe Zdun * XOTcl 0.85 Release 2001-05-15 Uwe Zdun * xotcl.c: parameter defaults for (per-class) mixins are evaluated upon creation * tutorial: documented how to evaluate parameter defaults for obj/class mixins * win-files: adapted to new src directory tree 2001-05-15 * xotcl.c: fix for colon checking to determine parent namespace * xotcl.c: Object and Class create returns absolute name (with leading ::) 2001-05-15 Uwe Zdun * xotcl.c: fix for checking in parent namespace 2001-05-10 * doc update (formatting, info instproc, ismetaclass and isclass) * xotcl.c: argument for ismetaclass and isclass is now optional * xotcl.c: checking for namespace parent in object creation to avoid crash * Httpd.xotcl: fix for ie 5.5 under win98, POST has not always contentlength set 2001-04-14 * xotcl.c: don't call unknown for dash-commands on class objects to avoid errors like "Class C -superClass Object" that lead to object creation in earlier versions * first version of xoman * Httpd.xotcl: new method replyErrorMsg; replyCode does not produce HTML messages by itself 2001-04-07 * Access.xotcl: added :: in front of global objects, more robust * using namespace for soap, implifying interface 2001-04-03 Uwe Zdun * xotcl::comm::httpd: added error code 500 {Server Error}, errorReply hook in replyCode added to be able to prevent HTML error response. 2001-04-03 * xotcl::comm::httpAccess: user-agent string more generic 2001-03-27 Uwe Zdun * xotcl.c: added inheritance feature for instinvars * xotcl.c: standard cleanup now destroy aggregated children * testx.xotcl: tests for both new features in xotcl.c 2001-03-26 * version number in xotcl references to allow multiple xotcl-versions to coexist * various changes to accommodate bitkeeper * package.xotcl: fixes for argument passing (thanks to Artur Trzewik) * Httpd.xotcl: better error messages containing referer for files which are not found on the server. 2001-03-22 Uwe Zdun * xotcl.c: "cleanup" does not receive args anymore * xoXML.xotcl: used [self class] for parser autoname 2001-03-19 * removed dependencies form wafecompat * Sccs support added to makefiles * documentation for mixins updated * decode POST moved before "respond" to ease overloading ----------------------------------------------------------------------------- 2001-03-09 2001-03-09 Uwe Zdun * release of Version 0.84 2001-03-09 * removed "exec date" from tests to ensure win compatibility * fixed regression tests under win: don't use dependencies on time-zones, fixed ordering problems and HTML bugs 2001-03-08 * fixed a few bugs in xodoc * documentation for apps/utils/* * package name xotcl::store::storage changed to xotcl::store * PCache uses new Storage interface * new predefined object ::xotcl::rcs to extract info from RCS strings (methods date and version) 2001-03-07 Uwe Zdun * xotcl.c: Mutex patch for exit handlers in MT apps by Zoran Vasiljevic * xotcl.c: self next implemented ... enables callstack information for the "next" method * Persistent.test: bench test reduced to 272 * tutorial/langref: documented new functionalities 2001-03-06 Uwe Zdun * htmllib.xotcl: integrated new version with HtmlBuilder; thanks to Antti Salonen. * package names: changed all package names to convention that names are starting with lower cases. Separated names with :: prefixes. For now, these names are just chosen to avoid name clashes, in 0.85 they will probably be used as basis for a hierarchical component model. 2001-03-05 Uwe Zdun * metadataAnalizer: split into dynamic and static variant (static is used for xodoc 2001-03-02 Uwe Zdun * xotcl.c: moved callstack information (calledproc, calledclass, callingproc, callingobject, callingclass, regclass) from info to self; e.g. use in a filter instead of [[self] info calledproc] from now on [self calledproc] * testx.xotcl: integrated callstack information changes. 2001-03-01 Uwe Zdun * complete installation and test suite for Windows, i.e. doc, packages, all tests, install, etc. now function on Windows platforms * XOTclSdbm ported to Windows * Expat xotcl version running on Windows * xotclsh.1, xowish.1 man pages added 2001-02-27 * new global variables for configuration and logging ::xotcl::confdir ~/.xotcl ::xotcl::logdir $::xotcl::confdir/log * new script daemon.xotcl for starting/stopping xotcl scripts in the background 2001-02-22 Uwe Zdun * xoDoc.xotcl, metadataAnalyzer.xotcl: added documentation and handling for "abstract" methods, and corrected bugs in html appearance 2001-02-22 * xotkAppInit.c: added static package Tk 2001-02-22 Uwe Zdun * splitted xodoc.xotcl into a generic static metadata analyzer (metadataAnalyzer.xotcl) and the HTML documentation part (xodoc.xotcl). * htmllib.xotcl: incorporated fishpool's html lib for use in xodoc; thanks to Antti Salonen. 2001-02-17 * Serializer.xotcl: new package for serialization of workspace contents (Classes and Objects). Serialization of full workspace: Serializer s s serializeWs ?filename? Serialization of Object or Class s serialize ObjectOrClass * bugfix in mixins * xotcl.c: tidying up 2001-02-10 * xotcl.c: some speed improvements (next without args more than twice as fast due to moving arguments to the stack, caching of stack pointers) 2001-02-08 Uwe Zdun ! xotcl.c: Removed mixin init logic. Mixin & instmixin inits are only called if the mixin is registered for the object during initialization. Beforehand "mixin" has called init, when it wasn't called before. This was inconsistent with behavior of class and instmixin. 2001-02-06 Uwe Zdun * xotcl.c, testx.xotcl, ...: tests for new destroy logic 2001-02-04 * xotcl.c: cleanup and various simplifications ! using xotcl namespace for: version, lib, check_library_path, interp, trace, deprecated, mkindex, load, namespace_copyvars, namespace_copycmd potential incompatibility: use ::xotcl::version instead of ::xotcl_version! 2001-02-01 Uwe Zdun * xotcl.c: new destroy logic with recreate 2001-01-26 Uwe Zdun * Persistence.xotcl: - persistenceMgr now uses child object as storage - persistent arrays bug fixed, lazy persistent arrays added - added persistent arrays to test 2001-01-25 Uwe Zdun * xotcl.c: class redefinition logic instead of direct command destroy added to solve destroy problems identified by Kristoffer Lawson. 2001-01-24 Uwe Zdun * xotcl.c: fixed alias bug identified by Kristoffer Lawson. 2001-01-22 * fixed regression test for new path settings * removed Unix dependencies from regression test (sleep) 2001-01-18 Uwe Zdun * all storages: added nextkey + firstkey methods for traversal of DBs 2001-01-17 Uwe Zdun ! all packages: all internal distribution package names now start with "xotcl::" to avoid name clashes with other packages 2001-01-16 Uwe Zdun * XOTclGdbm: added XOTcl Gdbm wrapper 2001-01-15 Uwe Zdun * xotcl.c: alloc now handled as a Class instproc, like create. Thanks to Kristoffer Lawson for the hint. 2001-01-15 * new Interface for persistent storage Class Storage Storage abstract instproc open filename Storage abstract instproc close {} Storage abstract instproc exists key Storage abstract instproc set {key ?value?} Storage abstract instproc unset key Storage abstract instproc names {} 2001-01-12 Uwe Zdun * Storage test suite added 2001-01-09 Uwe Zdun * Makefiles: generic makefile for expat, gdbm, ... in the style of XOTcl's Makefile + fed by toplevel configure * packages/store/XOTclSdbm: sdbm wrapper for XOTcl 2001-01-08 * The search for the XOTcl library is performed according to the following rules: 1) If the environment variable XOTCL is set and points to a directory, it is taken as the XOTCL directory. 2) If the auto_path (determined in part by the environment variable TCLLIBPTH) contains a directory named "xotcl" and it exists, it is taken. 3) If no xotcl library is determined yet, check whether the current directory is in an xotcl source tree. If yes take it. 4) If the auto_path contains a directory, that has a sub-directory named xotcl, it is taken. 5) If the auto_path contains a directory that has a directory named xotcl as a neighbor, it is taken. 6) Take the compiled-in path for the xotcl library. After the search for the XOTcl library the global Tcl variable ::xotcl::lib is set to the determined directory. This directory is added automatically to the ::auto_path if necessary. 2000-12-15 * packages/make.xotcl: passing target to avoid grep through Makefile 2000-12-15 * packages/make.xotcl: less verbose * new environment variable XOTCL, points to directory where the XOTcl library lives 2000-12-13 * packages...Httpd.xotcl: close connection after errors * packages...Httpd.xotcl: elementary support for HTTP method OPTIONS 2000-12-04 * xoXML: fix info vars instvar method creates variable that is not accessible and should not be listed in info vars 2000-12-04 * version changed to 0.84 * xoXML: fix for multiple PCDATA calls after one element ----------------------------------------------------------------------------- 2000-11-30 2000-11-30 Uwe Zdun * release of Version 0.83 2000-11-30 Uwe Zdun * xoXML/xoRDF: added the ability to process mixed content PCDATA (i.e. more than one pcdata in one element) 2000-11-29 Uwe Zdun * src/lib/soccerClub.xotcl: simple introductory example for the tutorial * xotcl.c: corrected assertion checking: built in commands that affect assertions are not checked (check, info, proc, instproc, invar, and instinvar). Otherwise we can not react on a broken assertion in the error handler (& documented this stuff in the tutorial). 2000-11-29 * tried to improve documentation tool * work on xotcl homepage, manual section added 2000-11-28 * apps/actiweb-apps/univ/ added (example for RDF) * packages/make.xotcl extended for test in apps directory * HtmlPlace.xotcl: allowExit method added for HtmlPlace to allow an actiweb place to terminate via URL (primarily for regression tests, which require no kill anymore, now platform independent) * Httpd.xotcl: logging of contains more detailed information * HttpPlace.xotcl: added HTTP errors (invalid requests for actiweb are correctly noted in log files) 2000-11-28 Uwe Zdun * xotcl.c: Removed theClasses/theObjecs hashtable, because they caused some problems in exit handling (thanks to Catherine Letondal for the hint), * xotcl.c: fixed all remaining memory leaks in tests (thanks to Zoran Vasiljevic for helping us out with purify) * tutorial.html: added documentation for @ 2000-11-27 * src/Makefile.in: changed logic for building and installing xowish * xotcl.c: fixed bug in "info mixins" 2000-11-24 * Access.xotcl: overhaul, uses now exits method instead of 'info exists' * packages/xml/xml.xotcl: overhaul of the introductory XML-parser example * predefined.xotcl: new predefined method of Object: vwait (Tcl semantics) * some tuning to avoid speed penalties * src/Makefile.in: added some dependencies 2000-11-24 Uwe Zdun * xotcl.c: removed internal mem leaks reported by dmalloc * xotcl.c: corrected assertion checking for built-in commands, like set * xotcl.c, xotclMetaData.c: put metadata into own file + made them deprecated -> use @ instead * testx.xotcl, testo.xotcl: used @ instead of metadata * tutorial.html: reworked the tutorial, added instmixins 2000-11-22 * dmalloc defines added to Makefile.in * xotcl.c: removed some mem leaks 2000-11-22 * documented various sample applications * fixed problems with pipes for xocomm.test (should work now under windows as well) * polished output from xodoc * extended sample webserver to return info about the current request and provided means for stopping it remote. 2000-11-22 Uwe Zdun * configure.in: added ""'s around -z tests and added --without-gdbm support (thanks to Catherine Letondal for the hint) * package/store/persistenceExample.xotcl added as a basic persistence store example. 2000-11-21 Uwe Zdun * xotcl.c: corrected infinite loop in instvar assertions (thanks to Zoran Vasiljevic for the hint) 2000-11-20 Uwe Zdun * xotcl.c/xotclInt.h: moved the global objects and a static variable to interpreter structure (thanks to Zoran Vasiljevic for the patches) * xotcl.c correctes mem leak in "mixin" method (thanks to Zoran Vasiljevic for the hint) 2000-11-03 * MimeTypes can be specified for certain filenames via Mime set nameTable(ChangeLog$) text/plain where the index is treated as a regular expression * rpm target added to Makefile * rpm files added to www.xotcl.org * removed file installed to / from binary distribution 2000-11-15 Uwe Zdun * xotcl.c: corrected deletion order for aggregated children: child destructor is called before parent's destructor * Makefile.in: removed "-full-" from filename 2000-11-03 Various changes to HttpPlace.xotcl and Httpd.xotcl * access control for HttpPlaces * new instance variable "user" in Worker for authenticated requests * access to ordinary files (and not only to WebObjects) from HttpPlaces (if there is no object with the name of the file) * worker added as a argument to credentialsNotOk 2000-10-28 Uwe Zdun * testx.xotcl: added tests for instmixins 2000-10-26 Uwe Zdun * xotcl.c: added instmixins 2000-10-13 * new global variable xotcl_version in analogy to tcl_version * fixed parameter passing to init for multiple arguments (not starting with a "-") * added regression test * fix bug for variable name aliasing in the instvar method ----------------------------------------------------------------------------- 2000-10-09 Uwe Zdun * prepared Version 0.82 2000-10-06 Uwe Zdun * experimental tests for actiweb apps (invoke with 'make test' at toplevel) 2000-10-02 Uwe Zdun * Documented xotcl.c + src/lib and src/scripts directories 2000-09-29 Uwe Zdun * xodoc.xotcl new XOTcl documentation package .. all docs are now in file docs, with @ object 2000-09-28 Uwe Zdun !! xotcl.c removed aggregation short form due to incompatibilities with unknown. I.e., [self] Class x does not function like Class [self]::x anymore, but triggers the unknown mechanism. * removed bug: parameters have tried to call "-1" default value as method 2000-09-26 Uwe Zdun !! src/xotcl.c: short form for creation of nested object and classes removed. * new documentation tool 2000-09-22 * new configure flags: --with-gdbm=INCDIR,LIBDIR --with-tk=INCDIR,LIBDIR --with-tcl=INCDIR,LIBDIR 2000-09-19 * apps/actiweb-apps/FormsWithState.xotcl: new example script for implementing a multi-page form which keeps the state in a context object, which is passed from form to form via hidden form fields * new toplevel configure file * toplevel "make install" copies demo apps as well (should we set the path to xotclsh in first line?) 2000-09-13 Uwe Zdun * xotcl.c: added new format functionality to autoname. % strings are now recognized as in the Tcl "format" command. E.g.: autoname a%06d --> a000000, a000001, a000002, .. * rdf/xoRDF.test, rdf/RDFTriple.xotcl: used new autonames here in order to make triples sort-able with lsort 2000-09-12 * Httpd.xotcl: Fixed a bug for IE5.5 with persistent connections: (Server blocked); cause: the Tcl command "fcopy" alters the blocking state of a socket when it finishes (bug in fcopy of tcl 8.3.2) 2000-09-12 Uwe Zdun * xotcl/src: added xotclInt.h as XOTcl internal API (still incomplete) * xotcl.c: - extracted xotclProfile.c, xotclReference.c, xotclTrace.c, and xotclError.c from xotcl.c, - started conversion to Tcl-like naming convention for functions: XOTcl... for internal API, XOTcl_... for external API 2000-09-07 Uwe Zdun * xoXML.xotcl: removed need for empty topNode * xoRDF.xotcl/RDFTriple.xotcl: Uniform Parse Tree - abbrev properties and parseType = resource are now parse into descriptions - class hierarchy uniformized to resources and properties ... object names are either prop.. or res.. - resource types are stored in rdftypes variable (as a list of types) - Typed nodes are parsed into description + type - namespace definition at RDF tag recognized - hard coded "rdf:" removed (now rdfNSPrefix is stored on each node, the parser has a rdfNamespace parameter) 2000-09-06 * packages/store/Persistence.xotcl: lazy open for persistence database added (to avoid creation of not needed files, when no persistent variables are used, and to reduce permission problems for creation, opening, etc) 2000-09-04 Uwe Zdun * xotcl.c, Makefile.vc: INST_XOLIBPKG, XOTCLVERSION passed to VC 6.0 preprocessor from Makefile.vc (thanks to David LeBlanc for the fix) 2000-09-04 * xoRDF: trivial fix for make numbering of anonymous resources easier to comprehend * predefined.xotcl: methods "append" and "lappend" added * xotcl/Makefile: keeps track of configure.in and reconfigures if necessary (eg. version change) * new -reset option for autoname (does currently not work with -instance) 2000-08-31 Uwe Zdun * xoRDF: added subject ID to anonymous descriptions & fixed bugs 2000-08-30 Uwe Zdun * xotcl.c: fixed xotcltrace * trace.xotcl: "deprecated messages" show* fixed 2000-08-19 * toplevel Makefile: target "make test" added 2000-08-16 * RDFTriple got a new method "prettyTriples" which uses indentation to show connections between triples (used in xoRDF.test) 2000-08-11 * apps/xocomm/webserver.xotcl listens on port 9086 as well to test basic access control * packages/make.xotcl -test added * Access.xotcl: fixes for credentials, timing for SimpleRequest now optional (-timing 1, default is -timing 0) * new files: packages/comm/xocomm.test, packages/rdf/xoRDF.test * Ftp fixed for now Access methods * "Class instproc newChild" and "Class instproc new" added 2000-08-09 * untested C-API placed between #ifdef * dead code removed * all internal calls to destroy handled by a single function "callDestroyMethod" * target "xref" added to xotc/src/Makefile (needs free program xref to be installed) 2000-08-08 * new instcommand "exists" to check whether a variable exists (no need to use namespaces or instvar to check for the existence of variables) * xotcl.c: using new macros VarFrameDecls VarFrameSwitchToObj(in,obj) VarFrameRestore(in) to change VariableFrames (speedup mand making code more uniform) * returning int objects instead of string objects * using new features obove led to more than 20% speedup on RDF benchmark. * regression and speed test xotcl/src/lib/speedtest.xotcl added 2000-08-07 * HTML Form interface changed, form arguments are not longer appended to call * new methods for WebObj: getWorker and getFormData to access worker internals and form data * some minor speed improvements 2000-08-01 !! more thorough checks for object names (no ":", no "::", no ":[^:].+", no ".+:", no ".*NAME::[:]+NAME") * copy and move methods create no invalid names that must be fixed by Object creation !! methods called via "-" syntax must start with an alphanum character * Object creation 10% faster * apps/actiweb-apps/MC.xotcl uses POST instead of GET 2000-07-27 !!! info children returns fully qualified object names !!! info classchildren returns fully qualified object names !!! info filter returns function names without class paths * fixed composite attributes in RDF * some speed improvements * parameter passing from FORMs to WebObjects via parameter objects * HtmlPlace has a default method that lists all exported objects * Mime component added * multipart-form data code added to Httpd 2000-06-26 * version number increased to 0.82 * automated version number management * test client and server for tls added * minor changes for TLS * minor fixes for Tcl 8.4a * including certificates 2000-06-20 Uwe Zdun * packages/mos/Agent.xotcl: - migrate bug -- 'self' called after destroy of migrate -- corrected - support for synchronous invoke, clone, and migrate added in addition to async methods * AgentClient/Receiver: example enhanced with class cloning and sync invoke, clone, and migrate ----------------------------------------------------------------------------- 2000-06-05 XOTcl 0.81 Release -- Major Changes to Version 0.80 - changelog started by Uwe Zdun * xotcl.c: - deep copy/move with all language features - renamed "parameters" to "parameter" - renamed "info filters" and "info mixins" to "info filter"/ "info mixin" - added deprecated error message - added "xotcl_interp" command to start an XOTcl slave interp - better "package" support and integration - linearizing of per-object mixin hierarchy with ordinary class hierarchy - isobject, isclass, and ismetaclass with identical interface: all have the obj/cls in question as argument - reference tracing with "info reference", "info referencedby" added - internal xotcl-lib now in predefined.xotcl -> make file automatically creates predefined.h * toplevel-configure added * Actiweb: - early alpha preview for code mobility, registry, web objects added. be careful: the APIs will most likely change in the future - SSL Place * HTTPserver/access: - Open SSL support * xoXML/xoRDF: - RDF Typed Node support - Parsing of several top nodes at once -> mixing of XML and RDF easier - Tests integrated and several new tests - XML/RDF recreation added * xoStore: - Support for tclgdbm added -- thanks to Stefan Vogel for providing the Win version of gdbm ./xotcl-1.6.8/._COMPILE000644 000765 000024 00000000430 12161600406 015041 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/COMPILE000644 000765 000024 00000011015 12161600406 014625 0ustar00neumannstaff000000 000000 $Id: COMPILE,v 1.2 2004/08/17 10:12:54 neumann Exp $ ******************************************************** XOTcl Compilation Guide (Unix) ******************************************************** Note, that there is a file "COMPILE.win" describing Windows compilation. Read this file, if you plan to build XOTcl under Windows. First, you have to get the necessary sources: - Before you can start, you have to get the full sources of XOTcl. These are packed in a tar.gz file, like xotcl-XXXXX.tar.gz, and they are available from: http://www.xotcl.org - To compile XOTcl the sources of Tcl (and optionally Tk) are needed. Tcl (and optionally Tk) must be installed properly. You get the Tcl/tk sources from: www.tcl.tk The best is to unpack and compile Tcl (and optionally Tk) in the same directory as XOTcl, so that XOTcl's configure can find it automatically. For compilation instruction see Tcl's documentation. The following steps have to be performed in order to build XOTcl: 1) untar XOTcl in a directory of your choice by using one of: gunzip < xotcl-XXXXX.tar.gz | tar -xvf - or on some systems: tar xvfz xotcl-XXXXX.tar.gz 2) run configure by issuing in the unix directory: cd xotcl* ./configure on some platforms (e.g. under Windows Environment with CygWin) you may have to type in "sh configure" explicitly. If you have Tcl, Tk, and XOTcl built in your home directory and you want to install in standard locations, a simple configure without arguments should be sufficient. You can avoid searching/override the settings with the follwoing switches: --prefix=DIR Place where lib/packages are to be installed (default: /usr/local) --exec-prefix=DIR Place where xotclsh/xowish are to be installed (default: /usr/local) --with-actiweb Build Actiweb packages as well (sdbm, expat) (per default deactivated) --with-xotclsh Build xotclsh (per default deactivated) --with-xwish Build xowish (per default deactivated) --with-gdbm=GDBM_INCLUDE_DIR,GDBM_LIB_DIR absolute path to gdbm.h and optionally the path to the gdbm library. The directory infos may be omitted --with-tcl=DIR Where to find a compiled Tcl version, i.e. where to find tclConfig.sh Note that you need a source built of Tcl (including generic/tclInt.h)! --with-tk=DIR Where to find a Tk version, i.e. where to find tkConfig.sh. An installed version is sufficient. It must be the same Tk version as the version of the used Tcl. --with-tk-include=DIR directory containing the public Tk header files --with-all Turns on all options (actiweb, gdbm, xotclsh, xowish) NOTE: the directories specified by DIR should not be addressed relatively: be sure to use only absolute path names (those starting with "/") only. NOTE: Tcl (and Tk if you build xowish) have to be installed. You require a Tcl source build (of the same version as installed) as well. Example: ./configure --prefix=/usr --exec-prefix=/usr --with-all --enable-threads 3) now you can make XOTcl and the configured packages with make which should be actually a GNU make (sometimes called gmake). There are a couple of compiler options, that can make the compiled binary faster. On a Pentium 4 PC under Linux, i would recommend to compile with make CFLAGS_DEFAULT='-O3 -mcpu=i686 -Wall -fomit-frame-pointer' 4) install with: make install If you only want to build/install xotcl/xowish without packages you can switch to xotcl-XXX directory and do there: ./configure make make install You can test XOTcl by switching to the src directory and by running: make test Good Luck! Please report bugs and problems to the authors under one of these mail adresses: uwe.zdun@wu-wien.ac.at, zdun@xotcl.org gustaf.neumann@wu-wien.ac.at, neumann@xotcl.org ./xotcl-1.6.8/._COMPILE.win000644 000765 000024 00000000430 12161600406 015635 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/COMPILE.win000644 000765 000024 00000004300 12161600406 015420 0ustar00neumannstaff000000 000000 $Id: COMPILE.win,v 1.1 2004/05/23 22:50:39 neumann Exp $ ******************************** XOTcl Windows compilation guide: ******************************** - Consider to get a binary distribution of XOTcl from: http://www.xotcl.org - XOTcl compiles with the Visual CC Compiler Visual CC Compilation: ********************** In order to compile with VCC the following steps have to be performed: 1) Get tcl/tk sources, compile tcl and/or tk, and install them properly. To compile XOTcl the sources of Tcl (and optionally Tk) are needed. Tcl (and optionally Tk) must be installed properly. You get the Tcl/tk sources from: www.tcl.tk For compilation instruction see Tcl's documentation. 2) Set the PATH environment to the Tcl binary directory. For instance in the DOS box you may write something like: SET PATH=c:\Progra~1\Tcl\bin;%PATH% where "c:\Progra~1\Tcl\bin" is the Tcl binary directory. 3) Before you can start, you have to get the full sources of XOTcl. These are packed in a tar.gz file, like xotcl-XXXXX.tar.gz, and they are available from: http://www.xotcl.org Untar the xotcl source. You can do it using a program like Winzip or with the tar command (e.g. in the cygwin distrbution). Change into the win directory. cd win Open the file "configs.vc". Edit the first lines with the path information for your system, i.e., where to find tcl and tk sources and where to find the VCC compiler, and where tcl/tk binaries are installed. 4) In the 'win' directory, invoke: nmake -f makefile.vc to compile xotcl.dll, XOTclSdbm, and Expat. Moreover, package information and XOTcl documentation will be built. You can build the xotclsh/xowish (per defaul deactivated), if you need them: nmake -f makefile.vc xotclshells 5) Optionally, you may test the XOTcl build: nmake -f makefile.vc test 6) Now you can install XOTcl with: tclsh83 installWin.tcl More installation notes can be found in the README file. Please report bugs and problems to the authors under one of these mail adresses: uwe.zdun@wu-wien.ac.at, zdun@xotcl.org gustaf.neumann@wu-wien.ac.at, neumann@xotcl.org ./xotcl-1.6.8/._configure000755 000765 000024 00000000430 12327772602 015751 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/configure000755 000765 000024 00001104772 12327772602 015553 0ustar00neumannstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for xotcl 1.6.8. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: xotcl@alice.wu-wien.ac.at about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='xotcl' PACKAGE_TARNAME='xotcl' PACKAGE_VERSION='1.6.8' PACKAGE_STRING='xotcl 1.6.8' PACKAGE_BUGREPORT='xotcl@alice.wu-wien.ac.at' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS CONFIG_CLEAN_FILES TEA_PLATFORM apps_actiweb libdirs_actiweb test_actiweb XOTCL_BUILD_INCLUDE_SPEC XOTCL_BUILD_INCLUDE_DIR XOWISH XOTCLSH XOTCL_SRC_DIR XOTCL_STUB_LIB_PATH XOTCL_BUILD_STUB_LIB_PATH XOTCL_STUB_LIB_SPEC XOTCL_BUILD_STUB_LIB_SPEC XOTCL_LIB_SPEC XOTCL_BUILD_LIB_SPEC UNSHARED_LIB_SUFFIX SHARED_LIB_SUFFIX pkgincludedir pkglibdir pkgdatadir PKG_DIR XOTCL_COMPATIBLE_TCLSH TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS TCL_TOP_DIR_NATIVE TCL_INCLUDES PKG_OBJECTS PKG_SOURCES aol_prefix MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL_SCRIPT INSTALL_PROGRAM INSTALL_DATA INSTALL CPP TK_INCLUDES TK_XINCLUDES TK_LIBS TK_STUB_LIB_SPEC TK_STUB_LIB_FLAG TK_STUB_LIB_FILE TK_LIB_SPEC TK_LIB_FLAG TK_LIB_FILE TK_SRC_DIR TK_BIN_DIR TK_VERSION TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION XOTCL_RELEASE_LEVEL XOTCL_MINOR_VERSION XOTCL_MAJOR_VERSION XOTCL_VERSION subdirs PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_gdbm with_aolserver3 with_actiweb with_xotclsh with_xowish with_all with_expat with_tcl with_tk with_tkinclude with_tclinclude enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures xotcl 1.6.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/xotcl] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of xotcl 1.6.8:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gdbm=GDBM_INCLUDE_DIR,GDBM_LIB_DIR absolute path to gdbm.h and optionally the path to the library, --without-gdbm disables build of Tcl Gdbm --with-aolserver3=AOL_SERVER_DIR, (containing include ,...) --without-aolserver3 disables build of AOLserver 3 module --with-actiweb=yes|no, --without-actiweb disables actiweb components --with-xotclsh=yes|no, --without-xotclsh disables built of xotclsh --with-xowish=yes|no, --without-xowish disables built of xowish --with-all=yes|no, --without-all disables built of all --with-expat=sys assumes a system-wide expat installation, --with-expat= point to a custom expat installation, --without-expat falls back to the bundled expat installation --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) --with-tkinclude directory containing the public Tk header files --with-tclinclude directory containing the public Tcl header files --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF xotcl configure 1.6.8 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------------- ## ## Report this to xotcl@alice.wu-wien.ac.at ## ## ---------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by xotcl $as_me 1.6.8, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows". #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- # Check whether --with-gdbm was given. if test "${with_gdbm+set}" = set; then : withval=$with_gdbm; with_gdbm=$withval else with_gdbm=no fi # Check whether --with-aolserver3 was given. if test "${with_aolserver3+set}" = set; then : withval=$with_aolserver3; with_aol3=$withval else with_aol3=no fi # Check whether --with-actiweb was given. if test "${with_actiweb+set}" = set; then : withval=$with_actiweb; with_actiweb=$withval else with_actiweb=no fi # Check whether --with-xotclsh was given. if test "${with_xotclsh+set}" = set; then : withval=$with_xotclsh; with_xotclsh=$withval else with_xotclsh=no fi # Check whether --with-xowish was given. if test "${with_xowish+set}" = set; then : withval=$with_xowish; with_xowish=$withval else with_xowish=no fi # Check whether --with-all was given. if test "${with_all+set}" = set; then : withval=$with_all; with_all=$withval else with_all=no fi # Check whether --with-expat was given. if test "${with_expat+set}" = set; then : withval=$with_expat; with_expat=$withval else with_expat=bundle fi subdirs="" if test "$with_all" = yes; then with_actiweb=yes with_xotclsh=yes with_xowish=yes with_gdbm=yes fi if test "$with_actiweb" = yes; then test_actiweb="test-actiweb" libdirs_actiweb="actiweb rdf registry store xml patterns" apps_actiweb="actiweb persistence" subdirs="$subdirs library/store/XOTclSdbm/" if ! test "$with_gdbm" = no; then subdirs="$subdirs library/store/XOTclGdbm/" fi subdirs="$subdirs library/xml/TclExpat-1.1/" else test_actiweb="" libdirs_actiweb="" apps_actiweb="" if ! test "${with_expat}" = bundle ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: WARNING: expat configuration ${with_expat} ignored" >&5 $as_echo "WARNING: expat configuration ${with_expat} ignored" >&6; } with_expat="bundle" fi fi if test "$with_tk" = no; then with_xowish="" ; fi if test "$with_xotclsh" = yes; then XOTCLSH="xotclsh" ; else XOTCLSH=""; fi if test "$with_xowish" = yes; then XOWISH="xowish" ; else XOWISH=""; fi #-------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. The NODOT_VERSION is # required for constructing the library name on systems that don't like # dots in library names (Windows). The VERSION variable is used on the # other systems. #-------------------------------------------------------------------- # do not modify the following lines manually, they are generated with changeXOTclVersion XOTCL_MAJOR_VERSION=1 XOTCL_MINOR_VERSION=6 XOTCL_RELEASE_LEVEL=.8 XOTCL_VERSION=${XOTCL_MAJOR_VERSION}.${XOTCL_MINOR_VERSION} NODOT_VERSION=${XOTCL_MAJOR_VERSION}${XOTCL_MINOR_VERSION} echo "Configuring XOTcl Version $PACKAGE_VERSION" #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # check for TK #-------------------------------------------------------------------- if test "$with_xowish" = yes; then # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk was given. if test "${with_tk+set}" = set; then : withval=$with_tk; with_tkconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk configuration" >&5 $as_echo_n "checking for Tk configuration... " >&6; } if ${ac_cv_c_tkconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" as_fn_error $? "Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh" "$LINENO" 5 else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "found ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo_n "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... " >&6; } if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TK_BIN_DIR}/tkConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) $as_echo "#define MAC_OSX_TK 1" >>confdefs.h TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi # TEA specific: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk public headers" >&5 $as_echo_n "checking for Tk public headers... " >&6; } # Check whether --with-tkinclude was given. if test "${with_tkinclude+set}" = set; then : withval=$with_tkinclude; with_tkinclude=${withval} fi if ${ac_cv_c_tkh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else as_fn_error $? "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then as_fn_error $? "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tkh}" >&5 $as_echo "${ac_cv_c_tkh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${INCLUDE_DIR_NATIVE}" >&5 $as_echo "${INCLUDE_DIR_NATIVE}" >&6; } fi # TEA_PATH_X fi #-------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" INSTALL_DATA="\${INSTALL} -m 644" INSTALL_PROGRAM="\${INSTALL}" INSTALL_SCRIPT="\${INSTALL}" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #-------------------------------------------------------------------- # check for extra flags # # FORCE_NO_STUBS is deactivated for now if ! test "$with_aol3" = "no"; then echo "Pre-configuring AOL-Server (xotcl)" AOL_DEFINES="-DAOL_SERVER -DUSE_TCL8X -I$with_aol3/include -I$TCL_SRC_DIR/generic" FORCE_NO_STUBS=1 else AOL_DEFINES="" FORCE_NO_STUBS=0 fi aol_prefix="/usr/local/aolserver" if test -d "${prefix}/modules/tcl" ; then aol_prefix="${prefix}" ; fi #-------------------------------------------------------------------- # check for tclCompile.h (needed, when compiled without full source) if test -f "$TCL_SRC_DIR/generic/tclCompile.h"; then HAVE_TCL_COMPILE_H="-DHAVE_TCL_COMPILE_H=1" else HAVE_TCL_COMPILE_H="" fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- vars="xotcl.c xotclError.c xotclMetaData.c xotclObjectData.c xotclProfile.c \ xotclTrace.c xotclUtil.c xotclShadow.c xotclCompile.c aolstub.c xotclStubInit.c" for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="generic/xotcl.h generic/xotclInt.h generic/xotclDecls.h generic/xotclIntDecls.h" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS -DXOTCLVERSION=\\\"$XOTCL_VERSION\\\" -DXOTCLPATCHLEVEL=\\\"$XOTCL_RELEASE_LEVEL\\\" \ $AOL_DEFINES $HAVE_TCL_COMPILE_H" vars="xotclStubLib.c" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done #-------------------------------------------------------------------- #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This must be done AFTER calling TEa_PATH_TCLCONFIG/TEA_LOAD_TCLCONFIG # so that we can extract TCL_SRC_DIR from the config file (in the case # of private headers #-------------------------------------------------------------------- #TEA_PUBLIC_TCL_HEADERS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl private include files" >&5 $as_echo_n "checking for Tcl private include files... " >&6; } TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then as_fn_error $? "Cannot find private header tclInt.h in ${TCL_SRC_DIR}" "$LINENO" 5 fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${result}" >&5 $as_echo "${result}" >&6; } #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_xotcl in this case) so # that we create the export library with the dll. See sha1.h on how # to use this. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # Define any extra compiler flags in the PACKAGE_CFLAGS variable. # These will be appended to the current set of compiler flags for # your system. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then $as_echo "#define BUILD_xotcl 1" >>confdefs.h if test "$GCC" != "yes" ; then $as_echo "#define VISUAL_CC 1" >>confdefs.h fi CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc50.pch vc60.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/w else CLEANFILES="*.o *.a *.so *~ core gmon.out" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32 #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # Without the following two eval statements, XOTCL_SHARED_LIB_SUFFIX # in xotclConfig.sh has $PACKAGE_VERSION unresolved. When another # app links against xotcl, the PACKAGE_VERSIONs are confused. # # Without the first eval, we get # XOTCL_SHARED_LIB_SUFFIX=${PACKAGE_VERSION}\$\{DBGX\}${SHLIB_SUFFIX} # XOTCL_UNSHARED_LIB_SUFFIX=${PACKAGE_VERSION}\$\{DBGX\}.a # # after the first eval, we get # XOTCL_SHARED_LIB_SUFFIX=1.2.1${DBGX}.so # XOTCL_UNSHARED_LIB_SUFFIX=1.2.1${DBGX}.a # after the second eval, all variables are resolved. eval "SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}" eval "UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}" #eval "SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}" #eval "UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}" #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols # option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. #-------------------------------------------------------------------- #if test "${TCL_MAJOR_VERSION}" = "8" -a "${TCL_MINOR_VERSION}" = "0"; then # FORCE_NO_STUBS=1 #fi if test "${FORCE_NO_STUBS}" = "0" ; then $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } # make this available, for such as xotclConfig.sh XOTCL_COMPATIBLE_TCLSH=${TCLSH_PROG} # resolve the variables eval "libdir=${libdir}" eval "datadir=${datadir}" eval "includedir=${includedir}" PKG_DIR="${PACKAGE_NAME}${PACKAGE_VERSION}" pkgdatadir="${datadir}/${PKG_DIR}" pkglibdir="${libdir}/${PKG_DIR}" # make sure this is right (then remove this comment) pkgincludedir="${includedir}/${PKG_DIR}" # # XOTcl specific configs # if test "${TEA_PLATFORM}" != "windows" ; then XOTCL_BUILD_LIB_SPEC="-L`pwd` -lxotcl${PACKAGE_VERSION}" XOTCL_LIB_SPEC="-L${pkglibdir} -lxotcl${PACKAGE_VERSION}" # stub libs are not build for 8.0 if test "${TCL_MAJOR_VERSION}" = "8" -a "${TCL_MINOR_VERSION}" = "0"; then XOTCL_BUILD_STUB_LIB_PATH="" XOTCL_STUB_LIB_PATH="" XOTCL_BUILD_STUB_LIB_SPEC="" XOTCL_STUB_LIB_SPEC="" else XOTCL_BUILD_STUB_LIB_PATH="`pwd`/${PKG_STUB_LIB_FILE}" XOTCL_STUB_LIB_PATH="${pkglibdir}/${PKG_STUB_LIB_FILE}" XOTCL_BUILD_STUB_LIB_SPEC="-L`pwd` -lxotclstub${PACKAGE_VERSION}" XOTCL_STUB_LIB_SPEC="-L${pkglibdir} -lxotclstub${PACKAGE_VERSION}" $as_echo "#define COMPILE_XOTCL_STUBS 1" >>confdefs.h fi else XOTCL_BUILD_LIB_SPEC="`pwd`/${PKG_LIB_FILE}" XOTCL_LIB_SPEC="${pkglibdir}/${PKG_LIB_FILE}" XOTCL_BUILD_STUB_LIB_PATH="`pwd`/${PKG_STUB_LIB_FILE}" XOTCL_STUB_LIB_PATH="${pkglibdir}/${PKG_STUB_LIB_FILE}" XOTCL_BUILD_STUB_LIB_SPEC="`pwd`/${PKG_STUB_LIB_FILE}" XOTCL_STUB_LIB_SPEC="${pkglibdir}/${PKG_STUB_LIB_FILE}" fi XOTCL_SRC_DIR=$srcdir # include dir of xotcl during build process (i.e., does not assume installed) XOTCL_BUILD_INCLUDE_DIR="${XOTCL_SRC_DIR}/generic" XOTCL_BUILD_INCLUDE_SPEC="-I${XOTCL_BUILD_INCLUDE_DIR}" #-------------------------------------------------------------------- # the value of this variable is set to the files which are to be # removed when the user invokes 'make distclean' (i.e., those # files generated by ./configure) and is used in the make distclean # target, defined in Makefile.in #-------------------------------------------------------------------- CONFIG_CLEAN_FILES="Makefile xotclConfig.sh apps/utils/xotclsh apps/utils/xowish unix/xotcl.spec unix/pkgIndex.unix autom4te.cache/" ac_config_files="$ac_config_files Makefile xotclConfig.sh apps/utils/xotclsh apps/utils/xowish unix/xotcl.spec unix/pkgIndex.unix" #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile, # and generate the other output files. (this is done by invoking # config.status) # # NOTE the lack of parameters! AC_OUTPUT with params is deprecated; # use macros such as AC_CONFIG_FILES, AC_HEADER_FILES, etc to add # to the files output by ./configure. #-------------------------------------------------------------------- cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by xotcl $as_me 1.6.8, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ xotcl config.status 1.6.8 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "xotclConfig.sh") CONFIG_FILES="$CONFIG_FILES xotclConfig.sh" ;; "apps/utils/xotclsh") CONFIG_FILES="$CONFIG_FILES apps/utils/xotclsh" ;; "apps/utils/xowish") CONFIG_FILES="$CONFIG_FILES apps/utils/xowish" ;; "unix/xotcl.spec") CONFIG_FILES="$CONFIG_FILES unix/xotcl.spec" ;; "unix/pkgIndex.unix") CONFIG_FILES="$CONFIG_FILES unix/pkgIndex.unix" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi here=${PWD} for subdir in ${subdirs} do echo "==================== configure $subdir =====================" if test x"${srcdir}" = x. ; then confdir=. else mkdir -p $subdir confdir=${srcdir}/$subdir fi (cd $subdir; echo $SHELL ${confdir}/configure ${ac_configure_args} --prefix=${prefix} --with-xotcl=${here}; eval $SHELL ${confdir}/configure ${ac_configure_args} --prefix=${prefix} --with-xotcl=${here}) done ./xotcl-1.6.8/configure.ac000644 000765 000024 00000037745 12327772421 016135 0ustar00neumannstaff000000 000000 #-------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #-------------------------------------------------------------------- #-------------------------------------------------------------------- # __CHANGE__ # This very first macro is used to verify that the configure script can # find the sources. The argument to AC_INIT should be a unique filename # for this package, and can be a relative path, such as: # #-------------------------------------------------------------------- define(XOTclVersion, 1.6.8) AC_INIT([xotcl],[XOTclVersion],[xotcl@alice.wu-wien.ac.at]) AC_CONFIG_AUX_DIR([tclconfig]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows". #-------------------------------------------------------------------- TEA_INIT([3.9]) #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- AC_ARG_WITH([gdbm], [ --with-gdbm=GDBM_INCLUDE_DIR[,GDBM_LIB_DIR] absolute path to gdbm.h and optionally the path to the library, --without-gdbm disables build of Tcl Gdbm], [with_gdbm=$withval], [with_gdbm=no]) AC_ARG_WITH([aolserver3], [ --with-aolserver3=AOL_SERVER_DIR, (containing include ,...) --without-aolserver3 disables build of AOLserver 3 module], [with_aol3=$withval], [with_aol3=no]) AC_ARG_WITH([actiweb], [ --with-actiweb=yes|no, --without-actiweb disables actiweb components], [with_actiweb=$withval], [with_actiweb=no]) AC_ARG_WITH([xotclsh], [ --with-xotclsh=yes|no, --without-xotclsh disables built of xotclsh], [with_xotclsh=$withval], [with_xotclsh=no]) AC_ARG_WITH([xowish], [ --with-xowish=yes|no, --without-xowish disables built of xowish], [with_xowish=$withval], [with_xowish=no]) AC_ARG_WITH([all], [ --with-all=yes|no, --without-all disables built of all], [with_all=$withval], [with_all=no]) AC_ARG_WITH([expat], [ --with-expat=sys assumes a system-wide expat installation, --with-expat= point to a custom expat installation, --without-expat falls back to the bundled expat installation], [with_expat=$withval],[with_expat=bundle]) subdirs="" if test "$with_all" = yes; then with_actiweb=yes with_xotclsh=yes with_xowish=yes with_gdbm=yes fi if test "$with_actiweb" = yes; then test_actiweb="test-actiweb" libdirs_actiweb="actiweb rdf registry store xml patterns" apps_actiweb="actiweb persistence" subdirs="$subdirs library/store/XOTclSdbm/" if ! test "$with_gdbm" = no; then subdirs="$subdirs library/store/XOTclGdbm/" fi subdirs="$subdirs library/xml/TclExpat-1.1/" else test_actiweb="" libdirs_actiweb="" apps_actiweb="" if ! test "${with_expat}" = bundle ; then AC_MSG_RESULT([WARNING: expat configuration ${with_expat} ignored]) with_expat="bundle" fi fi AC_SUBST([subdirs]) if test "$with_tk" = no; then with_xowish="" ; fi if test "$with_xotclsh" = yes; then XOTCLSH="xotclsh" ; else XOTCLSH=""; fi if test "$with_xowish" = yes; then XOWISH="xowish" ; else XOWISH=""; fi #-------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. The NODOT_VERSION is # required for constructing the library name on systems that don't like # dots in library names (Windows). The VERSION variable is used on the # other systems. #-------------------------------------------------------------------- # do not modify the following lines manually, they are generated with changeXOTclVersion XOTCL_MAJOR_VERSION=1 XOTCL_MINOR_VERSION=6 XOTCL_RELEASE_LEVEL=.8 XOTCL_VERSION=${XOTCL_MAJOR_VERSION}.${XOTCL_MINOR_VERSION} NODOT_VERSION=${XOTCL_MAJOR_VERSION}${XOTCL_MINOR_VERSION} AC_SUBST([XOTCL_VERSION]) AC_SUBST([XOTCL_MAJOR_VERSION]) AC_SUBST([XOTCL_MINOR_VERSION]) AC_SUBST([XOTCL_RELEASE_LEVEL]) echo "Configuring XOTcl Version $PACKAGE_VERSION" #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # check for TK #-------------------------------------------------------------------- if test "$with_xowish" = yes; then TEA_PATH_TKCONFIG TEA_LOAD_TKCONFIG TEA_PUBLIC_TK_HEADERS # TEA_PATH_X fi #-------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #-------------------------------------------------------------------- # check for extra flags # # FORCE_NO_STUBS is deactivated for now if ! test "$with_aol3" = "no"; then echo "Pre-configuring AOL-Server (xotcl)" AOL_DEFINES="-DAOL_SERVER -DUSE_TCL8X -I$with_aol3/include -I$TCL_SRC_DIR/generic" FORCE_NO_STUBS=1 else AOL_DEFINES="" FORCE_NO_STUBS=0 fi aol_prefix="/usr/local/aolserver" if test -d "${prefix}/modules/tcl" ; then aol_prefix="${prefix}" ; fi AC_SUBST([aol_prefix]) #-------------------------------------------------------------------- # check for tclCompile.h (needed, when compiled without full source) if test -f "$TCL_SRC_DIR/generic/tclCompile.h"; then HAVE_TCL_COMPILE_H="-DHAVE_TCL_COMPILE_H=1" else HAVE_TCL_COMPILE_H="" fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- TEA_ADD_SOURCES([xotcl.c xotclError.c xotclMetaData.c xotclObjectData.c xotclProfile.c \ xotclTrace.c xotclUtil.c xotclShadow.c xotclCompile.c aolstub.c xotclStubInit.c]) TEA_ADD_HEADERS([generic/xotcl.h generic/xotclInt.h generic/xotclDecls.h generic/xotclIntDecls.h]) TEA_ADD_INCLUDES([]) TEA_ADD_LIBS([]) TEA_ADD_CFLAGS([-DXOTCLVERSION=\\\"$XOTCL_VERSION\\\" -DXOTCLPATCHLEVEL=\\\"$XOTCL_RELEASE_LEVEL\\\" \ $AOL_DEFINES $HAVE_TCL_COMPILE_H]) TEA_ADD_STUB_SOURCES([xotclStubLib.c]) TEA_ADD_TCL_SOURCES([]) #-------------------------------------------------------------------- #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This must be done AFTER calling TEa_PATH_TCLCONFIG/TEA_LOAD_TCLCONFIG # so that we can extract TCL_SRC_DIR from the config file (in the case # of private headers #-------------------------------------------------------------------- #TEA_PUBLIC_TCL_HEADERS TEA_PRIVATE_TCL_HEADERS #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_xotcl in this case) so # that we create the export library with the dll. See sha1.h on how # to use this. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # Define any extra compiler flags in the PACKAGE_CFLAGS variable. # These will be appended to the current set of compiler flags for # your system. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then AC_DEFINE([BUILD_xotcl]) if test "$GCC" != "yes" ; then AC_DEFINE([VISUAL_CC]) fi CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc50.pch vc60.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/w else CLEANFILES="*.o *.a *.so *~ core gmon.out" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi AC_SUBST([CLEANFILES]) #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS # Without the following two eval statements, XOTCL_SHARED_LIB_SUFFIX # in xotclConfig.sh has $PACKAGE_VERSION unresolved. When another # app links against xotcl, the PACKAGE_VERSIONs are confused. # # Without the first eval, we get # XOTCL_SHARED_LIB_SUFFIX=${PACKAGE_VERSION}\$\{DBGX\}${SHLIB_SUFFIX} # XOTCL_UNSHARED_LIB_SUFFIX=${PACKAGE_VERSION}\$\{DBGX\}.a # # after the first eval, we get # XOTCL_SHARED_LIB_SUFFIX=1.2.1${DBGX}.so # XOTCL_UNSHARED_LIB_SUFFIX=1.2.1${DBGX}.a # after the second eval, all variables are resolved. eval "SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}" eval "UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}" #eval "SHARED_LIB_SUFFIX=${SHARED_LIB_SUFFIX}" #eval "UNSHARED_LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}" #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols # option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. #-------------------------------------------------------------------- #if test "${TCL_MAJOR_VERSION}" = "8" -a "${TCL_MINOR_VERSION}" = "0"; then # FORCE_NO_STUBS=1 #fi if test "${FORCE_NO_STUBS}" = "0" ; then AC_DEFINE([USE_TCL_STUBS]) fi #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. #-------------------------------------------------------------------- TEA_PROG_TCLSH # make this available, for such as xotclConfig.sh XOTCL_COMPATIBLE_TCLSH=${TCLSH_PROG} AC_SUBST([XOTCL_COMPATIBLE_TCLSH]) # resolve the variables eval "libdir=${libdir}" eval "datadir=${datadir}" eval "includedir=${includedir}" PKG_DIR="${PACKAGE_NAME}${PACKAGE_VERSION}" pkgdatadir="${datadir}/${PKG_DIR}" pkglibdir="${libdir}/${PKG_DIR}" # make sure this is right (then remove this comment) pkgincludedir="${includedir}/${PKG_DIR}" AC_SUBST([PKG_DIR]) AC_SUBST([pkgdatadir]) AC_SUBST([pkglibdir]) AC_SUBST([pkgincludedir]) # # XOTcl specific configs # if test "${TEA_PLATFORM}" != "windows" ; then XOTCL_BUILD_LIB_SPEC="-L`pwd` -lxotcl${PACKAGE_VERSION}" XOTCL_LIB_SPEC="-L${pkglibdir} -lxotcl${PACKAGE_VERSION}" # stub libs are not build for 8.0 if test "${TCL_MAJOR_VERSION}" = "8" -a "${TCL_MINOR_VERSION}" = "0"; then XOTCL_BUILD_STUB_LIB_PATH="" XOTCL_STUB_LIB_PATH="" XOTCL_BUILD_STUB_LIB_SPEC="" XOTCL_STUB_LIB_SPEC="" else XOTCL_BUILD_STUB_LIB_PATH="`pwd`/${PKG_STUB_LIB_FILE}" XOTCL_STUB_LIB_PATH="${pkglibdir}/${PKG_STUB_LIB_FILE}" XOTCL_BUILD_STUB_LIB_SPEC="-L`pwd` -lxotclstub${PACKAGE_VERSION}" XOTCL_STUB_LIB_SPEC="-L${pkglibdir} -lxotclstub${PACKAGE_VERSION}" AC_DEFINE([COMPILE_XOTCL_STUBS]) fi else XOTCL_BUILD_LIB_SPEC="`pwd`/${PKG_LIB_FILE}" XOTCL_LIB_SPEC="${pkglibdir}/${PKG_LIB_FILE}" XOTCL_BUILD_STUB_LIB_PATH="`pwd`/${PKG_STUB_LIB_FILE}" XOTCL_STUB_LIB_PATH="${pkglibdir}/${PKG_STUB_LIB_FILE}" XOTCL_BUILD_STUB_LIB_SPEC="`pwd`/${PKG_STUB_LIB_FILE}" XOTCL_STUB_LIB_SPEC="${pkglibdir}/${PKG_STUB_LIB_FILE}" fi AC_SUBST([SHARED_LIB_SUFFIX]) AC_SUBST([UNSHARED_LIB_SUFFIX]) AC_SUBST([XOTCL_BUILD_LIB_SPEC]) AC_SUBST([XOTCL_LIB_SPEC]) AC_SUBST([XOTCL_BUILD_STUB_LIB_SPEC]) AC_SUBST([XOTCL_STUB_LIB_SPEC]) AC_SUBST([XOTCL_BUILD_STUB_LIB_PATH]) AC_SUBST([XOTCL_STUB_LIB_PATH]) XOTCL_SRC_DIR=$srcdir AC_SUBST([XOTCL_SRC_DIR]) AC_SUBST([XOTCLSH]) AC_SUBST([XOWISH]) # include dir of xotcl during build process (i.e., does not assume installed) XOTCL_BUILD_INCLUDE_DIR="${XOTCL_SRC_DIR}/generic" XOTCL_BUILD_INCLUDE_SPEC="-I${XOTCL_BUILD_INCLUDE_DIR}" AC_SUBST([XOTCL_BUILD_INCLUDE_DIR]) AC_SUBST([XOTCL_BUILD_INCLUDE_SPEC]) AC_SUBST([test_actiweb]) AC_SUBST([libdirs_actiweb]) AC_SUBST([apps_actiweb]) AC_SUBST([TEA_PLATFORM]) dnl CONFIG_OUTPUT_FILES is a macro containing the names of the output files dnl reasoning: this is a factoring; I use this value elsewhere. dnl dnl Change the value of -this- macro if you want to add or remove dnl such files. AC_DEFUN([CONFIG_OUTPUT_FILES], [[Makefile xotclConfig.sh apps/utils/xotclsh apps/utils/xowish unix/xotcl.spec unix/pkgIndex.unix]]) #-------------------------------------------------------------------- # the value of this variable is set to the files which are to be # removed when the user invokes 'make distclean' (i.e., those # files generated by ./configure) and is used in the make distclean # target, defined in Makefile.in #-------------------------------------------------------------------- CONFIG_CLEAN_FILES="CONFIG_OUTPUT_FILES autom4te.cache/" AC_SUBST([CONFIG_CLEAN_FILES]) AC_CONFIG_FILES(CONFIG_OUTPUT_FILES) #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile, # and generate the other output files. (this is done by invoking # config.status) # # NOTE the lack of parameters! AC_OUTPUT with params is deprecated; # use macros such as AC_CONFIG_FILES, AC_HEADER_FILES, etc to add # to the files output by ./configure. #-------------------------------------------------------------------- AC_OUTPUT here=${PWD} for subdir in ${subdirs} do echo "==================== configure $subdir =====================" if test x"${srcdir}" = x. ; then confdir=. else mkdir -p $subdir confdir=${srcdir}/$subdir fi (cd $subdir; echo $SHELL ${confdir}/configure ${ac_configure_args} --prefix=${prefix} --with-xotcl=${here}; eval $SHELL ${confdir}/configure ${ac_configure_args} --prefix=${prefix} --with-xotcl=${here}) done ./xotcl-1.6.8/._COPYRIGHT000644 000765 000024 00000000430 12327000502 015314 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/COPYRIGHT000644 000765 000024 00000003401 12327000502 015100 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/doc/._Announce-0.9.3000644 000765 000024 00000000430 12161600406 016731 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-0.9.3000644 000765 000024 00000003702 12161600406 016521 0ustar00neumannstaff000000 000000 Announcing XOTcl 0.9.3 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. RECENT CHANGES relative to 0.9 are: - A "more or less" TEA compliant build process and its directory structure (aligend it as far as possible to Tcl, sample extension and other extensions) * We started building an XOTcl stub lib. * We separated xotcl from its library/applications (there is an xotcl- directory in the full distribution that just builds, installs, etc. the XOTcl libraries ... this can for instance be used in other distributions using and shipping XOTcl, but not using the shells). * The full distribution still builds shells, but they are using "package require" to load the XOTcl libraries now. * For building xowish (the XOTcl Tk shell) you do only require an installed Tk version on Unix now. - On Windows we still use nmake due to problems with VCC 6.0 in all TEA compliant extensions we have checked, but we use a completely new build process (more or less one-to-one the Unix build process). - A few minor bugfixes. - We have tested this release on platforms we have access to (Linux, Win NT, Solaris). Please inform us, if there are some problems on your platform so that we can eliminate them in future releases. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-0.9.4000644 000765 000024 00000000430 12161600406 016732 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-0.9.4000644 000765 000024 00000006565 12161600406 016534 0ustar00neumannstaff000000 000000 Announcing XOTcl 0.9.4 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. CHANGES relative to 0.9.3 are: - fixes: * separate reference counting for XOTcl objects and classes to avoid references from tcl_obj's internal representation to freed memory * fixes for AOL-Server (many thanks to Zoran Vasiljevic for that and for his great help during fixing the problems above) * improved portability: horrible macro substitution bug, when USE_ALLOCA or USE_MALLOC was specified; these are used for some platforms such as AIX * fixing path search for XOTcl library (bug was introduced in 0.9.3 in connection with TEA compliance) * fixed a bug in copy/move (many thanks for Artur Trzewik for reporting this) in connection with constructors (constructors are not called automatically in copy/move operations anymore) * various small fixes in libraries (e.g. HTTP support, generation of pkgIndex-files, using "my", ...) - enhancements: * new global command "my": one can use now: Class Counter -parameter {{n 0}} Counter instproc ++ {} { my incr n } Counter instproc print {} { puts "actual value: [my n]"} Counter c1 c1 ++ c1 print In earlier versions it was neccessary to use "[self]" instead of "my". This change reduces the number of special characters in XOTcl programs. "[self]" will continue to be supported by XOTcl. * extended semantics of "new" a) Object new ... b) Object new -childof ... c) Object new -volatile ... d) Object new -volatile -childof ... where (a) creates now "global" objects not in the global namespace anymore, but in the ::xotcl namespace, (b) can be used to create objects as child of other objects (e.g. as children of the actual object [self]; the objects are deleted, when the specified object is deleted). (c) creates are "global" objects as in (a), but they are deleted, when the scope of the current tcl-proc/object-proc/instproc is left and (d) is a combination of (b) and (c). - optimizations: * XOTcl is trying to keep Tcl_Objs of type tclCmdNameType instead of converting it to XOTclObjectType agressively. * A patch for Tcl 8.4a3 is available from the XOTcl web site for performance hungry applications to provide special byte-code-support for xotcl, that yields for classical benchmark programs up to 40%. This patch is not likely to be integrated into the general Tcl core in the new or distant future. For more details, please consult the ChangeLog MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.0000644 000765 000024 00000000430 12161600406 016560 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.0000644 000765 000024 00000002573 12161600406 016355 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.0 ******************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. CHANGES relative to 0.9.4 are: - fixes: * various small fixes for compilation with tcl8.4.* * fixed some more memory-leaks that showed up in connection with multi-threading (many thanks to Zoran Vasiljevic for his great help) * removed a few panics() by tcl errors (important for servers) * various small fixes in Httpd-code * fixes in filter-search mechanism * the general cleanup method __exitHandler (called on interpreter exits and on thread exits) defined now as a proc of Object - optimizations: * speedup during recreation of objects For more details, please consult the ChangeLog MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.0.1000644 000765 000024 00000000430 12161600406 016717 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.0.1000644 000765 000024 00000002733 12161600406 016512 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.0.1 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. CHANGES relative to 1.0 are: - fixes: * fixed installation bug on windows (when installed on drives different to c:) * fixes for aolserver 3.5.* * fix for "object info default arg var" in connection with filters * Serializer handles filter guards now - new functionality and improvements: * improved recreate semantics, makes it easier to overload recreation logic. * new method "noinit" to create objects without calling the constructor - optimizations: * general speedup (10 to 15%) by using client data of namespace instead of Tcl_AssocData for interpreter state * faster and more flexible Serializer For more details, please consult the ChangeLog MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.0.2000644 000765 000024 00000000430 12161600406 016720 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.0.2000644 000765 000024 00000004056 12161600406 016513 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.0.2 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. CHANGES relative to 1.0.1 are: - fixes: * fixes for copying/moving objects to same name * works out of the box with AOL-server 4.0 (no patch for AOL-server needed) * various small fixes and code cleanup * new directory structure (no nested version numbers) * improved object and class serializer - new functionality and improvements: * new method "ismixin": Test whether the argument is a mixin or instmixin of the object. * new method "hasclass": Test whether the argument is either a mixin or instmixin of the object or if it is on the class hierarchy of the object. This method combines the functionalities of istype and ismixin. * arguments of configure methods can start now with a leading "-" without ambiguity. In previous versions Class C -parameter {name counter} C c1 -name -x -counter 123 the configuration of c1 was interpreted as follows method argc name 0 x 0 counter 1 Starting with XOTcl 1.0.2 arguments can be protected by putting it into a list: C c1 [list -name -x] -counter 123 which is interpreted as follows: method argc name 1 counter 1 For more details, please consult the ChangeLog MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.1.0000644 000765 000024 00000000430 12161600406 016717 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.1.0000644 000765 000024 00000005631 12161600406 016512 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.1.0 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. CHANGES relative to 1.0.2 are: - New functionality and improvements: * Transitive instmixins (thanks to a suggestion of Neophytos Demetriou): The new version supports a tree of mixins (mixins of mixins); when a mixin-class X has instmixins Y registered, and X is registered as instmixin for a class C, the mixin classes Y are applied to C as well. * Conditional mixins (thanks to a suggestion of Neophytos Demetriou): mixins and instmixins can have now guards similar to filters that define when they should be applied * New composition strategy for (filter- and mixin-)guards: when a guard is defined more than once for the same interceptor the most specific guard is used, the others are overridden. * Creation of sub-objects via parameter: XOTcl's parameter method supports now a switch named "-Class" which can be used to create and configure sub-objects (see tutorial for details) * New predefined method: __unknown This method is called, whenever XOTcl references a class, which is not defined yet (e.g.: Class C -superclass UNKNOWNCLASS) This method is used for Zoran's wonderful ttrace package (for aolserver and tcl-Threads) * Improved documentation: - extended tutorial (Meta-Classes, Tk, ...) - beautified tutorial (style files, distinction between literals and placeholders, ...) - fixed hundreds of typos * some speed improvements - fixes: * New build system: - per default no shells are built - new configure switches eg. --with-xotclsh, -with-actiweb --with-all * Fixes for https in connection with some versions of IE * Fixed a few issues with purify and mt (many thanks to Zoran!) * Fixes for proc-scoped variable in connections with mixins * Fixed passing of error codes from constructors * various small fixes and code cleanup - with newer versions of autoconf - various fixes for stubs - improved build under windows - starkit compliance (many thanks to MichaelL@frogware.com) For more details, please consult the ChangeLog MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.1.1000644 000765 000024 00000000430 12161600406 016720 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.1.1000644 000765 000024 00000003225 12161600406 016510 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.1.1 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. CHANGES relative to 1.1.0 are: - Improved portability * for Mac OS X (many thanks to Daniel Steffen) * freebsd 4.9 (many thanks to Marc Spitzer) - configure can run outside of xotcl-tree and can install to a different directory. Example: % mkdir -p /tmp/xotcl/unix % cd /tmp/xotcl/unix % ~/xotcl-1.1.1/unix/configure --with-all % make % make test % make install DESTDIR=/tmp - several fixes and improvements such as * added option --with-tkinclude for configure (only needed, when built with optional --with-xowish) * made gdbm work when compiled with threads enabled * fix for initialization of stubtables in gdbm * fixes for HTTP support (return format of values in HTTP OPTION command made windows explorer hang) * easy provision for redirects in HTTP server For more details, please consult the ChangeLog MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.2.0000644 000765 000024 00000000430 12161600406 016720 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.2.0000644 000765 000024 00000014301 12161600406 016505 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.2.0 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. CHANGES relative to 1.1.1 are: - Qualitative Improvements * improved performance (up to more than 30% faster) * reduced dependency on Tcl internals (stack rewritings removed) * less C-code (code reduction of about 500 lines c code) * defined macros to access Tcl's internal structures Due to the speedup, an emulation of an itcl like language in XOTcl can be faster than itcl itself (see below). - Functional Improvements * new subcommands of self: self callinglevel: returns the scope of the proc/instproc calling the current method (ignoring filters and next) self activelevel: returns the scope of the proc/instproc preceding the current method (might be a next call, ignoring filters) the returned level can be used in uplevel/upvar as first argument * new methods upvar/uplevel "my uplevel set x 1" is a short form of "uplevel [self callinglevel] set x 1" * sub-objects can be called like methods (potential incompatibility) If an object named o has a sub-object q (i.e. o::q) it is now possible to invoke the sub-object via "o q ?method args?". This change makes it possible to - to redefine tcl sub-commands via procs/instprocs by defining the command with subcommands as an object (instead of defining a command as a proc and its subcommands via a large and hard-to-refine switch statement) - to use the same approach for defining subcommands of subcommands (and so on) in the same way; it would be possible to define e.g. the xotcl info methods via an object), - to use interceptors (filters/mixins) for some or all subcommands (maybe you are only interested in "file delete") - to extend a tcl command on the fly by defining new subcommands (by defining new procs/instprocs) - to use the unknown mechanism to produce dynamic error messages about valid subcommands (via introspection commands). As a simple example, one define the a specialized version of Tcl's file-command (say ns::file) like the following: namespace eval ns { Object file file proc tail name { set tail [file tail $name] regexp {[^/\\]+$} $tail tail return $tail } file proc unknown {subcmd args} { return eval ::file $subcmd $args } } For more details, please consult the ChangeLog MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun #======================================================================= # extract from the logfile of oobench (in oo-bench.tar.gz, # see http://media.wu-wien.ac.at/download.html) XOTcl methcall: 0.470u 0.000s 0:00.41 114.6% 0+0k 0+0io 347pf+0w ITcl emulation in XOTcl methcall: 0.590u 0.000s 0:00.62 95.1% 0+0k 0+0io 351pf+0w itcl methcall: 0.870u 0.020s 0:00.92 96.7% 0+0k 0+0io 347pf+0w #======================================================================= package require XOTcl; namespace import -force xotcl::* ########################################################### ## Small example to emulate a itcl-like language in XOTcl ## -gustaf neumann Jan. 2004 ########################################################### namespace eval itcl { Class create class -superclass Class class instproc instvars {} { set vars [list]; set c [self] for {} {[string compare ::xotcl::Object $c]} {set c [$c info superclass]} { eval lappend vars [$c set __autovars] } return "\n\tmy instvar [lsort -unique $vars]" } class proc constructor {args} { if {[llength $args]==2} { foreach {arglist body} $args break } else { foreach {arglist construct body} $args break set body $construct\n$body } my parameter [list {this [self]}] my proc constructor args {uplevel next $args} my instproc init $arglist [my instvars]\n$body } class proc method {name arglist body} { my proc $name args {uplevel next $args} my instproc $name $arglist [my instvars]\n$body } class proc inherit {class} { my superclass $class } class proc variable {arglist} { foreach v $arglist {my lappend __autovars $v} } class instproc init {classdef} { my set __autovars this namespace eval [self class] $classdef my class Class } } ########################################################### # Two Demo classes from oo-bench ########################################################### itcl::class Toggle { variable state constructor {start_state} { set state $start_state } method value {} { return $state } method activate {} { set state [expr {!$state}] return $this } } itcl::class NthToggle { inherit Toggle variable count_max variable counter constructor {start_state max_counter} { Toggle::constructor $start_state } { set count_max $max_counter set counter 0 } method activate {} { if {[incr counter] >= $count_max} { Toggle::activate set counter 0 } return $this } } proc main {} { set n [lindex $::argv 0] set val 1 set toggle [Toggle t1 $val] for {set i 0} {$i < $n} {incr i} { set val [[$toggle activate] value] } if {$val} {puts "true"} else {puts "false"} set val 1 set ntoggle [NthToggle t2 1 3] for {set i 0} {$i < $n} {incr i} { set val [[$ntoggle activate] value] } if {$val} {puts "true"} else {puts "false"} } main ./xotcl-1.6.8/doc/._Announce-1.3.0000644 000765 000024 00000000430 12161600406 016721 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.0000644 000765 000024 00000006040 12161600406 016507 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.0 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. Major changes relative to 1.2.0 are: - Qualitative Improvements * Improved portability: + TEA3 compatible build + Much more polished configure+makefile (many thanks to Jim Lynch for his help) * Improved code quality: + fixed 2 possible segmentation violations (error handling) + fixed free memory reads (many thanks to Zoran Vasiljevic for his help with purify) * Less intrusive usage of XOTcl components: + XOTcl procs and instprocs use now the namespace in which they were defined. One can use XOTcl packages without having the need to import xotcl globally or to use the xotcl-prefix in all xotcl procs/instprocs. - Functional Improvements * New forwarding mechanisms for fast delegation: new methods 'forward' and 'instforward' (many thanks to Bryan Schofield for fruitful discussions and suggestions). This method is a superset of tclcmd/insttclcmd, which has been marked as deprecated. See the tutorial for more details. * Nonpositional arguments for xotcl procs/instprocs; this is a flexible way to check arguments, to provide defaults etc for every xotcl proc/instproc. It uses a similar syntax as ad_proc and ad_page_contract in OACS. See the tutorial for more details. * Extended methods filter, mixin, instfilter, instmixin as discussed in the XOTcl mailing list. These commands can be used more flexibly as follows obj mixin same as: obj info mixin obj mixin {C1 C2} same as: obj mixin set {C1 C2} obj mixin set {C1 C2} sets the mixins for obj obj mixin get same as: obj info mixin obj mixin add C3 adds a mixin on front of the mixin list obj mixin add C3 end adds a mixin at the end the mixin list obj mixin add C3 3 adds a mixin at the 3rd position obj mixin delete ::C3 removes the mixin from the mixin list The same semantics are available as well for filter, instmixin and instfilter. This change is fully backward compatible. {filter,instfilter,mixin,instmixin}append are deprecated now. For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.1000644 000765 000024 00000000430 12161600406 016722 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.1000644 000765 000024 00000000540 12161600406 016507 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.1 ********************** This is a minor fix release relative to 1.3.0. This fixes a few problems introduced in 1.3.0 (invocation of checking procs in nonpositional argument) and has a better build support for building XOTcl outside of the source tree, the tar files are now dist-cleaned. Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.3000644 000765 000024 00000000430 12161600406 016724 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.3000644 000765 000024 00000003253 12161600406 016515 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.3 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. Major changes relative to 1.3.1 are: - Qualitative Improvements * Improved code quality: + fixed possible segmentation violations in free memory reads (many thanks to Zoran Vasiljevic for his help with purify) + fixed "self callinglevel" when uplevel was called from uplevel + fixed nonposargs + fixed configure in connection with enable-symbols and for aolserver configuration + extended regression test * Improved Functionality + Producing error message when a non-existing proc/instproc is tried to be deleted + fixed exists method for objects with namespaces by using a namespace resolver + fixed return code for unknown handling in next + reduced memory consumption for objects and classes with procs/instprocs of about 14% * Improved Documentation For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.4000644 000765 000024 00000000430 12161600406 016725 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.4000644 000765 000024 00000003350 12161600406 016514 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.4 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. Major changes relative to 1.3.3 are: - Qualitative Improvements * Improved code quality: + fixed possible segmentation violations in free memory reads (many thanks to Zoran Vasiljevic for his help with purify) + fixed "self callinglevel" when uplevel was called from uplevel + Improved portability (many thanks to Jeffrey Hobbs) + fixed nonposargs + fixed configure in connection with enable-symbols and for aolserver configuration + extended regression test * Improved Functionality + Producing error message when a non-existing proc/instproc is tried to be deleted + fixed exists method for objects with namespaces by using a namespace resolver + fixed return code for unknown handling in next + reduced memory consumption for objects and classes with procs/instprocs of about 14% * Improved Documentation For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.5000644 000765 000024 00000000430 12161600406 016726 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.5000644 000765 000024 00000004011 12161600406 016510 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.5 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. Major changes relative to 1.3.4 are: - Qualitative Improvements * Improved code quality: + fixed possible segmentation violations in non positional argument handling + moved the Serializer into a namespace such that % package req XOTcl % package req xotcl::serializer Serialize .... works without namespace imports (the Serializer is still auto-exported, but this will change in the future) + * Improved Functionality + Non-positional arguments can be used in the same argument list as positional ones (more compliant with OpenACS). One can write now % Object o % o proc foo {-x:boolean -y a b} { ...} instead of % ... % o proc foo {-x:boolean -y} {a b} { ...} All introspection commands will work like before. The old syntax (with the additional argument) is deprecated and will be dropped in the future. + Serializer: support for objects with parent namespaces, which are not xotcl objects + additional instproc for ::xotcl::Class allinstances to return all instances for the actual class For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.6000644 000765 000024 00000000430 12161600406 016727 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.6000644 000765 000024 00000004265 12161600406 016524 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.6 ********************** WHAT IS XOTCL? XOTcl is an object-oriented extension of Tcl that was derived from OTcl. In short, XOTcl tries to provide a highly flexible, reflective, component-based, and object-oriented environment. It integrates language support for high level concepts which are not found in other languages, with reasonable performance. It prevails the Tcl programming style and the dynamic/introspective nature of the language, rather than introducing other language's styles and rigidness (such as C++) into Tcl. Major changes relative to 1.3.5 are: * Improved Functionality + new info subcommand: info precedence + simplified meta class definitions: every class can be changed into a metaclass by adding an instmixin of Class (or one of its subclasses) to it. In order to define that every class should be a metaclass, one can use now Object instmixin Class instead of the rather complicated solution i posted on the xotcl mailing list not long ago. * Improved code quality: + fixed possible crashes when - objects are called with class methods (e.g. due to instmixins) - when instmixins are defined recursively (e.g. Class instmixin Class) - objects are turned into classes by changing the class relationship + improved namespace resolution when mixin classes are defined in namespaces (::xotcl:: namespace is skipped, since a helper method that calles the primitive setting command is defined there) + fixed passing of error code from init methods (thanks to Fabrice Pardo for noting it) + returning PACKAGE_VERSION after a package require (e.g. 'package req XOTcl' returns now 1.3.6) + some code refactoring, fixed erroneous documentation of c code + improved documentation For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.7000644 000765 000024 00000000430 12161600406 016730 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.7000644 000765 000024 00000004312 12161600406 016516 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.7 ************************* I am pleased to annouce XOTcl 1.3.7. Major changes relative to 1.3.6 are: * Improved Functionality + new option "switch" for non positional arguments to be used to toggle the default value. A switch is a non positional argument without extra argument. + new option "isnextcall" for self + new command "::xotcl::configure filter on|off" to turn off filters. needed for serializing objects/classes with active filters + several improvements for serializer to handle e.g. application methods on Object/Class (needed for ad_instproc in oacs) + improving namespace resolving in for object/class references + moving all library packages into namespaces + preventing "new" from overwriting objects + allow xotcl to be used in slave interpreters * Improved code quality: + fixed namespace confusion in forward to expression calling xotcl methods + fixed possible crash in instvar when empty variable names are used + some code cleanup + improved documentation * new method "method" for defining methods (experimental): Instead of using e.g. Object o1 Class C o proc m1 {} {....} C instproc m2 {} {....} C proc m3 {} {....} one can use now o method m1 {} {....} C method m2 {} {....} C method -per-object m3 {} {....} in general, we can support options for method definitions, which can be used as well for mixins, filters or info (instead of the "inst" prefix). This way the problem of finding appropriate names for distinguishing between object or class matters can be solved, in rather rare cases (when referring the to class object) "-per-object" can be used. The according name changes will happen in xotcl 2.0. For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.8000644 000765 000024 00000000430 12161600406 016731 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.8000644 000765 000024 00000004475 12161600406 016531 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.8 ************************* I am pleased to annouce XOTcl 1.3.8 Major changes relative to 1.3.6 are: * Improved Functionality + new option "switch" for non positional arguments to be used to toggle the default value. A switch is a non positional argument without extra argument. + new option "isnextcall" for self + new command "::xotcl::configure filter on|off" to turn off filters. needed for serializing objects/classes with active filters + several improvements for serializer to handle e.g. application methods on Object/Class (needed for ad_instproc in oacs) + improving namespace resolving in for object/class references + moving all library packages into namespaces + preventing "new" from overwriting objects + allow xotcl to be used in slave interpreters * Improved code quality: + fixed namespace confusion in forward to expression calling xotcl methods + fixed possible memory leak with instmixins + fixed possible crash in instvar when empty variable names are used + fixed namespace related bug in __unknown resolver hook + some code cleanup + improved documentation * new method "method" for defining methods (experimental): Instead of using e.g. Object o1 Class C o proc m1 {} {....} C instproc m2 {} {....} C proc m3 {} {....} one can use now o method m1 {} {....} C method m2 {} {....} C method -per-object m3 {} {....} in general, we can support options for method definitions, which can be used as well for mixins, filters or info (instead of the "inst" prefix). This way the problem of finding appropriate names for distinguishing between object or class matters can be solved, in rather rare cases (when referring the to class object) "-per-object" can be used. The according name changes will happen in xotcl 2.0. For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.3.9000644 000765 000024 00000000430 12161600406 016732 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.3.9000644 000765 000024 00000002747 12161600406 016532 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.3.9 ************************* Hi everybody. I am pleased to annouce the availability of XOTcl 1.3.9. Major changes relative to 1.3.8 are: * Improved Functionality + new subcommand for self: [self args] return the full argument list of the current call + " info vars" does not trigger read traces on each variable anymore + Serializer: exportMethods accepts forwards/instforwards now as well + new switch -nocomplain for "mixin|instmixin|filter|instfilter delete" to avoid error messages when deleting entries not there (similar unset) + require automatically a namespace when a childobject is added + new command ::xotcl::__qualify: convert an relative name into an command name (exactly as create does it, ignoring namespaces from transparent interceptors) * Improved code quality: + fixing version numbers for package require + Upgraded TEA to 3.4 + updated rpm build (many thanks to Ildiko Schmidt and Alexander Bergolth) + fixed bug with error propagation when getter/setter methods are used for parameters (many thanks to Manfred Stelzhammer for pointing this out) For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.4.0000644 000765 000024 00000000430 12161600406 016722 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.4.0000644 000765 000024 00000003114 12161600406 016507 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.4.0 ************************* Hi everybody. I am pleased to annouce the availability of XOTcl 1.4.0. Major changes relative to 1.3.9 are: * Improved Functionality * new option: ::xotcl::configure softrecreate on|off if softrecreate is set, class relations (superclass, subclass, class, instances) are not affected by a recreate; this allows files with class definitions more easily to reload + easier syntax for providing commands for initializing default values + setting and querying options for ::xotcl::configure simiar to set * Improved code quality: + fixed a bug in connection with nonpositional arguments and "args" + fixed a bug with adding on the fly transitive mixin classes + fixed a bug with filter states after next + fixed omitted error message after calling self with unknown subcommands + fixed a bug with variable traces on thread exit (triggered by volatile) + fixed incorrect rpm dependencies + cleaner compile for xotcl for gcc 4.* under linux + don't destroy namespace imported child objects + info children returns true children, not namespace imported objects/classes + unsetting the global variable "cmd" from predefined.xotcl + Upgraded TEA to 3.5 + more regression tests addeed For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.4.1000644 000765 000024 00000000430 12161600406 016723 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.4.1000644 000765 000024 00000017333 12161600406 016520 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.5.0 ************************* Hi everybody. I am pleased to announce the availability of XOTcl 1.5.0. Major changes relative to 1.4.0 are: * Improved Functionality + The C-level implementation of XOTcl create now the basic classes ::xotcl::Object and ::xotcl::Class completely without any methods. All predefined methods are now registered from the initialization script-code (predefined.xotcl) via the new command ::xotcl::alias | \ ?-objscope? ?-per-object? which is used for registering predefined Tcl commands as methods. These aliases are like zero cost forwarders, since they lookup the function pointer from the commands and used these in the methods. This change makes it possible to register the same command on different classes (with maybe different names), such that for example the predefined set method of ::xotcl::Object can be replaced with a different method and the set method can be registered on some other classes (maybe some application classes). This change makes it as well quite easy to use the XOTcl framework to develop some other object oriented frameworks. + slots TODO documentation of slots TODO remove TODO optimize via parametercmd TODO parametercmd with 3+ args TODO info parameter deprecated A slot is a meta-object that manages property-changes of objects. A property is either an attribute or a role of an relation. In a nutshell, a slot has among other attributes - a name (which it used to access it), - a domain (object or class on which it can be used) , and - can be multivalued or not We distinguish between system slots (predefined slots like class, superclass, mixin, instmixin, filter, instfilter) and application slots (e.g. attributes of classes). System Slots ======== System slots are predefined slots defining e.g. some relations between classes, or between objects and classes. The predefined system slots are: - superclass: every class in XOTcl has one or more superclasses. The name of this slot is "superclass", the domain is "::xotcl::Class", the slot is multivalued. One object might have multiple superclasses. - class: every object has a class; therefore, the domain of the slot is "::xotcl::Class", the property is not multivalued. - mixin: every object in XOTcl can have one or more mixin classes. The name of this slot is "mixin", the domain is "::xotcl::Object", the slot is multivalued. - instmixin: same as above, but the domain is "::xotcl::Class" - filter, instfilter: similar to "mixin" and "instmixin" Every slot can be used set and query the property from its domain. The syntax for setting values is newValue replace newValue and for getting its values is set x [ ] TODO "mixin set" -> "mixin assign" TODO "mixin set" -> "mixin replace" TODO "mixin set" -> "mixin reset" TODO "mixin delete" -> "mixin remove" where the first form is in both cases the short form of the second one. Every multivalued slot has as well a method "add" and "remove" Examples for using the system slot "mixin" Object o; Class M; class N o mixin ::M ;# replacing the per-object mixins of o with M o mixin reset ::M ;# same as before o mixin add ::N ;# add N to the front of the mixin list o mixin delete ::M ;# delete M from the mixin list puts [o mixin] ;# query the current mixin list Every system slot (e.g. superclass) has the exact same interface. Attribute Slots ========= Attribute slots are used to manage the setting and querying of instance variables. We define now a person with three attributes,"name", "salary" and "projects". Class Person -slots { Attribute name Attribute salary -default 0 Attribute projects -default {} -multivalued true } These attributes might have a default value or they might be multivalued. When an instance of class Person is created, the slot names can be used for specifying values for the slots. Person p1 -name "Joe" Object p1 has three instance variables, namely "name", "salary" and "projects". Since slot "projects" is multivalued, we can add values the "add" subcommand. Project project1 -name XOTcl \ -description "A highly flexible OO scripting language" p1 projects add ::project1 p1 projects add some-other-value The value of the instance variable "project" of Person p1 is now the list "some-other-value ::project1" Type Checking ========= Attribute slots can have types assigned which are tested whenever the instance variable is altered. The slot "salary" is defined as integer whereas "projects" is defined to be a list of instances of the class Project (a list, since "projects" is defined as multivalued). Class Person -slots { Attribute name Attribute salary -default 0 -type integer Attribute projects -default {} -multivalued true -type ::Project } Person p2 -name "Sue" -salary 1000 The slot types are checked via Tcl variable traces. This means that the values are enforced now matter how the variables are accessed. The checks are performed in the following two commands, and they will throw an error in the second command, since "1100x" is not an integer. p2 incr salary 100 p2 append salary x similarly the second command below will through an error, since some-other-value is not an instance of ::Project. p2 projects add ::project1 p2 projects add some-other-value When a check throws an error, the instance variables are reset to the previous value. To restore the original value, an associative array "__oldvalue()" is kept as instance variable in the object. In general, checking of variables can be turned off globally by "::xotcl::Slot instmixin add ::xotcl::Slot::Nocheck". It can be turned off selectively for each slot via a per-object-mixin; if attributes are subclassed, it is possible to register the "Nocheck" mixin on a subclass of Attribute. procsearch returns for forwarders now "forward" or "instforward", for parametercmds now "parametercmd" or "instparametercmd" and for other commands "cmd" and "instcmd" info slots TODO slow -superclass TODO king of the bongo + improved forwarding ... expr earlybinding %argclindex + improved serializer - handling of slot dependencies - - * Improved code quality: + fixed a bug with nonpositional arguments, some positional arguments and "args" + fixed a bug in nonpositional arguments when called without arguments + improved error messages in connection with nonpositional arguments + more regression tests added For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.5.0000644 000765 000024 00000000430 12161600406 016723 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.5.0000644 000765 000024 00000024110 12161600406 016507 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.5.0 ************************* Hi everybody. We are pleased to announce the availability of XOTcl 1.5.0. Major changes relative to 1.4.0 are: * Improved Functionality + The C-level implementation of XOTcl creates now the basic classes ::xotcl::Object and ::xotcl::Class completely without any methods. All predefined methods are now registered from the initialization script-code (predefined.xotcl) via the new command ::xotcl::alias | \ ?-objscope? ?-per-object? which is used for registering predefined Tcl commands as methods. These aliases are like zero cost forwarders, since they lookup the function pointer from the commands and used these in the methods. This change makes it possible to register the same command on different classes (with maybe different names), such that for example the predefined set method of ::xotcl::Object can be replaced with a different method and the set method can be registered on some other classes (maybe some application classes). This change makes it as well quite easy to develop some other object oriented languages based on the XOTcl framework, since all methods can be rearrange from the Tcl layer . + Slots A slot is a meta-object that manages property-changes of objects. A property is either an attribute or a role of an relation. In a nutshell, a slot has among other attributes - a name (which it used to access it), - a domain (object or class on which it can be used) , and - can be multivalued or not Every slot defines a uniform interface to access its content. So has for example, every multivalued slot a method "add" to add a value to the list of values and a method "remove" to remove it again. We distinguish between system slots (predefined slots like class, superclass, mixin, instmixin, filter, instfilter) and application slots (e.g. attributes of classes). System Slots ======== System slots are predefined slots defining e.g. some relations between classes, or between objects and classes. The predefined system slots are: - superclass: every class in XOTcl has one or more superclasses. The name of this slot is "superclass", the domain is "::xotcl::Class", the slot is multivalued. One object might have multiple superclasses. - class: every object has a class; therefore, the domain of the slot is "::xotcl::Class", the property is not multivalued. - mixin: every object in XOTcl can have one or more mixin classes. The name of this slot is "mixin", the domain is "::xotcl::Object", the slot is multivalued. - instmixin: same as above, but the domain is "::xotcl::Class" - filter, instfilter: similar to "mixin" and "instmixin" Every slot can be used set and query the property from its domain. The syntax for setting values is newValue and for getting its values is set x [ ] Every multivalued slot has as well a method "add" and "remove" Examples for using the system slot "mixin" Object o; Class M; class N o mixin ::M ;# replacing the per-object mixins of o with M o mixin add ::N ;# add N to the front of the mixin list o mixin delete ::M ;# delete M from the mixin list puts [o mixin] ;# query the current mixin list Attribute Slots ========= Attribute slots are used to manage the setting and querying of instance variables. We define now a person with three attributes,"name", "salary" and "projects". Class Person -slots { Attribute name Attribute salary -default 0 Attribute projects -default {} -multivalued true } Examples for using the slots are Person p1 -name "Joe" p1 projects add project1 Some additional features of the slots are: - Support for value checking for * primitive types (all types from "string is", like integer, boolean, ...) * instances of Classes (e.g. value must be an instance of Person) * custom value checkers * uniform interface for single and multi-valued slots - Support for lazy initialization (e.g. when costly commands (like SQL) are used to initialize instance variables, not all variables are used for each object) - more experimental low level functionality, like * initcmd (executed, whenever the variable is read the first time) * valuecmd (executed, whenever the variable is read) * valuechangedcmd (executed, whenever the variable is altered) For more details, see http://media.wu-wien.ac.at/doc/tutorial.html#slots + Re-implementation of the method "parameter" based on slots. All forms except ... -parameter {name1 {name2 default2}} ... (I.e. pure accessor parameters and parameters with defaults) are deprecated, since slots are the much more powerful and orthogonal construct. The old c-based parameter support based on "parameterclass" is deprecated. It is still in the C-code (the method "parameter" is redefined in predefined.xotcl). If someone urgently needs it, please remove the parameter instproc from predefined for the time being, and write an email to me, in case you really need it). The C code for parameter will be removed in the next release. + Improved introspection though the procsearch method. This method reports now in its second argument not only [inst]proc but as well [inst]forward, [inst]parametercmd and [inst]cmd (the latter for methods implemented in C. * Improved introspection through "info" - new subcommand "info slots" - implemented backwards bug-compatible "info parameter", deprecated + Improved serializer - better handling of cyclical dependencies, when mixins are involved - fix for namespace handling to make the XOTcl communication library classes working with the aolserver (thanks for Stefan Sobernig for pointing this out) - Now other ::xotcl::* objects can be included in the aolserver blueprint (e.g. non positional argument handlers) - handling of slot dependencies - more convenient calling of the serializer: Method "serialize" for Object is defined when the package xotcl::serializer is loaded. + Improved forwarding commands - New option for the argument substitution. When the argument list of the forward command contains "%argclindex {a b c}", then depending of the number of arguments at invocation "a", "b" or "c" is substituted. If more arguments are used at the invocation of the forwarder than values are contained in the list after %argclindex, an error is generated. - New options for forwarder: * The option -earlybinding can be used to look up the function pointer of the called Tcl command at definition time of the forwarder instead of invocation time. This option should only be used for calling C-implemented Tcl commands) * The option -verbose prints the substituted command in the forwarder prior to invocation. + New snit-like utility functions: - ::xotcl::myvar varName: return the fully qualified variable name of the specified variable. - ::xotcl::myproc methodName ?args?: call an xotcl method without the need of using "[list [self] methodName ...]" Both commands are namespace exported + added "subst" to the set of Tcl imported methods (like e.g. incr, append, ...) On can do now: % Object o ::o % o subst {I am [self]} I am ::o + added new method for ::xotcl::Object named "contains": This method is essentially a value added back-port of the OpenACS version. It allows to create a nested object structure with little syntactic overhead. See tutorial or language reference for more details. * Improved code quality: + fixed a bug with nonpositional arguments, some positional arguments and "args" + fixed a bug in nonpositional arguments when called without arguments + tested with Tcl 8.4.13 and 8.5a4 + improved error messages in connection with nonpositional arguments + fixed a bug in the xotcl trace module (many thanks to jima for reporting) + fixed a namespace bug in ::xotcl::package require in connection with xotclide (many thanks to Bill Paulsen and Artur Trzewik for identifying the problem and suggesting a fix) + improved documentation (e.g. new sections added, some sections deleted, spelling improved, in total 8 pages longer) + fixed documentation bugs (many thanks for Kristoffer for reporting) + more regression tests added For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.5.1000644 000765 000024 00000000430 12161600406 016724 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.5.1000644 000765 000024 00000004764 12161600406 016525 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.5.1 ************************* Hi everybody. We are pleased to announce the availability of XOTcl 1.5.1. Major changes relative to 1.5.0 are: * Improved Functionality + Improved interface to develop XOTcl methods in C (Many thanks to Scott Gargash for the constructive discussions and suggestions). New functions imported through the XOTcl's stub interface: - XOTclNextCmd() - XOTclCallMethodWithArgs New constant XOTCL_NONLEAF_METHOD to allow C-implemented methods to call next. This constant can be passed as 5th argument to XOTclAddIMethod (or ...AddPMethod). The following is a short example for defining and registering a C-implemented constructor "init" to a class. static int MyClassInit( ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[] ) { int rc; /*** before next ***/ rc = XOTclNextObjCmd(cdata, interp, objc,objv); /*** after next ***/ return rc; } ... MyClass = XOTclGetClass(interp, "MyClass" ); XOTclAddIMethod(interp, MyClass, "init", MyClassInit, XOTCL_NONLEAF_METHOD, 0 ); * Improved code quality: + fixed a bug with the backward-compatible and deprecated "setter" interface (many thanks to Manfred Stelzhammer for reporting the bug) + fixed a bug in parsing nonpositional arguments, when e.g. square brackets are used in type declarations for parameters (Many thanks to Stefan Sobernig for reporting) + fixed autoname crash under Windows NT (Many thanks to Mark Janssen for reporting and providing a patch) + fixed serializer to handle deeper stratification layers + simplification and speedup of dispatcher + Makefile.in improvements for genstubs + Changed "test -e" to "test -f" in Makefile.in, since the standard test command in Solaris does not understand "test -e" (Many thanks to Andreas Kupries for reporting) + improved 64-bit compatibility on POWER5+ For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.5.2000644 000765 000024 00000000430 12161600406 016725 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.5.2000644 000765 000024 00000002237 12161600406 016517 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.5.2 ************************* Hi everybody. We are pleased to announce the availability of XOTcl 1.5.2. Major changes relative to 1.5.2 are: * Improved Functionality + allowing to trace objects as well as classes via the package xotcl::trace (many thanks to jima for suggesting this) * Improved code quality: + terminating all vararg lists in C by ..., (char *) NULL There was a problem with this on 64bit AMD on FreeBSD, as some lists were terminated previously by an integer typed zero-value. + better handling of Tcl result objects. Make sure that no changes happen on shared objects. Removed all occurrences of Tcl_AppendResult() from xotcl.c + Fixed memory corruption (accessing feed memory) in the invalidation of transitive mixins (many thanks to Don Porter for reporting) For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.5.3000644 000765 000024 00000000430 12161600406 016726 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.5.3000644 000765 000024 00000002027 12161600406 016515 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.5.3 ************************* Hi everybody. We are pleased to announce the availability of XOTcl 1.5.3. Major changes relative to 1.5.2 are: * Improved code quality: + provided compatibility with Tcl 8.5 + provided compatibility with Tcl 8.4.14 (fixed a nasty bug caused by a change in tcl 8.4.14, could led to a crash due to freed Tcl_Objs in OpenACS, allthough the xotcl regression test passed correctly) + reduced calling overhead of methods with nonpositional arguments by about 10 percent by avoiding shimmering. + fixed handling of "return -code break" from xotcl methods (thanks to Artur Trzewik for the bug report) + library/comm/Access.xotcl: fixed handling of chunked encoding For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.5.4000644 000765 000024 00000000430 12161600406 016727 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.5.4000644 000765 000024 00000002642 12161600406 016521 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.5.4 ************************* Hi everybody. We are pleased to announce the availability of XOTcl 1.5.4. Originally, this release was planned as a small bug fix release. However, the total size of the (unified) diff between 1.5.3 and 1.5.4 is more than 5000 lines, mostly due to the varRefom changes (see first item below). Major changes relative to 1.5.4 are: * Improved code quality: + provided compatibility with Tcl 8.5 (currently, this requires the verison of Tcl 8.5 from CVS head, including the changes for VarReform (For details, see http://groups.google.at/group/comp.lang.tcl/browse_frm/thread/bff391a7f1bd8f6c/3f214d088a28ed13?hl=de#3f214d088a28ed13) + improved serializer (handling var traces for instances variables) + several small bug-fixes (e.g. fixing empty variable names, error message propagation for configure, fixing potential crashes, when namespaces are added to objects during eval, etc.) + improved portablility for more platforms (more portable shell tests for e.g. FreeBSD) + extended regression test For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org Best regards, Gustaf Neumann Uwe Zdun ./xotcl-1.6.8/doc/._Announce-1.5.5000644 000765 000024 00000000430 12161600406 016730 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.5.5000644 000765 000024 00000002662 12161600406 016524 0ustar00neumannstaff000000 000000 Dear XOTcl Community, XOTcl 1.5.5 is available. The main change is to achieve binary compatibility between Tcl 8.5 and XOTcl compiled with Tcl 8.4. This is essential achieved through a small emulation layer based on C-structures that will be available in Tcl 8.5. best regards -gustaf neumann Announcing XOTcl 1.5.5 ************************* We are pleased to announce the availability of XOTcl 1.5.5. Major changes relative to 1.5.4 are: * Improved binary compatibility: It is now possible to load XOTcl compiled for Tcl 8.4 into a tclsh8.5 (again, substantial change). One can now test now 4 versions: a) a native version for Tcl 8.4 (without compatibility layer) b) a native version for Tcl 8.5 c) a version compiled for Tcl 8.4 with compatibility layer in tclsh8.4 d) a version compiled for Tcl 8.4 with compatibility layer in tclsh8.5 Tests showed that the overhead is for the compatibility layer is between 1.1% and 2.3%, the difference between tcl8.5 and tcl8.4 is much larger. The forward compatibility behavior behavior can be turned off by setting FORWARD_COMPATIBLE to 0 during compilation (xotcl.h) to get a small performance improvement. For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.5.6000644 000765 000024 00000000430 12161600406 016731 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.5.6000644 000765 000024 00000003437 12161600406 016526 0ustar00neumannstaff000000 000000 Dear XOTcl Community, XOTcl 1.5.6 is available. This version is mostly a fix release for some problems that were apparently quite long in the code and could cause crashes for threaded applications. best regards -gustaf neumann Announcing XOTcl 1.5.6 ************************* We are pleased to announce the availability of XOTcl 1.5.6. Major changes relative to 1.5.4 are: * Fixes for treating global volatile objects (many thanks to Zoran for his concise reports). The problem was that XOTcl uses C-level var traces containing object pointers to objects. If for some reason, these objects are destroyed earlier, this results in dangling references. This problem caused especially problems in the automatic cleanup of variables at the end of a thread. * Fix for Tcl 8.4.* for situations, where Tcl variables contained references to deleted XOTcl objects. The problem was introduced by the VarReform changes between 1.5.3 and 1.5.4 by a bad side effect of a Tcl_Obj based command to look up Tcl command structurs. The problem did not exist for xotcl compiled against Tcl 8.5 and is as well fixed on the Tcl side in CVS (might become available, when one more Tcl 8.4 release is eventually released) * Serializer: - Added dependency rule in serializer to ensure slots of super-classes are listed before subclasses. (Thanks to Stefan Sobernig for reporting the problem) - Moved deactivation of traces into "Serializer all" to get simpler results on "o serialize". * Extended regression tests For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.0000644 000765 000024 00000000430 12161600406 016724 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.0000644 000765 000024 00000007461 12161600406 016522 0ustar00neumannstaff000000 000000 Dear XOTcl Community, XOTcl 1.6.0 is available. This release provides in short: - orthogonality improvements for introspection, - more introspection methods (one can now e.g. query, into which classes a mixin class is mixed into) and - performance improvements (some methods are significantly faster. e.g. by a factor of 1000 for larger systems). In addition, the XOTcl source code follows now closer the Tcl source code guidelines (e.g. variable naming), a few potential crashes have been fixed. See below for more details. Best regards -gustaf neumann Announcing XOTcl 1.6.0 ************************* We are pleased to announce the availability of XOTcl 1.6.0. Major changes relative to 1.5.6 are: * Provide a uniform interface to the following info subcommands info superclass ?-closure? ?pattern? info subclass ?-closure? ?pattern? info instances ?-closure? ?pattern? info instmixin ?-closure? ?pattern? The new option "-closure" returns the transitive set of the relation (e.g. .. info subclass -closure) returns the subclasses and the subclasses of the subclasses. For "info instances -closure" the instances of the subclasses are returned as well. For more details, please see the language reference manual. In cases, where a pattern is specified, and the pattern contains meta-characters, a list of results is returned matching the pattern (like "string match"). When no matching value is found, an empty list is returned. In cases, where a pattern is specified, and the pattern contains no meta-characters, a single value is returned corresponding to the specified value. The pattern is used to lookup an object or class, such it is not necessary to provide fully qualified names). if there is no match, empty is returned. Previously, "info superclass" and "info subclass" returned a boolean value and performed always a transitive search. Returning "" is more consistent and more in line with Tcl. Note that " info superclass -closure" is a replacement for " info heritage", and " info instances -closure" is a replacement for " allinstances". The old commands will be marked as deprecated in the near future. Please note, that the behavior of the match pattern has changed and is therefor not completely compatible with prior versions. * New info subcommands: info instmixinof ?-closure? ?pattern? info mixinof ?pattern? These info subcommands are used to determine, into which classes a mixin class was mixed into. These inverse functions of mixin and instmixin are used as well internally. These functions help to speed certain operations (e.g. superclass, or registering a mixin class) up by a factor of 1000 (!) or more, when a large number of objects exist. This functionality was primarily implemented by Martin Matuska. Many thanks! * Made the behavior "pattern" in the following calls identical concerning wild cards and object lookups mixin delete pattern instmixin delete pattern superclass delete pattern info mixin ?pattern? * Fix to preserve var traces when copying objects (Many thanks to Florian Murr for reporting) * Fix problem in Tcl 8.5.* when setting variables from C (problem with Tcl_ObjSetVar2()?); many thanks to Florian Murr and Neophytos Demetriou for reporting) * Improved documentation * Extended regression tests For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.1000644 000765 000024 00000000430 12161600406 016725 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.1000644 000765 000024 00000002260 12161600406 016513 0ustar00neumannstaff000000 000000 Dear XOTcl Community, XOTcl 1.6.1 is available. This release provides in short: - improved orthogonality for introspection, - improvements in the serializer - some minor fixes See below for more details. Best regards -gustaf neumann Announcing XOTcl 1.6.1 ************************* We are pleased to announce the availability of XOTcl 1.6.1 Major changes relative to 1.6.0 are: * Extended and generalized "info" method * Generalized serializing package: when deserializing code, now consistenly no constructors are called. In previous versions, constuctors were called on slots; due to the point above, this is not needed; background: the previous solution had problems in aolserver ns_eval, when a slot-constructor called db-functions, since during ns_eval, the database handles are non-functional) * Fixes for potential crashes when methods were called with invalid arguments * Improved documentation * Extended regression tests For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.2000644 000765 000024 00000000430 12161600406 016726 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.2000644 000765 000024 00000002563 12161600406 016522 0ustar00neumannstaff000000 000000 Dear XOTcl Community, XOTcl 1.6.2 is available. See below for more details. Best regards -gustaf neumann Announcing XOTcl 1.6.2 ************************* We are pleased to announce the availability of XOTcl 1.6.2 Major changes relative to 1.6.1 are: * Functional extensions: - handle nonposargs in method "copy" properly - new command ::xotcl::finalize (for forcing cleanup and destuctor execution at a time in a multi-threaded environment, where it is still safe to execute all Tcl commands) * Extended and generalized "info" method - Added " mixinof -closure ?pattern?" Query the objects for which is used as a per-object-mixin (directly or indirectly) * Fixes for potential crashes - Implemented proper downgrading of Classes to Objects (handle cases, where something was created first as an object and is reclassed/recreated later as a class) and vice versa - Reset mixin order for per-object mixins, when the superclass of a class is deleted, which is used as per-object mixin * Improved documentation * Extended regression tests * Some code cleanup For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.3000644 000765 000024 00000000430 12161600406 016727 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.3000644 000765 000024 00000002603 12161600406 016516 0ustar00neumannstaff000000 000000 Dear XOTcl Community, XOTcl 1.6.3 is available. See below for more details. Best regards Gustaf Neumann Announcing XOTcl 1.6.3 ************************* We are pleased to announce the availability of XOTcl 1.6.3 Major changes relative to 1.6.2 are: * Functional improvements: - simplified and generalized handling of namespaced instance variables, where namespaced associative arrays could conflict with global variables due to Tcl's default namespace resolution. Many thanks to Stefan Sobernig for this contribution! * Fixes: - Corrected deletion of meta-classes. Before, it was possible to create undestroyable objects via complex meta-class structures * Speed improvements: - Use of new interfaces in Tcl 8.5 (when compiled with Tcl 8.5) - simplified interfaces for various C functions - Speed improvement for method invocation: * With Tcl 8.5: 10-15 % * With Tcl 8.4: 5-10 % * Improve code quality: - some more code cleanup - factoring out common code - using const in more cases * Extended regression tests * Improved documentation For more details about the changes, please consult the ChangeLog and documentation. MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.4000644 000765 000024 00000000430 12161600406 016730 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.4000644 000765 000024 00000001033 12161600406 016513 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.6.4 ************************* Dear XOTcl Community, We are pleased to announce the availability of XOTcl 1.6.4 Major changes relative to 1.6.3 are: * 2 fixes of potential crashes introduced in 1.6.3 * Improved documentation (added "stack" as introductory example) For more details about the changes, please consult the ChangeLog and documentation. The planned next release will be 2.0.0 MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.5000644 000765 000024 00000000430 12161600406 016731 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.5000644 000765 000024 00000001172 12161600406 016520 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.6.5 ************************* Dear XOTcl Community, We are pleased to announce the availability of XOTcl 1.6.5 Major changes relative to 1.6.4 are: * fixed namespace visibilty problem reported by Mykhaylo Sorochan * fixed var resolver/memory leak problem reported by Victor Mayevski (when XOTcl is compiled against Tcl 8.4.*, but loaded into 8.5.*) For more details about the changes, please consult the ChangeLog and documentation. The planned next release will be 2.0.0 MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.6000644 000765 000024 00000000430 12161600406 016732 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.6000644 000765 000024 00000001346 12161600406 016524 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.6.6 ************************* Dear XOTcl Community, We are pleased to announce the availability of XOTcl 1.6.6 Major changes relative to 1.6.5 are: * improved 64-bit compatibility (expat) * fixed minor memory leaks (info methods, forward error case) * fixed potential cyclic dependencies via namespace imports during cleanup * fixed potential crash with var-traces being fired twice * compatibility with Tcl 8.6b1 * fix for debian packaging For more details about the changes, please consult the ChangeLog and documentation. The planned next release will be 2.0.0 MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.7000644 000765 000024 00000000430 12161600406 016733 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.7000644 000765 000024 00000001402 12161600406 016516 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.6.7 ************************* Dear XOTcl Community, We are pleased to announce the availability of XOTcl 1.6.7 Major changes relative to 1.6.6 are: * fixed potential crash in "namespace delete" * fixed potential crash in autoname during cleanup * fixed bug in filters, when filterchain reaches end without finding the method to be invoked * fixed handling of object-names containing semicolon in serializer * handling implicit deletes * some code cleanup All new development efforts are concentrating on the Next scripting framework, including XOTcl 2.0 (see http://next-scripting.org) MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ./xotcl-1.6.8/doc/._Announce-1.6.8000644 000765 000024 00000000430 12327774065 016755 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/Announce-1.6.8000644 000765 000024 00000001525 12327774065 016546 0ustar00neumannstaff000000 000000 Announcing XOTcl 1.6.8 ************************* Dear XOTcl Community, We are pleased to announce the availability of XOTcl 1.6.8 This is a maintenance release. Major changes relative to 1.6.7 are: * overhaul of configure and TEA, stick * fixes for linking xotclsh with Tcl 8.6 (fixes Debian report) * fixes for building xowish with newer TEA versions * overworked version numbering in packages * backport fixes from nsf * backport for security fix from expat * some code cleanup diff stats: 181 files changed, 26279 insertions(+), 30528 deletions(-) All new development efforts are concentrating on the Next scripting framework, including XOTcl 2.0 (see http://next-scripting.org) MORE INFO General and more detailed information about XOTcl and its components can be found at http://www.xotcl.org ===== ./xotcl-1.6.8/doc/._cascaded-message-filter.gif000644 000765 000024 00000000430 12161600406 021716 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/cascaded-message-filter.gif000644 000765 000024 00000013571 12161600406 021513 0ustar00neumannstaff000000 000000 GIF87aÚ÷˜˜˜ÐÐÐØØØøøø‹ot@sX/Fcam°eTr-z骥³N5Ø­,!’²'{$Ÿû¨"³wÊh«¯âDmCÇÎGlœ~b).‰Å> ãgØ6©­f49;™ˆö ®_Ç‚(m޶õ÷â™×~ËŠì¶ë/[&¨/Áµ6â]±éV0•. i­N}f{SjÛfì•»u (bþšE`~‹×qÅ×% $Qsu_š±ª2¬Dž¹Þ‘èßÁ‚L$Á€N¼îP-§´ï„y†,m¹[¢¬îA|â{ET5IW›tô”9FËŸÌYshãŽ×¼3ù¦¼ò©¾,Ý•.ª4ÓVöFwKæ”þ®Ö‰ù.x£ÒýàÀ|Y TÞ+ñÝmÜ >(âAþ£Ýž²ú«ã˜ã|8ż×0¯…g޹äxs.:Ó¤›k«é¥ËðéT¥¾(Û·e;ì¬Éðæ¬ƒw;î¹ÿ»zíÜþ¼gº‡Î{Rô%<휢+,ѳ?|LÎG8”Æ[ÿ&ö?uÛ¶÷Zf?ýÅé’¯~³.™?ìöëǯ‘óî»^™ò£žìáð˜¿ã²+ÚêEÀve÷YÛÿèF:fÕkŒ 'HÁ ÖK d ÿã– zðƒ ” èêIoDžÖ$ÒÁºð…¡K>WU/…ßK•CH(CúЇþ=¬`룺Ýá3y ÈD qnD¼á‘X7M5ñŠ!<`aØ?öIqŠÉZp¶ˆÅ2ΰ„X< ðŠÆëÕ¨ $4£=x,3v…ll£ ß(8ÎñÌÕø’ûé‘)-‹ÉH ’‘„<¤$36Â6ò’Ää1bHIž…Z‹¼$`@ÄÐ’¢Œ`$'çÉÌ!+”©,¥fIKZ0•§4a[9:ÑTR“n©¥0‡ILa`–uÄ%çÅKýId€Žd0‹IÍjÖò˜Ål!&uiÄfö"‹$ã§iÍrV›åôŠ)!Ù<¬y³5ÐúUÅùBR¢Óœøþ¤æ=Í©NHrL6|gîRM 2Ñžû̧BI‰Ì…^³+ë”ã*5¶KæìuyâêÐ|’³£¶D¥ÿy‘\YôMâHAcXOˆ‚ô¥ƒyé0!*Qj™ô¤HôÕJY:J—ʤÇú©1)Q’²°¢8UØz>HOÚS¨2 *TÑ+n²s_LêE£“E>uª@ý(XCZU&.óDÝÓªcÐÈÔ ~u¬+\ÉZÆ«ªUtZ!}:×bÀ€] @_³ÙT½Bó®®Te[g8Xüµ€ˆ¬d% €ÈP°sé ehWÄ–k‹ôì!C3ë–Éšö´¨M­e½‚Y°u³"4þªg§Qžòª¬U­nw«[¹Â´°ŠálIZGrv£…êc+ËÛæ:7µêÄmY *Äá:J¯hŒîO—ûÜîz÷´¬ý©f¹h];íTˆ%¼m\sûÝöº—»Q® Ðòšå¼”êoßËßþ.¦òÍby²j_­—‡Ú]¯Üßʆµ‰­"p¯r`ã&X¡e°†ùX ˜©“ð„cçC„ª×šÝ°ŠßÛa‡¾ˆhMëˆI ÃÑ^¸š)^±ŽÝ{ât~X£šË㌭Ra§î“£ÃÌñŽSK€%÷ÉÙdè8M˜´!_¿^…ò9™»ãŸ/NîñL:e+?Ëèu1þ—ìeHÅ=†è=ÇkX3Í1th†5ŒQ¼}eÕk‘igÀYË~]3‡ÏZRö6¸µÈŒé5ÇYè¹ZÍýõSûþÌaHë×–”®ô'¹èbþjz&`æ1:%=S'Šº,x–`rñ©èîN‡baa±‰¡üb:ªòÕd©ð¬Ë¹çïÞ=µ~®oùãy ØG6¢…Yl[3{Én®˜™ík vÚD‰µ‘Øï^[`æv0?å»WÙ~ ÜC7r§}Íöž}é¦um½}9x¥Âôžeµ{o\›[ß±¥ã€ý}ªÍæsà¼=ßRrÝ]u[sžmUÃmåÂaSâ»-xøþš\ñu“ŸÃiíÝNb-Ûª¥÷ ]žòg8ऴv°INp~ž¼æÿž¯GuŽžóÖâçü9Ð9B'ZÙ47ÌÁ é™Òt¾î^:Š„nNC—^Ê®úCÙªW­ŽëÄžúd%®±ÿøWFï­>3Yv³óDÜN'¦Ú%ËvN^É—a£øÑ ÛÏùÚJh¿¸sûÎÉgiz=«‚{Ï­.gòFÝîx—9ÁWØ«!õìØQ«›¶ÅÌ^ƒøòf¿y×÷ÆS4Ä ŠW]_Ò¸C·êÚ=4êµ\z{Ý´´o¼>ÿxâ¤Ïj÷ô‘7{ø‹5]ó—\°|ä1%Ù k“o(·»þÚ|Îk&‹üܼԩ¯£²A-ø%ýÅç»{37(7ÏO»¶ÄzD›>—þ¾ Ôðå5X½Èíª~é4ôg{¨eÌopÓ#Ÿ3)R3-%€=%!7#‚s÷cѤ€RB6²Q8's~£!½~»…~ke€¦…€†n:ÃáÂ""R+”"±–wµô{‘…‚attbwM8@h9×— ÖA%Oã3b!€ŠWå3xIׂÀ66es6»âÏr(K¨Wè„壂”õƒ &…ÝwT“S‚]¨Z<ˆ½¨=[gŠMsÅRŒIWX‹øI…t±6mS·†ôržbäã>.ŒöW‹ÄÕ[{xŽÑƒj‚x‡jXM!n(`Ös?D§¸‚Ø6Šþøeà#wõXwÇ“3‘ÏˆŠ‰óŠ€·Œ,$ˆh &·‚„¸“8ÞeÜ<Û{X¥C|ñŽŽR74þ‘zG†§3x¡þ”£)2¸gã‘¡86u $ Ä’«H°ƒ*1Ù53©( 2ñ$’ ©$É=ÍÒ‘-)‘Ci7æwoôU”r2"Éy’P9;Uf8î”@h•/‰•$s~f¨<2ø7"4[HG(Æ“?R–fÙ!h9ijéJXÉ'ó–¡2—ÆÇ•E–Î(–cù2â7ß&•©B•A ŽW˜æw”(ç;vc’z§‰ÅÁ0 sSUÔ::Ô—|ø—ßtB Ç™Èá™3šGÙo¸’HS‰)”xu1Ø›9ˆ— 7$¤9?0PZƒš¤ä’€¹F©2Æ•g‘›åÆ€#˜E2{Aþæw²âÌôFº¹› ‡;4'}°’ˆ=´j VYƒ1YE!ïi”È™œÐõ@v™¬©5‹ƒžZR1ÅžõòWV³8‘³+nùzôYŸâ9ž/ùú a¡:¡Z¡þX Ýùž¹© UÉ›«Ù.²ŸfIê9MÚžZ#J‘;c5z€i™½éœ/g|‰(BþiLË¥hñi|ñ¢à£ :£ù•ð‡e«ö™Õéž.bЃ}áY™CÚœEš,ÀYo(i¤OÊ—QjLÌ @¾YHŒ9טp÷o@º‚BZ]ø ¢bj—;™¥Z:<“Ù¥^ê¡`J£‰³˜´(§5j¡€*¡b§þ~)£Tê¦íçŸé§¥I=i†kÊok©§¨¨±É¨gÊ2ƒJ¨©i¨Šjo §Œ ^¤©JY‘‡m ª‰j©:Š©Ëò£§Ú‰ ÚŠ“Z¥\q¥¶$›sº½7÷\Ñ€DÅ;œ‹çÑ’‘}ÊOÍÏq,pM®p1®M¬ÊCÕÎöÛÕK¼9açc°EÖMÊ2}‚T]{kNJçÖ!o8×Õ×l-çsN×PÕäK€Æ×L- -ØeÝÏ«×rsm;ÍÖÍØZ½Õ\í]I 0“m×mmÙo ׎…Ø`­ÍYŒÓ ýÒ+wÔH¤½mˆ<Ö«½CÓeos}Ú>HkAx¹µÚŽOÑi=&<¦Ð cÁ½Éf‰ÆvÜ*þªk¾ÍÜÍò6o EÚºÜ~¼mÕ}××-Ï­íQÜÝÑÒí-@ uäæjã½ÈåMÜçÝÝæãhÉÝÞÖýÞÎ-Ú´TÜÚ–ÞnÃ`+]ÎZ¬ßØ}i åßÇÂg8'Ô"mà‘Ý$„iÖfêݲ€¦ÜUfÞŽÛVçd^&ŠNöXÛýÛ»øá5RbžÛ'ã îb*Ü,^Â5öâýýÝ2ã²í‘î}ãïšã/¥d=.ã-–âf%ä¸ââ2¥àGÎbNÙùÍäCÎE:ãQgS~qƒ¦°V>nQ5ß[¾‚]Þ¡æ—èäâeßgþßi®æUÎæËbVY^É<çþðUæVeç9ûC"¾z{Žä?^Ýèay>wf®Û‡Nk_þ†ŠNµnW(ºb¥…é5[•Î%ŒÞX;z,GY}…Œýé*1æŒÕXg X>U¨žêª¾ê“ndîêº~uV…ѵÞäWôVº>ìétÓ›Ù«=ë=•ëÄþæÎR¿.¬>AÂÞìÃÎëiäëÑèXTíÖNZÏ~JÛηž_ß>Vº˜íãŽåNí7vîæmìãT‰ë.0„Pð.éònVÚ^ï-Ke„ïùNyáŽ]þîÓÎ~‘Žîé>Hý~ðØK¬æZt§I/Lõ²e„KtñE‘ñ߇4ròØõð Ïîínò,¯³)¯"ßò2^(ÿòw§ì3Ïònó,ó9¯L;Ïó…„ó?_S5/ôÑFôE¿QHk ¿ôXŽìMŸõYDCS¬hõ7šõõô@?Q^¯%?G;öL2¢zôhßön¿q;./xotcl-1.6.8/doc/._features.gif000644 000765 000024 00000000430 12161600406 017100 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/features.gif000644 000765 000024 00000015365 12161600406 016700 0ustar00neumannstaff000000 000000 GIF87aÃz÷ÀÀÀðððøøøßX‹F@X€Fòÿ¿°¥Tˆ@< 0MOM›,ÿòñÿÿ@¿¿L «ñÿ@¿Ü¤ßv&‹ @@tXXóFFÿ¿ X°óFT”Ä4 TM@tbócMÿ¿Ü°vTÛX~vF• @°Hòÿ¿L «@¤XE&F ä¼xÏòMÿ@¿¥hˆñÿ@¿€fLl\X~F•@¤H& HX óFÿ¿ÔEÛòÿ@¿ø¥€KˆM@€HhLMñÿ¿\T˜òlÿ¿¤X&F @€¤ƒL& @@tX°6XH FøÄKT€FLc°óÿ¿UXfEFüt]óñ ÿÿ¿¿¥Zˆs@$||ôMuÿ„°ò'ÿäLj¤„ó&ñÿ ÿ¿@¿[XaFg X0ôFs$ÄÐôTöÿÿ¿¿„°ô'ÿX›F|;°f„T°O'¤Ð&ö ÿNИöRôóÿ¿)n„O°T#àÐòöÿÿ¿¿|Õüó¸@@z¤HÄ&óMÿ °@TäHÏóÀËìßX‹F,ÃzþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sê܀ϟ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X‡Žü «×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý»b}‚€·¯ß¿€ L¸°áÃ_õr䋸±ãÇ#KžLY-€Œ+kÞ̹³çÏ•/cÌ º´éÓ¨S«î*º"éÕ°cËžM[._×µsëÞÍ{ö퉯{ N¼xaÆÀ+_μ¹[äƒ;ŸN½:qè¥[ßν;êÌѽþ‹O~3øìåÓ«_?˜4zöðãËþõ}Y£f¹ÎßÏ¿·{‡Ú%VT~>õgà²ý×P€yˆ–~F(ág 2Ä X ¡ƒvèád.t¡†a ÅÚˆ¦¨"^!*„≯éÇU†+Öhã]-&ôbnX 7)d[9"´#‡06¸ãL2YäA/Òˆ¤€MVi%YOå”2þ8å•`6™eA[Æh"a¦y㘕YbPIª)gl´äœxæY§@wæégš{Ð矄Vè …&Jg}*ꨞŒ.øè¤jJé¥WZŠé¦CjÊé§5z ꨊJ꩚Šêªû©Êê«þì¹ ë¬äÉJë­ÜÙŠë®ÓéÊë¯Êù ì°Â Kì±¹‹ì²±+pBK”W@Q[­´> cf×b‹(³…:Ëm‰'Rk.´åòxn¶Á1Æ.ºðŽ .«Î&†¡»ö²¯¾ûòëoºfæûå¼§Ök®¶¤kâ¶ÿò…ð½ÑbKðªë›pÃ3˜­½«Ë0–ßNŒgÅêr‹ï¹¿Ë¡»,{oË*Ë+ò¨$;ülÇ.wíÎû¸r·3ª,b!½ëЇmô­H¦ôÒ³6 õÔÇEj!ÕXk&uÖ\³hµˆšöt×#íâ\cI6Ófëˆöci¯]¶WöÝ·­—6³ûsþ—=úœ·¿:G,÷Ÿ¯ÌïϯÛòËŒËûî¾qÞaác¬8†_Ü£,9¤t7zÖɇ[¸Œ™Ã¹yéœ{þùœ”·Ž³Ë‰gLn¹ŽwþïërÆÎzÂ0;¾x̸_o¾¼ÃÞ¶‘aÓ3Ä&ódàG/3íɺ<”’Ežý¥[ãø=¸áÛåýø–~öê¯Ï{ûîüƒÏï5ö¿Ó?©ýøÛf7òú#Üö´d¾û%F ×É”–jÎoÖºÖÎî&;iAî| „¸pg³Ó,w¿^þ—Á0 kzqJYÇVˆ@çÐdý*¡˜ئÑõLxD™-w2ÒyI†þ™¢¡l¨$ãaÎusaÊXg1 1t’""º~˜3Ú.„µë!‰œh(!ò©3‚áÞ®Ç2Ôy«‚䢕øg ª±k„/Ìá{øÃöͰW7 â›øÄ(&ðzIœâ»øÅñTY ãÛøÆüýliŒãûøÇã•1Ry ä"ùÈÓÕqi‰Œä&;ÙÆØ-“ŸLå*—8Êœ²•·Ìå ŸGÊ]³˜-üå,ùÌhNpþ™3«å4»ùÍæ]3eÛ ç:Û™»rŽ,¥û“$C—ÏA4Q²Ûç;ºÃyf잣 FÿYEqô 1üèC[ÚËP43~¡[hHwºÓ‚Æs¥/Mj':±‹–4¨AíéôŽÚÓŸNu©gßS8È–tuGÍê¡8šÖÀ°­+kXG˜Õ­öó±ÿÜgdûÙõ¶^‹ë_ïzñ>p³_ ín×:Ólo }ml/›ÅÎö¶ºÏ+moºÚÉV¶¼Ém]n¯ûÞäm7\]èlÏ;Ôßv±ñMð$ƒ{ÎßÍõª}íês:Ýøvõ½Åœs·Ùs¶Îí^ây½þ®\Ñ\<¿¸ÈWc’+šå0¯1Å5óš·xædU¹Íw`œ˜ç@÷°Ï»ªó }¾C×jÑÎt÷&}ÆMº©]Žj©[]ÀO—êÒ¯Îuš¦T‰aAÚWïh›Áø¦`™•²É•r*–%jŸ9œ¤¨£Sªšly¨ùœþÔ8Ÿfi¥ø'Ÿ¹·ißI¥Šú©™?x¦R*©ùù£Ë'¡7uŽ 9›ˆy§ÎǺY§ˆÙ¤â¶¦šøˆ©*tn‰¨·ƒ¡IŸ… Ÿ:Št‰¢ö)ln§¹y¡Fº¡*–æ ¬cI–§ ƒ•ú€'Šc¨šf-ÙXùÖ¬”¦  Ç@&­gö¬E•“Ì™y©tÜzuÚºPØ®Îú­Pçexf®>6® 5‘·®¡·„׊®Zw_ñúžGdåJ_îjZzºqWØ€;šý†šmY°€Ø¯NƯGö¯5ŒÚIƒgªƒ°z“I©Ö žEFšk¨­J¢§ùªý b Uòš£ŠÚ Jþ¨$ö²×F‹Óh©›ŽJ‹XZŸ8:£Ä8…„Êa'ëOô k¢~Š¢Z«Š —튦išŠm;[›¢˜ÚršŠpúÚ§”v³|ú³g‰ ©H‚ưðU£=Z²²ªp<ûq:¢a ´öªv]»™‰º¥>Ë–“z«*{³f‹¶II¦:«ke*œ/*²¸ú WV·tw·Þ˜±ú„¦)—Eë·qÙ±•I«†»±{k¥…›Ÿ=˸&븃ǭ Y¢¸º ;¨J{‹Ê¡¥»µzÆ®N7’¦‹x¶•¸K»/·»ëølAXÀ{tÃkO‚[¼Tv¼[¥¼AǼò„¶Éë¼Ué»Uþgj™Ghâ&¼¹ÛxØ+®rGkÐ+Y ÍX¨<ú–ýI¹Â¾³6¾½E”Þ9¿Û9±eˆµÓKf®k€iÙ§J»¿ kdð«YºW¥‡èƒmK¶œ¿@û˜y[¿? ¶W*™íÚ½–W¾˜Ûh¾–À¤;µÒ)f²»ÀòYµ‘º hÈÀqfÁ›—².ë‰v8œ!̧f1L´·£p¥±[­/6Àµ§¯Ûƒ{Ã9Û¹(¬®¼² ê£Pk‹ڱ* zÞ7€ôÀß—ÁŠÊÃΪÀœÛ;Z©^kˆ3Ü¸Ö v+YîªÀ¯ÛÁ+ÀQLzÔ‹e\vq\süvu\s>\NGœÇÌúÆþ¨çÇ1·Çä4½},ÈÞEÈnå¯ù†aˆ|bм©7pã÷È&É:1Œ“Öƒ‚v9—ìkÉ@zÇy7ÞÙ¥E™f|¢¡Û$yÛ¹Q{±T‹¸ªÜÊ †ÉÅÂuy°ì²l»°‡L½ºŒC‹¨©LºakÂL<·¸¬«¤¼o¼L´*Êœ–¹˜ û̹ È­7ÍTj™ûéÉMh«w¨Í™úÊ`fÎÉÍ'5Ìê,tì,‘ï¼nÅ|î¼z6J`,œÏ ÷ÇѬ_Å›«ú¼A&sñ|‘µK\Ь}Í‘ªg\ìËüš›–—U ¬Åm÷Ï4ç`ÉmŽÜÃ[Ã\ºþ¹Öi¿ܨ³ÜÒ×iÀcÒ9§f¼ëf¬¸¡Kœ-»³ÚÓ\Ú ÏRùÐ iÓìöf9ͳ‡;μÆÅ6ì¶¡›¾;Î9fÔ%9ÅÔê‚Ãg¾iÌ´ºÁB ¨¬cD<ÔAM£;Ô ¢¬ÙÄ_]~X’šH™i¸‡*m×^³þi±O:¿Èú§ØœÒVkÀhl©+úÖ`œ<Óè¬izIÍ:<Ò̦Pû£ ¼–ÚÖú+Ø9œœ­¾M ÃPŠØGKÖ¯sí’+Ö7ÂjÃΜÙØš9Æ)vϼÚÐÚÚ0;Ðr«ÖÉŒŸ2<Ù¥-«w}­°ÇÛÛê}úµbl´ÏþÍÏœé׸š·M¦Û—ÌÜäZ¾±«Ð­º[-Ó´}͋ʭ\Ï6qÌ96Ï»MÓ?×µøêÞÛ ßD·ÏѦÝê¬Þ5¡ßø,¿‘-ß íbüMþqW›Èø ÂÜý® ­Ð%àhVàMY×n¼‘fš­¾åüÝëûÙ î± Lá2ÁÞUmx']ĉº/k±b ÓÑh³@hßà*à½xD Ôç ÛHûâH ÚL]±tKãéê¤&ššpùÄ—ÙTÀ<ž´ÔÌhÃCþØáÄS-ボã„ëä“ å“Ü…«ÓY^å~—²G^ ¼r9­ÒŒËâ|MÜNœæcÞŸ}ÕD~¯Xþjëygä!¼š]ýÓ~Jæ·íÑX×à»çÒÍÏô]ÀfËNç¨üèx±á™çv;é\Ú–°ˆ¦èûéÁFâ=Aê,)ê(‹êï«êBûè>ÊVε»Ë{Ü«é[ëî›ê¸~ºáèû¿Özè^Í¿­Úc¦N“¯‡Ý6ËÊRËÌKØ—ë#×ëºÑ\NÂf:·L­]\¯Öî½¥Çä²}š>^ÎkÕJÞîN¼Ø>¥bJ¶¤­¦·ü|ì펼Ë~Ö•¾¬C|œ+.íA\Áá~Áï·{jÕ‘k¹™kìKí»–ïÍË꥖ìÂHñ/ñÑ‹ñ¤fñÁÅñ—æñæò–&þò,ñ$ïØgžòwfò•Ç .á nÖßVð+\Ç2=óA)Ò*/éÄ|áÀ½ëXbO¾¿ÎÕ|°v­ÁH¾¨½\ÅÞ¢­Á‰-è|7ëµûë±ø›à¬¥?ºó.æ]¯Ø1=ݦý˜Wôñ{ð=Ý}T[ÝÍÕm·ø[Ü8[Û³œÖ;=}jOÀl¹Ð>çTÍçnÛNl÷³*Ì+*Ø>m{}ÿÃãÞ­^nÜʈÖkýæ‹ûãï{MïÊ\–ÏÇû‹g©ÙYšù`¿ÙuŸ‡ïõ ¸²›ö6/Å‘ïáûÙ´÷;µ©mø—õmÑú‡Úòú³Ç,/l‘žÎÇ?ôæò*þò‚<â¡_ÈË_gÎ?‡Õ¯ÔÓ¿ÈÙÓÛ/Éi“M¦7NôÅȩ݄wù@ÿÑXÿ»©þi«½Îì¯ßŸÉË>€cš°Íô¢¹@À@ `ð A… LÈP!Bˆ:„xáFŽ=r@ä’%MžD™RåJ–-]¾„ 3ãGš5mÞÄ™SçNž=}n\¨1"A†=V̘tè E…b$ꔩR¥K‘Fµ8TëÌŸGEˆVìX²eevE›VíZ¶mµb-˜5*P¹[—Òlš4èU£o゜{W°^¡n~5›XñbÆ&¹†Yòd¼€52*q¢_£uA>þÔ[t]¤˜9ž rÈ‘]¿†­ò1eÚµmwåJµ/Ö̧#ÊÍ;û¢èÙ3g5Î[0QájYƒ]:ãæ·­_Çî´ðæÓ„}”š›¯jï¦%ö\ùùÈϧ¿‡/¶zvúõÛ?¤˜=èï[¹Ó*¿í¸K?«Tn¯ùÐr/>LiAû&¤Ð°¦*ݦ ÝjB”0CGÄiCG4‘­?dqºO„Æc¤pƵVl1Ç×^¤±G’'u$R1ƒD2I%i²H'Ç:rI)§¤òº&ŸÄò¥(«ä²K/Óº2K1eû²L3ϼ±1×liK4ß„“Ë0Ù¤ñÓÍ8ïÄóÇ9é\ÓÎ<ÿÃç ã³Ð’ü 4QE­ÔPGIBtQI'mkPB-4RJ7åt'K1}TÓNG%¨¯ZÕPKeµÕ,½4ÕL]¥µÖŽ :UY]ÕV_Å5×Xwåu4cE6Ye—e¶YgŸ…6Zi§¥¶Zk¯MX]‰ÝU[o¿7\qÇ%·\sÏE7]u×e·]wßý–[yI‚·^{ïÅ7_}÷å·_açØ_&¸`ƒî`…OB¸a‡†8âw¦¸b‹/Æ8c7æ¸c?9d‘G&¹d“OF9e•Wf¹e—_†9f™I ;./xotcl-1.6.8/doc/._filter-inheritance.gif000644 000765 000024 00000000430 12161600406 021036 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/filter-inheritance.gif000644 000765 000024 00000015430 12161600406 020627 0ustar00neumannstaff000000 000000 GIF87aü^÷PPPÈÈÈàààøøø‹oFt@sX/XFcFam°eTra-‚Ñ dB<¸75íOdéIcüŽ#Ɇ¸ñ²CÈg§Bæh²yœ ¥'!‰N„Ž«pP¨ÇT¾î!ŸŒ¤*_9Ên)Š#m\²ò ®å1IvÊÝÓ˜÷[H2’KØ4Ór™æ$—¹Á]*3še æy†™Mo*¤šÈ4'/ÁIqÒŽœÝ¼¥CÐYNyž“›_þqg´jYÏbΟÑfAè }rž(5êDu”¡\1¨«P‡.”­´è@šÏkr¦hÏü'FÓiÏmŽ”™´¤ Hû MHS£á¨m<úPq¯r6Ô’~Y3–ŠÔ¥ ,é7ÚNšºÅJƒj’—’ú&JÙ$¤«‹"E,_ý–øÅéM°‰É] gôÁ1°Vԛà ³e‡4æo \aâV…ÈDã1tkcïÕÈÆ‰ Oëµb&·ØÇW>ñ“ç’º$o¢ …ðþb%,æoU*#[“Z÷9eÌVÌÍ1F 'WˆÄY¶rÑœ™ÕÜß4yÍCÆ2ñNX)ÎiÉ@PF˜eëìÞ%ÇÞó£[d†¥È¯ªíò¥IªaBÏÆÎÕÔce‰=Àþ'w¡î1‹\êC÷—Í4©Ê. {•Û"¬Å#êyÖaÝ‘öŒ'® V×[}õ6h[[ÚØ˜~œœáüæÅÁõÛ“uõD"H°[ÉwFvž3ãy•[Ö^¦õ“­çv»»%Õæ-šwËa\»êÏätcçsî3/ÖÐúFtV­Ÿ€×lÜÊ7‡Z®ü…ö³Z4·jÿ\ä6›M%ç&Îþb—šs…ÐŒIÀXÀ+ä÷#_·¯“_`ªÙµÇMI˜aÑ556gõÞô›lëy«X®§žóŠ˜"sWÑÕ5t©ãÏèÉ£XˉÆq?ë¸/Ù[\Õá5õt]eÇúí‚æ«® ÛÞ.ÿˆ {wv«OÑ]uWWÚÕNÁ,óëLj ãµ®¼£ýêÐS ÑÏw¬·“Í…»ÑàÄÀ^ñ5g|» /‹_üƒ½³ƒ1½ãƒÉà,OuÌ“]óB‡Ýñ¬ Öœ·Žç³žõx£-ˆq8¿<Í;x÷Ó ¼ßÄ’y×è†Ô¡þ«ˆÁîýEGë+áÝñ…þüi‚Å­cÓï×îñýùò›‡‡‰\ç€&ü¶kqç7÷KßlidB};ºÛ•ó|³à jí7C@†}RBză€~f#âG}áç>¾Õ°!886è&ñFjóVDã·> ø5ë@q‚X$b‚^!zèR Øz¯s6Xkø{ÉçÓ÷€$Ø€²Ñу*˜.(ƒ¦–n˜#µ²­61LcBRþáƒ+È‚†”97„Ç–H¨r Ò9R~§Ç<ÏñƒS1b#UH{WxixÄ)À—3]xCçè÷„ì2$ìò†Jx&ÛGIèbkx͇‡cDs˜+×ç(þ!x9P@”¶Y $o ¶t""ìs{R·1…«8ðfp‰ç5‰:…F $ÿÃt(((gÓ‰žH]î%S{HTâTëc1l·‰YÇsÕñx+òаx‡èˆU‹Ð7n¥¨*ˆ+‚2,·ŠÙµ‚?‰Ãx‡³Q…¡˜†ØiJ³…ñŒÐè‹Ô‘6ÒgEÕuüR$gøˆÜˆn¬¦‹¸ÈlÆ#ŽúGŽ¥R†pRCÖø†>„[v…Œ×óT¤ˆrøè5¢3-~À·yÓó1¸ñ˜H[¸ˆ’Ã=Š–ê·l§0ås.X„\—… á„äxÛ±%I!ý’@Çþ4•3Þg’%i“c¢"jgA*©,)n!’x $~£Á@7{¿‡”ÝÒ|‡;@édìõ‚{0é~ãARˆ’¦”€¨Ž¡§<ÑVoåØq‘s.U1/”’^‚ß÷•¯‡=ù‹Mg;0)1C$W“ò©=nY‚qø”Ï5–)Ó"iC>3DÔèŠÂH5K95}É|™Œ•¥7ó<ƒ˜'+sINó˜KÈ„qr¿ó1šÉˆÁš¬yC¢©(¤‰êJ^I|GÀÆ­¹›%èvq)˜‘L•·@Ô/k³1¼™œ‹™JD+ ¿““L©w Ô8çÈ6ʹ›zþùv;'›Ð 1wérwrÓ'\“¡‡>çœ>œÀsŠÓ96W–èyD~7+±Ùƒî žáyY„›ßØ‘õ¹=Z©rù)ßñEý)r|)BRFÊ2HW+:^¡ |¥Å&¥¡}ÕÂÄžrÙÓ³  ·m¼Vr­™r“)–”©_ÿ'º3Msw~¡ÕaÝ©ŸßY€VÖ©0ú„¦¹[?ÊAÚ¿ù¢$j¤x†¤òw¢¾'¢Ày¡NªnPZ€3:¥#‰£^ Z=W¤>ú¤‘¤Œñt½‡Ab*„dªfºhúa‚1›W*’e¥·¦w”¦YÕ£lŠ¥wª¥4wþ{*§\j¥c ¨nЧ÷ÒS†J¨ûù§vº¨‚*¥j +kz[*oªq*yéœ:¨›z¤‰ªc–z§ZÚªŠš~Ž*ª Fªñª~*‘©:««:§°š¡¦š«¨}¼še¬*¬®¬¶Ú¦²Z¨´zoËj¢yZŸº«ÎÚ«‡Ú¤‰:©Q­Äz­Æê«È*­"á­Íe™xÑ ¬–ú«£§Åz‰Çº®«ôŠmg¯CZ«ˆ*©ïš¥2h¯§sϪ¦ãÊ®ÓJæjªêfŽÒ˜Þ8¯ýZªíz°ÿj­èÚ-Õ2\a9nzz¯!°Ú°Ê:°šv²ûˆˆ‘µ–Ëþ—:²›°±°…Ѱ‹&$€rœôG’ÒÈ{+£% ³Ãz®˜Ú}ªÆT±WÒ³øù³!´ A³+Y¨k½ökIXÒ&® Ke !µK0}ö5m‚‘eËi*´´S+´ÉZ±]k…JJµžæ°9Û%*+}<»¶Q[§K©$ë¶&Ë&È´&ã´^û`˵¦Ø² vî ´€Ë¶±Ê°úJ¥/»·ÛÚ·ÝʨÏR¹¸+Ä·ø ¤œ+¤à*¯Š+¹[®¥·§»¯Ð:±· µ×®k´‡ºÙйþ:º««ßšj(Š­—[»‡ë‰»» ˜tÄ«©†kg_Ûºùz³Ì®ÊþK„õJ»Øë»Ûœ‰’®Žû¼•É[¼§Â§s&¾À»¹•*³æŽèKfû´‘Ë»ëK¹¯k¹Îû¶ã½íÛ¨ùû¹ie¿³[¿Æ ·Ó;š¸k½ï+ŠäJ¾Ò ¯ ±_ZÁS£·Ü¿ˆÁ š“Œ´¸²Û¶î;¿ À[÷Á(Âì¿;ÂêŠz(ì±ê;´H7ÚyøcÁVÜ.ÃëÉ¿÷Û7 $÷€{‡r¬ÁÃRæÃTKÂÐûF«w®wxäYŸIÂÚ,‹™£ºXîàM>‰wþ*'׫ÞN±ØUÙýëÑ ÛOÒ•½üåEÎl¦í¼8‚˜»>}:ëëu8CþBß{²Õ>âH~HË‚s„­½Ýì0½íØHß?厰Yèˆ-ì2vã%9Ï®5²2䨇ïŠR!h­±' "ž“) ,ô¾/%аFiêò¸ï ßð_Bhƒ{•(Å0)ÂÛþÝnÞï_G¼}" „UéÖ$oÀÙÞ˜ýîïD©Fùò† n-eßûS“&Ÿï¾|µT}:š)î„ô¤];á”Û©¸ìËC6:¯Ö³ô•m 6ô>3ó`2”’3Òpý+[mCxÝ<ióÌЙòHìÃäƒ8¾9 tì`Wá;é”1ìHrE ´ÐNŸ;äÜx^Ÿ)ÿC{Ý3 ”’H’ŽÌ<ƒÿ˜+ýɽ³L“–x™òýÎõÁš¿¢…+•’ “–Þ¾3V¦Å¾Ã› øŸÜO¡}Úh¹ø°ŽŽFç™ö×úÐúñÃ÷i›t>#¤ûÄoË+ŸÅ>„áPT›a|›ïþ'YZüÒ¿ÌÇÆX½BFž3Åùïf”ÓOüÿú™¥üõø÷_ ïO©öß͈$þžÙ1FÊmÐ<ï<럭ìþïÿ0±]|ZA@ D˜PáB† >„QâDŠÀ˜cAŽ=~RäH’%MžD™RåJ–-]Ž Sf€—5; À™SI ú$4¨E¢EEZ±§F›M>…UêTªgʬªRgÎ’L…fäˆ1éX²eË.›UíZ¶mݾy+Ü[wž\’à´hÍþ,±oÏt FœXqH¹4´›’iÐBIòL8ðæ„™ó>þZôèªEG–œ6è稘=¿†;vaÒµmßÆí²±cШ%ÿÌ\øpâÅßšm÷îKËÆ?‡:òÞ¾™KÇž]ûöÇWO[¯ÙœûxòåͯŒ9ZyTñçÝ¿‡?1x§íåßÇŸ_?KúOíï0@Aï?½~H5—úƒÊÀ„ð>ËÄ ¯Jð%Œ°Có›lµÊ.\m# }jŽD ¬kCö>„1ÆòP\±²ŽjL‘ÄÃp¥õÜbQF!‡¬­Æo\±'Ê<Ò1,—$ 'È\œ*H"¯Ä1#¡d’ & loË ¹ú.+³D3ͬh|ÒÉ%qdRÄ8{lþ$å¸ÒRM=÷RA0/œLG@mü©N;ïTìL>eÔ½;—k4RI'5 QJ/Å4ÓG!Í´SOÕÜ”ÓOG%õÃPE-5UU÷{”8E\5VUËtµ©WeÅT<µ ±×´(,P?ƒÍµXMAVÎA•1C7™56Zi¥úŠK6ŸÅvÂ'o¶[o³µ¶P#u³×6¿E7]‘ª­6, ÅPÌsÕ¥·Þdï·Yå=²^ÕU2AU«3à`ßuö_…½åÖ…†[›ޏbY)†×b7æ¸c?9d‘G&¹d“OF9e•Wf¹e—_†9f™g¦¹f›oÆ9gwæ¹gŸ:h¡‡&ºh£F:i¥—fºiã;./xotcl-1.6.8/doc/._index.html000644 000765 000024 00000000430 12327771636 016612 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/index.html000644 000765 000024 00000007667 12327771636 016420 0ustar00neumannstaff000000 000000 The Extended Object Tcl (XOTcl) Documentation contains the following parts:

XOTcl Language Documentation

Package and Script Documentation

This section of the documentation is under work...

Tcl Online Information

./xotcl-1.6.8/doc/._langRef-xotcl.pdf000644 000765 000024 00000000430 12161600406 017773 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/langRef-xotcl.pdf000644 000765 000024 00001024003 12161600406 017561 0ustar00neumannstaff000000 000000 %PDF-1.3 %âãÏÓ 1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>stream x¤¸T”mó?NJƒ€4ÈÒ!°ìÒÝÝÒR.°4»twKHw—”€ )Ý(‚”” "%!ù[Ÿç}Ô÷9çÿ=ç8g—¹®¹çškæ3Ÿ™{™è4µ9¥,áæPy8ÌÄÅ- PƒÃà®N (ÄâÃfb’…[¸;BanÚîNN¶PˇPW¸»‹ÔU`…xêö„®Ž­›ôØLzPW[8Lø¿Öd\ 7Ä‚,Ä ¡¨cãаp€ na>na0ææþyì_Špa€£­=›Iîäíbkmã& øç_«ÛOu€¹7@ÚÖÍÕ aÜ‘ ³àH98þ|À€ðêâµäúÍ @jÑsXØ@`ÖPWÄ °…œÜÍl-–pGˆ- ›  …A]ÞZþ<ågœäá.ÖпÜqƒ¬6nnNÂ@àÏ`XýÜârµâ‚AÝ€lˆ[ÈÁ,eàŽ?ÃçŠýóaY[¨…ÜÅxh{ÜæûË‚•-Ìò¯ØZº;ua¶ÎîP%YÀßjˆ%ìÛ5k¨€ÄÏ/È @P/ àÏct¼ €Ÿ›-C`–þ¾Np'€ÄÁêokE|aûºB< 7w¨¿ï¯¿KØ ÀÒ‘#s¨5" ·ÖËP«¿e5ˆ›‹­Àˆ›‹›››WP,pÿüûC6AäÇsð¾}TâürõlJKý¾œ n!⃇âáÀ €ÿïfþ Ðñ— MDúþ÷íiJ0+8à¿BDò?—=þ†)€õ'èÙ¿ªÃÝlÁz‹n ÄÇ_pý?ãϘþ? î§Ú>0ýÿBýÿ ê ¼»ƒÃ_ù`ý›¸Ð8Ú:xÿiéCV€U·ÿ_Ú¡óï´€JnDÁIÁ¬ ÈüÌhë*oëµÔ´u³°ù ¡ÿY×…YB]laPM¸«íOp"ñ禎­…= êê !Êâo‹W D@||ü­@a–¿g(³€[Ú¬`„ ÄÅâð‘`>>€/âQ“P¯¿* ä‚ÁÝvdáæ`AìŸXâÿ&NÄêß <@DA:@êý½Â tv‡#¸ÄÜávsw4ÿ @ëŸôóM~ %ÜÁâr»"t‚"xq‹”GÄ¢+¢Ào…þ>ÃqDHÿ«ËË tBPÌjuk€ô÷â_Ìz« B\Ý .¶®ö·k<@'w×[™h 6ÈíÐÆÛÉz{^þŸÛÂo]ãº:@\mnú@]à·²»õ™èæy»ËºÙ¸@Ù#X×ý6D|<@+[§ý÷Î|¼@W/ý#ò]¡¿xÈÇü¨ÿhatÝ>!ˆ¸¥fÿ(!L8Úþ¾ÈÏ tø‰¶ÿ*ñƒ€PgwÈmŠùÁ@k¥ Bz«ÃƒÈÔõ/ ÿó/r›~> Ô­:?PúVÊÜ ‚@Ù[A(÷ À ”¿@@…[ T¼x€J·/PùVàªÜ ü@Õ[A¨v+Õo! Æ?‚ 7PóVµn0ðá­ÀÔ¾x:·P÷VàêÝ @ý[Ahp+ ÿ„¸nÐÜbaE )¿hŽXý™B<ÿÕý½6„9rµ°µµ°uAŒE·¦ù€î?¹ÉÕŽ#þ›P!~DÞ6Ù€·#$4¿ÝZü#€¸¹·Uƒ˜2€·&@ÜÐÿ¢É´þEâÞˆ›hûË?ÐîIx[Ü nAà-Z-x{3ˆx‹¼-H tºµ B`ú‰x wQ{¿ìño ÝÙzü" =o%07ð¶œA`Ðû—=0ÐçéïüAË4Ì‹Hõ/^ùþÊ2‚¥~¶«ÿf æÿ;Én¶–¿DQç08ÌQÉönýëA?‹þ/²·D s·¦¥ÿeƒøy€?¹ÑÄ~É?‚MÝ]ìlñË…àý Y!¦<„³p{(ì·+ð#81Qþì…ÿøÏ/´´…º@]m‰9?aÿ¢oU$w±´BpÚoÄ­Ým Žðß«$:À­m- ˆ&ø‹!Ľ¬Üþh sãÏ#èà:B,\~õYÑð –ü%ÞˆŽ‡è9×~i< ÁŸMÁÕý¯ÞòK.„þîÿ»ƒ !ˆ…»Û/–A@Ç_ 'ˆ€1Ä‚¨U§_ÊGÑòþê_?ø»ÿ‚ˆ|A-á¹­f ßÏÞõ/§óÿŒ°#‚5ÜN.·A¸ ñüi ÑC\~í Á¿Ú£ Äá@0Ü_Mñ?Ê¿$\ôO‹ù““ú—@º“ú#F¦“ú›å¬ƒÏ?¹Bô¥? ÁsRÿ 8! ”Ëo0G0ž”Ü/–„€2†ñ:”ûÝ90‚ÿä~wŒ A¹qÌÍ”ûOÀܼ@¥?mò•þ´ÉTúW›@¥±)”s»E Ašê¿‡Œ`N?ŽEЧÆÇ"8TãߎE°©ÆŸyÿë ‚ZÝÜlïUÿÍÄÔø½£4«û§;‚@Ý?Ýêþ›;êÕýß³lø‡0¨cw¹¥#0Ñ£ .Žˆ!ÕÜáŸ`ÿ,¹_Ú#ÁÇ?Í!¸ø_ýA´Ò?ÂFŒÃÿâ¢ò Á<>¸­C0hñ?0D ó6úÍ9Ä8ÿ‡s<¼@è¿9ÇÃDÐà æáÚþiShû§MAঋßêÌ#´ý_›ˆ±ú+ =ì°ð‚ð?ŽååÂÿ8–—ÿ·«ð"híOƒFûOMÇÃö—† æEÐØ äºÿá bÊwÿÃĤïþoÎðîÿ{2bì÷þÓ/‚!¢›þöèoïøw_·¿~è@¼bÿG¶²E¼AA¡^P l²“ªîu#´üòÝ{$ÍéÆÉõÀåðsÿ× !ø1âd¸äµJã+>:¬58L÷Òh°bŽLлgÃŽGü†è[Á>½jByÕÓf_}H†áêùb˜’G>-ŠXTíYUÑl^\"»z˜Zü]¯Õê3‘Å$‚T×ì´»YŒ<ѱUÚ†–Z&æëžE½_8œ×Ò€xâ,³ íµYmilûçÆçòí\i®±ißj€ùHõ O‰jªSPœö” 7Çö•°×‡vHµè{YÂ&·Ëí\ 1ó5™]"ð}|r.¾\ôÔ A¾¾Òä¯ëpôU]WSg^ûß_4+†ÒSÍÑ)NT d0»¼WýHa•=Ú'ÁðF@Â꺴‚Pt¥½S¹†XWï:¬RõQ‚S‡çæTVÊ+gÚåui~X>ËúÁ /Ý“ÞOqùRûJ)ªÔ?ˆÙ‘•øº8Ô1Šù>i’ö´\⊓ˆbTu¿À]A^:‚ÄíVf:'åsrÉ|^ïÙubñ1ÕÀJf z1è[SVNû6ÜÕr½-]‰¬WMËAù“|– ª·ÅÐ>ÖS1@1ðà`¿€He¿3±¶cÐ,1©™ÁÎVúŠ8j”…5„¾&•9tU[ìs_î¾È9Ê3¾žÖTP(\ðd_*©ÌÚ}!4Npg#3²?m(Ÿ}yø2Ë yêañ'*X±^Ð]v9%{]¾×ð.4"$õqh<ë™Ü÷ûì6e‚¥†[Ÿ»Þ¸‡uWœ×5N gêb†[$‹d)›k0½½3Ì(ÊE*m­Ýº‹†ÚÄ=GûF óa ðVð‚6øÀA-†ähdz™_—.³ÓxÒïÊ\—¢[~“Wz­¦ïhaKñY­§dgd¤2k|½—ÖžmŒ>%J€~d›Ü+=;Vz[i1s5ÂØò Á¬d êØÕE díé–7Ñå2½½vÏÙœÖùÒ=ß°s¢dzĂѵÏS¨à'ÝÝ8‰D¸ÌйiØþPÕ˜ºÍ4›sæ ÅënT™+ž`xX»âp}Í)@Róö †EáS~]ƒŽîÑ¿<"ã<>a¢’Vð½~2ì÷:ý!V«Þ9)}~µ´åÚž×Ã}¶Ï€:ûáëq@µñPVµdÃïÃ?¶©º].¸Ê¢tð] "l:ËÃÇIoœ¼Z‰82¤†¨ÉÄW!¯ŠÙzÙ ü°Uéõ¯]G5‡½ý[¤\Àsú"¼WyLå'*NuÞÖlgrÓzNLÕÅ“`^ã¢ÖÅŽóÖ–“ôõ=N1Âüà8|®@ø¹+-ÿMˆÚ稫,ü@Vâ’ÊPܧg²ÆUŸ‘“Ƀï¤ÒéßćDô|s"‘>Á?W¯± }–h"dvÕªÄpÌOÊž”Õ ­·×ÿ²9&ZùྠpIº mªb¸¯!ì´ØZÖ¿ßí÷i&cÄ>jP‚—ëÉ9ÕVd’íüyÿ©dßÓŠòò{ìCoÈ=¹¿óM\£„å„éλr5÷ z–¸ëœ7ë7MÅ—uÛ[g»@¦*ƒóD,E*™ðЮèBaš+Þ—\‰ýÇÔôéiV,VO£T¶;ÃgÁ%ý¦ïž]wÞL­)Ò”§×+…:ªnÑPi]ÛR-ˆâ¯IÖ¬"O]D3ð?Ζ¥ìHˆ£Aë¶tO”stŠ$ ®×Ó@ÞZÅÞwÍõÕ+­ŠÎ‘ãr™€ìa› Êèþq+{À=_÷òu–bú“‘Ô=&xÏ&¡×4¿N«Ðï/xüè9«Ï3šÉá]Cª'¯œ™mÓñü•¶”çíÇHk?kÆ0m™hãeåûnF à•|t`¤Àxº(ëÃ.³ë{°‚§÷f®H{‘ѳ¡"1A‹»Þ²ë¡“$Töý:Ì>WÿÐ^›>CφºljïýÛcWÂa—QŽö£9‹Ól¯±.Å%p2® á™ãÑùh¤1ߨ2Ì:®6-¿{àû™bøCóZvÛ¦âÖ&Š4ƒèÛ'Y›”"‚häzÊU$ëo›:…“Ùâ¢d*ýYýà m.´iŸ¥¼ùÔ:ëGì‚’Ù#¦Ù0SÅnôf#izQ½¦z ²‰(cõ&ÊÛ üd×à«MqÆ#ÍÄK×›ßþÏ꟢çñÚ&9Æ‚Çù‹/è^'ÃÀ€úc˜]àÀ€Ÿ²ÊÅÆ3¥z|½W)ç±rã:t¼Þxô'8/¨Ó(G"‡ n¯â™”MìÉî_¡&|ýà)»Þ–õJºÿí õÊ^˜*^‹Òý5n~Räè’×T R¹ ë¾àË8žq·´©o´Ûq/†U Ÿa,Ä=W(0(gÒQ¥ÒPí¸šÏBk³%×)Âöä“](Î롺7lIOàö–ôMQ¡ö¢¬@EEšûîûYþZÂHºxf†Óq#Úk«H·OÃ#ëîpks!“‹Gs† íÄèÌ¥©qx¡¬¤T©MÃã>pMÕò(w|Ý.z"Ö“²ðÊS)–9‚vÏEŸÊÈJÁËÜ’ŠJPj!®P¯Òbðàšbò”ApCgVËíŸÀ÷<ÍKJÝ;oÀn\¼™Ý¥že‘¼¯> ºÐ:÷ÞÍ«.ú+®-Ü”ê;}›§†>!«{‡.‡—³ì_Wñ´P^E„ÈRUÝ›?ŸUЯx¬õà ¸Ù<Ûqäx”%£nx0i—ÜäH9Q¡÷°Ž—¥€9G;NUæ^ÂCý­ë—´K øcGß‹œ¾¼ö/µôëÐAìºÙ‘ÂÉI¶·¬4gçWt¶<98š!ø°n£^`úÒ0¶q I0‰õêøˆ„æ³$› ³f‡§pT¦\!üFé[º¿±Üjõ*¿ËÅ šæ„´åT[4îzÿ¹îÇYÍr½‚_á®u#!¼ÞjKy”R6ÔÝhüœõ¾ÑiÛ¯ƒOÃbUJ¿Žùµx756ËaŸ›=sÎzºÏ7ãRÈ_­$%ôÔ3 £½t1:÷JªJ×™Ô¯Á>ŠÆš8gª4ㆠÔ²¶2í.N)Ôœκö»›ñ8»‰ÑÇqR¹CÄká¾ReíIÚ¤¶-¼×¿ø½\ä4Ë(ï·kÏS9]_×"£Ç>½éÀ%ó¨:¾H¿!óY¬‚¼ßgöEzC¢”Ö¼B[ÄšþÀ¯à%–`âåjžpŸÐÙ͈Ý*,ZÈvM.vr*ÿ™²N‰©òœZ•$‡eª+\`æ¼Ðà)×á¬8˜Ñ¯y‡ýñwê¾@¶?ŽŒÎj× ®ÅЬÜ>¦‰‹„ãÅÆžJ|ÍiO–+RÑMìA¢ñ~«ï­9àÚØ›úJÌ8zÍ Lšý,üOåª|›B^O­Öò->Á¤ #«X,>Jw‘™ô\)láYó“Élòï% ½»Ë¦üê]ÚñÁéVáSãèÔ±ûôjm7#*£iL;K‡Þ&ïÅ‚#J¿­=iøâ†R§ö äå|á1’wMVÁ‹Ò;d–Å`¼¬†ÆwÔ*o*U_&ÙÉ ùæÆ‹é}V¸Ež&ÂPUµ˜^Z6­xËx}ê&·Ž É¡¹Ú´í³|«Ó#·¬œþ ¹¡Y"þ~7¦ÖÑùǧú]ýÄ¥î=ïBúC*UëØ#3vƒäjá²Ú¹ÄªÁ‚{ßH—6â Çr|ÆÊ€¼Üa* y2T^ ¬T#»G ¥8Wo·(H÷ŽÚ Hàï®ÞÎs4€í²®\_lJZDìäwŒÌ-‡X8¿ÎûhpIÈ\±$UMQM-Â>6fS©=ï=ô*ì™j‘*ãc:"ÔTÝÖŽ}/ªáL«’Œ‰ö 0ÄXkò³³ öžakJRM«4NH•ÀÃÜ_7Ríõ3Ðí®3ièÆ¯ñè»Y¾côX¹ƒqâŽ>©tr%w9Ƕ¿3;¤Eæ!~õÝíQû›\/ÀÞÞ”©m`Îã~} tºðQã‹T*  wx\Šž)á¹Æž ãÑ<ˆ&Ф&C*/ïçJÚ{ý `ßCÌ×28Íì &ÊP5¯ð⑬Ú:Ú0ÏÄüêoœUMÒtp_ftp– Š[faÜ#Qw™—¼IPÐÊ!u;^¡žÖMEë¿'ñYiOƒf£1*R¸°0ËÇ2úŽêB`Ê¡¬–ªuWì u fnŸ^e­@;#EÚ‚4MHß«å~N`~G³õ±cÝeßz·á®Ã.îë.ô‡¡ÏÞ²×*^–-„§ÿ0m‹‡\ôŸÔ¿EEÏ`¦ ×ùÓûáî¥nÁïåÍ4SgeÂbx¾1,_¯'!iByj¶»ˆ½1P›žgˆ¦™Q?œìÄÙò˜.¿\qyÿ>¬Žãð]b‡`Þ |(Y¥â„¢îlץДTÕ<òº_á}‚9¸ÿ^‘ú{ôóíÓ¾4š¬{š®VTß Z\ëìÜÄ~“ÿû#ù§~¾–þ£”}/_›Ò<[@¶WZŒi…wc©:d9‰Díø…¸) ¤Ë´¿I7töˆX#DÚüO·ûÖÒI[ÿ¿Rh÷%ng".E2tä#a¿ ,Rl]Ã{¬ÙsW®µœˆØ><å ÓwÑ1é«|úz2rÂÞÂèÝ øu©ž â"<6nΆ¸;ÄZ2èJÇNa}4H¡‰í¹mõŠØg?´V>*Ð'ŠR|WWÌùQŽâÖ ú ·t€l˜NÚÑèœ\O©ºû ö:º«½ @tÿƒ-nm=E©þá’øŒfzª¦œÛÞbG@y Îþ›´<®z1“vN —}ñx1ŠDq¸'å 1‰{¥­Í[} áÞ‡¸X5 8…c3½Ôgíå3¥B‡œ×¨ ÄÊåäÔ/c^œäó‘U W‘š±Ó–¸­X›;gJ:2GݲÚÀšêË¢ŒUù‘«&ŸÄõÅýtg‰§XÀíPŠ“è49òúY2Ù»d‚´¨¯./—'›ñkL¶ýPKGút·Jýøçkã*Œ”¹½¡Ò²Íôžœ,L=^Jí +CuMï6 Öþa·s´bøBº˜‰r§öC‚µOÀÃá< E­–ŠNMSI¯åȲTè—ˎwj™Ÿ ŠŸ‰2q _}ay›®’Èœ_•ð’hÈâ¶™Cûðùó.›ÑW$…qÁCBbBþb*ËÜ)“˜÷<­J†EœžÝ‘"õДëõusNK,àn ¹ä[wõ;Iá‘ËŒC"<î<‹µÃ§Ó{Ø¢ªö!Û]ÅëG„0dÚKå'Í.ï^Ðç:êG› ~îI…$Û¤aÌÌ–„Zãù=Ì36¦Ǽ/ §~S¾c¬ÖAñ£TÏ*ew¡)C É8$Ó¢ÂL¼þ +°ã”Y!46Fé£py Ü]›ì‚,|•sÁù‡¬ÒÔćîë—Þ ó3;'çÄe«7ME;ïÝ•Ä+iOˆÄ¹{ò©§[*“iH/ÔÕ0ôîEãud!&HÉ!›cQÏo´à(ª5±QX°+BWš~ |ô#ჸ'P¼TµÁ¦Z¶… nµâ­¥lk[òñÂólãâsÕð¹AH4C3>X/³ËÇ_>»ÒÂ=RÜwpAsÅzW”iA=%Ž/«¿Į̀p' þf¾âŽM¡îvé{¶ÂA}²z½4‘Õ™aÉĸ¼ê©Ëã3m Œ9Uk &RÕÂVNÉúÃq„Æ‘%^›Šô¤ˆãE3D¿U¹Jž´sÿø¨ ?yÛôÅÒÅt–Õ3š`5NÔo) ØLgƒf£XY”†›ýò,‘¡›9ÃuEúô1æWòtا³Õ†žÀpßÐU+zr§}Þ¨(æ—Itz°ö>dϼt7°q¬^‹5Šx”Ùb-áÂ_œÛÈsj½záÄ.‡EŽ©³EßÐNº;¾—ZµÜ–ÖÆxÜ1wn÷e ÿ¸#Z™û›¾îPÉì€æ¾PÎXK`sð[Ü+í®À>ž¨¥íºÚ Ê€êëP€hBήԊ[ïÛûë?5ñpÿPÆrÙÝúT}8uˆ¶—{"-m±³nïvP4b=¸1b /õ{± }rHQïÙ™ɇ¬² Ivàñ|6Á'j E÷èº9^ŸãÞ~úª3)C†69J:³ëø,š{H€Iè#úÖÛܹ2Åá»òÌ‘ƒ­ÍFÜÆÂ vp!=¿ÉŽn-ÜñA…|ˆB;¦öæ=uùÊÍ•Ù!XLáÃ'»ÜX2Çkf蔓½;‹Jà‰ oR¸ãh€G—UêK§›w¡½¢éyj h­"KÆÙ§Ft¦Åh«lviÉûÐd¬IYO÷Y ‚Qã Ê=‡ kcndtoBžÊËŒB]g†Õ>¥d¿˜„ëÔtu/.µ·&2§XsWrü}RwÞS<¨|æC¼Ð¾tÒL‚úš!íQÇ|˜2ӱ܊³ ÊC¥¤oD÷°ó}Í«ÀÉü@À»OôäHƒãùk´©— öVæu½ŠYl–sßL+‡}¢‡OM#ùâ>ìåµ=l… Œ¶pƼ5‰–T+R¸ìC›%E¶é縟Ҕ®¿8š$¦!ì°•.@¾àÍ/¤2kÈ]Ta·”)OfïHMVƒLÅÔÔ…lL•“a>TâivÊ9œJyÌ”+;†li42ÚÛ–5¬›ìABÊìx¢`Ô VtZŒU£‡ $ÿìTdTHO¼ãŸ}bòpTñŸÈ ÇýQSJ?Ío2,>4&D*Çi«Yl½ª *„(OÄ|+¤—ÃgîŒâ$Xdÿ¢£_ûeêñá“ïÔh^ YµÁoÎÌUQ»9ÈÐw©ÆœmÍ¢£ám„ýCŸ}š:·íj¨bÏÕ‘:¦X6æëý¸¶l:¿mpj³}=GîNw±¸YùøŽªD…°R’éO¼"׫‹;oÜÚn-ë¯Å+¶Tò.nTÉЗd¬Û¾Iív?&'½¦ôÜü^ݺ>¦¶¬AôÍÁ…νE0_èL*¸çÉÁ«‡y¹qaÍkÖ =Ç~Ÿ½·#Æq ¾Ý8Ó%+^êŒç(ڙ䔟ÚD¾S \£Óï÷¯ŸÎs k4LǵH”û1ŠÉ ‘tØ/?ôê¢&ÅÂàö0±©&#Å]žÈ.ÓI4µJp›>ª(< ôwÁ|¿jâ*™œ¢R®Œ?3øÖß$ÊĎتþzKÇ9š³§mZ ÿVp,ùP.‹`hÈü GHžEI:VT¸:cr/lx”›Ó2óž m€6Õ×ðGÆSÜ>cH½yºûöU$»4´V›–1ï1ñä…›&Ï6j„(cÙYI Þ ›åÁTeÒgœ¯i¾«>Ÿ·ýZžÆ™oZ?ŽÿЧëÈ“l‰ îZ(òrˆÂ0t¹öÕϼ|“Ò±>]Î’bBè6&ìŸeùx’&jŸ÷ÁƒïZ£$s!êrÎàF‚xJE»Oµ•uŒ;q‚>Ê“"º¬¨lñ U<óP…ÕÖ«oüäüÙ‘ù: útj&ØãÔ1qñ3Tá\ö—IÁ¯siù‘À¼ù a],Lö†ÔµŠ5ìɺZÂñS75ݤ„ðxñ޲áÔäi»–xu4­ÉðÀ æòÐ_m·M‡‘Ýïñ‘{FËÑæ&è­}Ÿ½ùÛ.I7"XŒ˜#Ʋ(¹O#NXã¸ßî·èjÖëòGtƒôØH̃Š(w¢|ÈÚë²UÙÆhÔ1óµ’ɨ‹§v)‰" *Nª´µxSõ#u½Ô~æú½¯4GvÊr³™Q Û±ú‰Ð>•ù&MU„Y~!€wm1uRòéT°Ä“ÙûVöÞ}B0Ó™=W˜Ë&IôÓûEI×]t @1¹ÈâÆŽˆfrøó›¥ež³¦³¹ñ‰ª'/ü/‹3ï`o2ˆú˜Í-\{·Àø0††6HÔ­s“!E¯hwtÉ0õÙ”ïm®Â–ó‹w1üÓÁñK„ìN,hÓdÍÉ ¯D•©m:Þ>?sŒSÕQÞ²X-ÊáŽw#0™”¨šXd¥qaJ0W«ÜQ&Ì7c¡–&MŠœ[óçÝ­¶Q/Â=ÌÛS±/™1•ÚÞêÈ;S3j/… T¢?&Û<SŠBÔ‚ñRWL*úw¡ò¢ÖÀ£Ç+w5 Êrý„òÑ£sìÙ¢?1¯ÀÙ" ÛðOVk¾gv®ÃÙçˆÒ¬XӰ↴Mï‘l¶ã Ê®aùÌnìîÕø`f8~Mu…?R`p0æs¥ÉtÆk±Øá•}}†J쀬0Äo0IþjòÙR®99Äkƒ%ú!ØŠ;Ø@såûKñ“Vûç‹y5NWcRDé…Ö^nÙ§i¿>XR7ǽk©ÌʾZöâ†WÔÄÎò³¯†yÛ°2=¶ý.@F)ï5Ø£ãkªžÅwW†eèaF•泂ɯ—œò˜VYÉ£"uû N‹vÍCn“L±ê±:ïÔ{¯ wmýbž7„¯/ø¹_<¼ÆšM÷¢¬ô[Z¢’K|ö¤ÑbŠüÆ„9«kŠ%–×ì1+‘Ÿ5‡˜X°¾Ð(áMØV¬È!E eOËƒÕ îòñû=Ñ¡ íø(2HÌf«ÙvF'®Þ_ØçŸvZ¶´3àŽ™Z‡h©É»Ú'hHO„‘íaghÑ•×évÃhðçÚÄ·’˜çA¯Ë Ž·0C2†¸x¿0½éK{à`àÝTSøƒfóæ‡œDÆ m}]¦*^ËâH” ‹Èì¼åNy ð¢ß±á"~©1 ›”cæäÕ¾€¯ÌÆbîtÊ3™÷%ÅÑŠ÷ëˆbÆ¿ 8d/ h>N`¥*ݯ t®¹·F pkÖz^农¼rRò(*j퓳>™un[©ÓN³8“ W3ü!Ú´SúVìÄÛ³™>÷x3n-±FHÅùq¦·ï;‚~žÄ¥Ç؉û ^¡6þÕ‹?ܤ² ~„ Î_¢Z¸6¾ùô¶ÙVJ䛿¡•JXÐ*ƒv¤2E:6ð[÷«2¢Œ\3ê—¶@Óµ‚{§¤ÓuÒçÄvsr§Á=±÷ßàØßµÍºZ‰)ÐN^'îzƒ­e¿#;^™Hé-W/;ªzÝ­éOò¦)`ˆ·Î-7Ô§†‘\بKÆ€ÁM}¨ìЖjjŸ+r"þZq»Së…ß.ý3Ôû+ên?Âð<Šî´•Ã'2-_R>ÉøÞ>i˜õ„ú¤T/ÆæIÑ£Ïj©!+F¤Ä¹ûtùkŽആøR/”§×!ʪèôæä+ɦ(÷k¢ÐbÐÙ—Qâó]éÒâ2åûÍÒ¡Oâb˜M ^ò¥¿Û2k4Ò{ŽR¦Ë÷\ÙÍùÚ&òˆÊߨ»öÍ¥êìN#&'òÂ'%LˆoD Ëtk¨Šj¹ù.á˜]tó1±Åb«Ï©Ÿ1õ~&<’çUR^.øè¼ëîÜö†°rP ¦NÌÁ,j¨TŒþë^²´KSb¬o3Øs:e×”5‚Lq‰Ì> éq(ç²,3‚/Uݳ»²Š–¯)×Õì/›Wr_ «À¯ÝE˜’Hì½ååMh´†¯nH[—-¯Èïí,¯ùQ4áÔFß ¾ë‡ ð–B1©>¸ÇмŸ¬×ùs¢w}%7´C·¡tJ~õn,z‹Ìòåšµm =úBÞ/ÙÙFÅ©}x4_¯ºD©–KoÞAÆbJ–$lÓ`Ü*EÿÖ(ä&‡L¦Y`Èlüî²éóÓ±ƒmz—ü†‘Q0E"’×A E„ꨋݜTgõ Ç *ŽÊÊ<Âcš?4†©oVœ|ˆþìÃÌÛ~£_¯è Ì6ãÊù¡s÷>ýÀ}KoŠ×oÏ(ê fèŸ÷èÜKåî öÅûž`dº HÌ®pSÄ[Sí¶1eÌ‘÷N $6{|÷PŠ÷ÂU0ø…|H› 5wgÖ²¹ð¤eògiP ‡ûµkÖ³ü‹N¥kDéVóí:Ì)b{|„AÊäÓî1it@Å$<›*•þν¼I¹P&q®—×ÊÇØ¥€«.å‡- Ó ô6÷ŠÞ}\;ARL›øÈœ$‹i"Ÿ$¹%tÔ—.+*9\x/ ”Xã47A['êîÅž9‘J Z¯Ä女ƒÂ"ˈÞvËÔö^Ⱥx}Iá¸{?É8uÙ2ŽÅ8ŽZ2q~OÕ_ßXm¿·´äói4Íý)#|K& Ä 8.ä|>é{¶’ ê^Ôeƒ¤¨ýôcéù’ W8‡ÝI^DâÛÚøüH§Ý&-b1,bÓ2Ùv™Ó/)}ªÕ)¶­®ÔÄ[©iF&T ZPØ÷æ·ÕÊ.óü‡ÔZµ’ÖÍR£§îøïõ.6SúÜgH<··¸ÓLùáhf‡Dvßs-.ùõ.aý˜ùÔ¶¤å5âÇ.óWË+Îíš.²ÖµÞÇ/V©gË6K3ÝâŽÒëïÑÏÂu¬Œâ6‹Öøžaêl’Ĩ£pº“5V~öpßÔŠµ»·%xcX sqÎæ£Å¦ãO$úÀçI­Þ±ÊÕǯª„¬5PTw9âH"WÝ ?~fæì…]d¡©n½zjo‹Wò“'äÛNß ä&WR§¯Z´Î[þñ¹ž¦@Ë¢˜‘äó=&ÖÄh[þ}CÅ.Þ ù”÷'–•f{mG²7Ðc! sšÖÏÒ¥2m•§î$³ß.µ"vÍò†”Ó¯H-(LR¨güKéü〈Z‹;P‹:í{ê·:ýQºi^(gjü™Þ_Ê''¤f8.mŽü°Pœ`šÎZ N™a¬¡pÒ j<QqHÑ9É—®’'\ÓX|2|÷\Òê[²îÉk•‹¼­Ýäô -¸;%^O÷t¸ƒfyUî>QNëûÕ'iÝ+Dá›™ßÝEK#ó#Ø=ŒlYfkâܶHÓ1W§ðY‚JNžˆË/HFJq[ŠïV´Ýq¯cN£N¯8,³Çb†úU}b 3#è4¨Å%¯qúŠïŒ›^øN™àL»–¼K¹lÁÄèá˜ÐŽg¶{˜Ä½MW ‹: ±Ò`7jº¹Eæ ‹~Xú°‘©¦wðpÒ¿_"‘^Ÿ¢Ó'iªDí´‘GÔ²•ÕÜÝÄ$Õj覒O§J3„ò1H¤àÜÅŽßqÇÐÖA⎈Uùsšù=<³VëÖºP±Xëý¦*vð>à\kKªëÙ.ª¾·6¬éÛKÜf­a§›Èvü&ÆËØ–iLîÖkó«òãrH’ê{FÑÇf-K®G…i yCÈô»ú[½8«¯™’^®ëŽ.î¡ù*©ÒeÊõñ(›ÝÊGƒY%;§‹ö'Ýil+©;÷ù?õ„Æ~m1vÅ£#¬ïD¶ôQ7¹)ÔõrFñŸ]6ãàKÂó{øÏùT}&ååV†I-¥fYÌ›´b`åG$O"”&%áÝ~šgh¯‰XÕ fÂÊ÷Šß›}š× ‰Ý*áâ™OBíí |îƹG$ØÙæò¸Â1]äט˜töž¯EƒòšõcG ¶²ÔÇÜgîžæ Ÿ›ë厶mdáêÒ茱 àÄ©~èa|Íã¤Ê”oúÙQ¨(·é|ßÝìßô|­¥qÂ8‡s­wšS!Þá¦2…§õ>€ÂB:2Šzï€ï+ù® «¡ƒ_šÞKª5RÝC ,^%®ÕKqÙÖÇ”sßWÍûô …×7Óñ€ó춬Võ­™NÀ©7ÙCDe½Î"¦Ág²;œGßhAmè]ú¾ˆyÑcNTY©Ú¶Op®Rü9s5Õó¼x¯,ù¡DºkxLÈÀÏŽÞ’òäùÃÞAítFd8/‹…“¦o½ÍWßæ¯¼g$¦y 20z.ð®ÈºÕêcf®ˆd=Š1×ü0ÄušLkÆ7cr-¡Tž¨â;BµöóF¼=h8#¡}FÃÞ¦Úþ`@!ðQ‰aô%É¶ÔÆ*cíî‘ñf°æÖ ïK}ÃöÕì < šËHÝ]#˜S¸ê_é?<ö‡öf9z‘EÔìÈÃj@ߺ†êØWõ³»ÝŠééÓ¿/%0´F¨˜?³*©jmxY¹€+€žæÓ#iÂ%-_<’5õ2û¨óÀQñÔ¶)…ÞßZ¦?ß±ý!ñ2i“´KX<ï]ÉEy-uÕ}7‘-IUá ÐóOþbøCfœ¹=Mk*ƒ^þt*Øô•÷ìê3,½YÎuè9‹j"c£ Þ-v%”9Œq:Ì0ÓÆ‚Æ0Y^SÖ̉}ã÷Œ’Š/ÒüF³ÓžJ¨òî‡x,ÄrÐx×óýR•ôê ‹ùê8°¯¶áû„n]­›U$ãÁ§‹7­R>dÓ ºeê&æJöþß…œhæ“w4p’ÞŸ\svúÆIsNšÃ^"ðpz^îŒ!¶®S™üY‹¦Ú¬?L/ö<Ö\Ý`‡~lÇ*ý)ÃÑB…ð¸±ÍÑܨ™+IBápZâÈíO;“òøÍ––Uwê9Ûµ8Ç jGÀõØÜ)Ñü¼×uòÈÀ¾0ÎõðÏ‘’Á‘åÙÉ7È9ß´·JDÞ«M™ŒçZÄ8ñìo5ÄöægÅ3Ö|g àp_ÞÞ›»0ž|>KNxÜòŠ)/_Ê{„8üÌ8›zw3G¡j >©‰"þâ\}'[÷  ½¨TTýn"¾+Ó²ÍcÆãZgCS«+p%ÖØi«*‹_"ck’ýò2$a‹õ]é6T_RæåÝùR§Œ¯IŸ"Ù ë©ï±[Ö0°|˜ÃH…„#ÍÃÙ`d±;ÜÒíJ£ÁD¥Å®3eì!ŠËŽ6ôr…¼—­ ?ÎëÞ}“Z|Óú¶ô TÌ‘®cE¥.«™\>Ä£apôâÚÜüÁ÷Ó7¯P}[3¥«ÃzSŸ6øiéý’} ÕÂN¤S<7)øy¿ŸrXÐðÃ2£¦‰vyHF¬¾ÂU$ÛͤÅp¤RåÔ…Ó ËZž: ‚÷áÃßÚýß¡|™ð[å/©g¨U©õ÷Ãì8‡’·çJASvòâpŠž£(…šõôºÝ1Ébo™ÕjµìôOÇp.¿Js"@*>…T¹ µòϱŒD“¥ ¦}Q™¯A èT LEÚVÉ[žc|=¿pE‹þ„m’HvŽ’ÅšHN†Ì.zÍM=GÔJ»ÒŸ]Fw‘àœ*Õ+¶%F3kÍhÜç~¸‰2ì2+įô£ŽVYÚ]}úJ·­OD4/ ­N*Ηú8©ÔÉ ½G̼7¬5q˜¬Ié¼~E.Àpů¦ã‹îÁÜe¾­ f%!i¸P+ z{7ˆd2Q@nR„g&#®£—,õÂð“f³2³±Â ÜG'ÈêÜuµS=€$Á&ŸRõùeÖôîݹ¬ k~ÝO$o>\Ì™œh3W/ ¢ßüèô2}¸ïíÃk­Tí$ug‡ž êÐ9è¥v±AÛ7KBœkÈ®-©y xþÝ?NY5’•Ûä0²$XóÊuY×<’ZÍ"?ù½S!?¯ó$1ªÙé}h÷PnùìU²Ò6ÓvE1g ß7g’>áÙõõMÉyð“ÃÑN;÷ÏíÃÅôÔcúqÂért9R‘6 k`/™ð›ç3š7¯ä¯D¦í;â-mûðŠƒJ‹õ”’S®¤ãýK«Áöh6βl%žqï;Ü¥þ¸ò˜ÔÊûœ^ît%† Ý/nc«°1ÊŽ¥éåt}Ù)Y£÷"’tbŸÏª·ˆw‰Qù nÄÖÜ9^û¤ÝîlŒºYD¯8•dZíüãñ ùÚ}_UHÖ³UtÍG­-£\ÚS¾•"Ô\½&/tç\äÊ;Rž­ˆ8—LˆÀ8覼¹„q‹¾…¬2³ßô4Ë}3b/ïÞä ÷(¶Áô}T©ë —ã§ñ^t×™:)1³z×:ÖH¥ 7 i767xVK«˜x-;z8nDLžŸí¼hÍ a ?¤Èäñ™†eX%çFÖ8VˆäÇ– ‹,*•œ |±Ü:+ìÆÇù¢­ª”¦!´}çKá]všK|&Kñ³gŒ:,s›EÏ}ù-¬ï7} w.›JÅ×G'AL ÜtD­ŒÜHŒ_mo):ú’MѦƒ”:ï;CW†v“*æ{Ž“LG¬âj´WR£4™­å§¤ÎÊ;kw‡®ºÒfš_aN9jÁzrV—î´žœJNÂÇ—»³ÚÅ” Ǿ&=€Rßó]1~©zû$âx:\ïí@­àé—šùYŠÖОÒÖgc/¹ľño{«Šj ëm>ØUè*8]¯7%î¦g {LUŒv-8°í(bê” 7k7—xÝÎ_Ò¿5Çøpòñ(b§Âtýƒ‰òÛlQcr¤ž)Š8Í|ß§ãküDŸŒ’eÞ‹Î+½Ë‡Ê‹ø¨ÍƉ;ì£þ(!$P5ø¾#‡ú-²ÚÃb(㇗ê½ç̸!j2ÙH†åD)ø—´P$-†ÁÑt$TµG­Cç”M\ùó4UÍÄŒQËœ_è*wBuåVyªbÐÉÞ“s+Ù¶l-*u·›s½‘E9ÍÅ­°ÕøØÀÿ,@Ó¿3·žrcìèø¶ë>VÈ, QIÔ]QH«uTÖ¾ª07ÍÈJºˆ%eŠ ÀÑ‘cþ_ÐmVѦ‡ë¶Ë˜îv_q/gÓ`Hø¾TœÇ5@HRf† “P¨†JÎõ^ùïê´Ö&l›ªm=0sÉÞ({Àa~7ê¬K|ÚÓ Ù“·¸ó‡ûš§áøJïNxE¡±µ0jØý¢ƒKYñŽo f"ÙSXEŽBŽ¢7üÄ[˹ÅÝç aþòýç1pjL’å°²UIöØEÄ]” LZO8t @Ú5jV¸ÑUG|¢ktyAn쥺‰* ŽF8¨¼@^'uì:-<( ëÿSX/άi6ÁR¸÷oUo$t¿ZÎ+cU¹L6âš…ʤÂ/ÜùÆ cšÊ§aŸ¿–¥R¦bÛVdáÛOÜN^Ps Ž8|¿“a™RÝŽ#±J8ZÆÂ"®´A'ÚSšž±i‘ðÊ-…g‚Œ#¤Õ$ÍZÙ/ø9öô}p>›ºâ'b„ ÂÞŠ*kð…µ&.lz«è1_1hw(ª©†­·?ø úz!'½Ú|YR” ˪Eº¨“Z—»ˆ¦.Çj²™ AC’ãh©¡"­È¯;ôÎU ±Ò.²Ü‘ns]!\H›×¶+„)p!K €–9pc®|¨âpìçHÒƒ¨7 Oj7 .ÇhBoÚêß­øY…‘¯åY„ìªÓys§Ž­ËÃ÷Û§†NÁ禎ÌTíèŽzb¤®ú²8ºñ¢ yò90Ë÷Ëè,+˜ã(¤pT½G´†7ŸLWK&ôî HOÈi*­²ž ÇpljÜxÝX° ´gƒ ÚN‰²*Ynúª‚-Þüª0½/û±£]ÅK뇿–äÃÒS4Øga×׌P×Ñ;ì(0©gaËÝ¿­í ;jü4ùlõ@â8A "ЯJbM?žåðMˆ×»P.#¯ÐΕ³+0 Ç8[Ș‚¥ê IW…6@Ô¿–<—TDô؈rk"9Éë3þ´ÃA_nÉx'Y÷‘³Ñ³¾æÐ2–­ÐÁ1k$¸TJº×+3¸þ0 ´ìsrïã¬V2‚8¹Nfáì|®ù´ÕíÙÌwwâÉsí÷y1¯?”%K,£'q  2"úÕŽJí(ª³ÚIµ¬òFfjY{òelâ–É[ÂLêÅCsE8¸qPqÿ(GeëT |¢%–³¾Êç=üh¤ù¢‡¸Þ}ü'Ðø`w9Co²X{Áü¦ÇJ —Cªµ¶)’Ø=Â-”:ÐÞ-”¾ûè¡Zþ·}Ô©{L,ÌÛIoŸÂecj5¢ÜUfHµùø £ ¬i ¦9T¼­a/«Á-Hj/ðEpsö*t4[ÊíÏ&êØÐ-?FxǪ‚w!¨(˜La–FD@²%]¹ž Ëqiëg"‘.¿ÜlÔˆú4¥Uo(Ò´H§{%RÜäö h+ m/aàNþñ\®9ý?o{2ò&ÇY¡~laºyÙ1†ÈS½Y×;å×p‰Î)[6ñÀÖaYzo¿…ÁSö$c ¶VKÇU[ш˥˜†²“(Ú$R•~0nàŒÙB­oæir1ëCÛØÓ{JÝ M‰G W²š:}5³ôŸ€7ÊèwJO›ýEÎ0šCBã·Ü6¶÷j{Q¨pà8ãä™nà'ÞËÊTµôÞLI˜F;³à‘œGx¸”ÿD75R uø‚YýQoGÁfÇf>¢Þî3]±£j_àÄ•eª ¾—}¶°}8ÜAæÛ•—˜(mÀ΃\æDYUJ ßYòè¦>-·a–ÎMÕ^‚ë9m]pi3в : õOríã½Â9>ÎÙNÅ,%§UµN%–p/Êh¶MÅTÚÈ\ý™G‡»ò¤yfÏr惵“O¥Ý†ó[Vjð+ÊÞuí,žØþÿ–¹A¬®±Îâ0Ž6öÜ3Ìó-:RôöVxOòÁF%?¨ãz†è/g_µey~ö®kÂÀ³‰ÍµÅ™šóå÷f"zÞÿ9Såÿ©çÕâ«Ðª`ŠRO™´/z A–ûAy§Êo†”ßO]Ä‹µ9F1Ôqg¯GÝ:jñá,uÙGôÁ0º qtÜW{Ira#óOéÇdþbŽ5KC¥õKàòÇR;ðÛ6ÊÖÛ€cñOÃýKipmEæÃâŸNø”?¥_›D½ ÿ¢`fL¬óÂÃÙÎíÁ'Kq€_êˆÃì廡}æ%”'„PÔ¥ΖŒ3 ?à~dñh8Rämû*ŸKµ,oâREû»;·Ï$þjC‚ù†=Fƒ­“3:g&ºÂÄOÏJR4Sê(ò \Ášàà’s€É=ä¹yâmVˆ&Gþ Fжµ £u it¨Þž%.Öã;&âðOþl?î×,]¥Uñ"§¢Ø«"s(?—‹P×_ónx”Ë¡¨ãBB‹‰;šfI9¬q3¢¡Ä%)ž•Ö‡žõK¶óڂ茨ÃNœÜ"ñºöXŒÓÅM¯ZxsPÚj%·“òÓÒ)ö (ÓJ©«ïòªä¸æ*BœÀ÷Ž' ¾¶:¼O]tZlÅ>mêÒzl×x2臓[¸sjú76ä´1=m~´d + mü|„c .Ð ¯?f”»Œð]ù#ž '²» Ú|0ðÚüŠûô\žJ°ªäX°ƒQö]9Šuõ/ÃÖ¢\Ü.¡úÍqàë &%•«^ö\TËq½‡Ì5É»™. c측D†ŠÚÛm·PvàÚB¼eö¶q|bqãˆÂÖt} Ƕ¹‚ͨž+˜pÉj†Ó¤áú 1óÔ£j² 9šnU¶ƒäUj‘äúŸ¸<*Ö ãŽºí,ͬ€Š¡Ì^d/¼ÜÇ£U:Öâ û%Cî éMíMØÈe&ôpÈ;³SmmØÈà!·©¨,#£o á[û¾à¨—?G7ð‡;Æio!šr…ÇA\Q]:à+­„g¡àÙDŒ ²€Ç&¼.Rx,åçœx;ø€Ñ¹äO­dá@fbtÖ…`ÞÊ!”×wNÇk5fŸ¬&” q)ðÓU[`ZÇyž1Ê· êœ5œ¹¶£à/i#Ęa|(Í~WHeiBœ>L‰”N±P8TãÂîÄ×7âÛ¹’‡ìä'Ÿ> Žïí†ä ¸…Œü]Ûès¡t×Vï]^ _%À¿§öžøÒ4±³µÔUÛÛE=‚õkÆ'(Š} Œ›’VïôªÈþ!‰HP‰õ-Kã`Eà¾a?ÿá="; $x¢ ˜çjx:˜ç¯ÆB¬œ³3ÖÓšÔà‹+ÚuhiQ–ZþµÒWÏ=ù¤äQD³ÙÔªLñ= 9Ì•©ÌôLñ= ¡‚=eÍK)â@‹?ÆÁó˜xá ‚Uo Kù L/†Ô ·bç,~á¼SUAj ¬+= ç¾ë箩£˜%íëÖÊ1oë±Lp·êOx=òF..BŸü>èM–:¦êRnÿ`¿‚[.ÙËBg‹olåZ‰:zN^8ñSI·wVc4=åt) `CiL6J<ÿýZDÍ™5Ñ<‘ú4¼EzEP"aO:ú¹!§Ä|–µäf”*åƒb¡TO*«ÄÏ|n‹wõ/ãŸW˜âûŸ<†«¬! W "n8uˆ^5r½G¾l6„uOÎd¬3E9?Q™»ÍpD=I}W[ØG71„Í ìÙô¥_²n’+‹ÝÛÈ.À¸Ì,Ì#SXkQ´y¶‚“Ë;LA´g#Òñ8Õº¨ªE€¥f Ñ?%½f]I”‹»t,x>ÚlQ‡Ã+}]ÚαWpa cªVÞä°¶õTD7A~_îÚc"N^D¸<°W¿TrXYþÒåµ(¾ü¤pÈR@ šà ÍBãÑé Q7Ën ‘»Íqv¸z7*—gœÀ“n÷äç…ñƵA8zp(­‚©XÃM¾Bo±*ª;¢Éu5Ú…&MÌ gD/}geÑn¾¯OB¨]Ó â„‘gÓØ‚mñÓ~f–i»4=2P’Åù)àߪã·–Fö(5ȺœØ6? Ç)äZ…ß ŸÁLq‚ ±õœ3ØÙ‡Ëð“cê•ë°1NÅ©·×²Tñxátø&›+åó@£gOÀ=uP{pÀå4rD+?ÝMEC}¼ZÕmi ˜ÙÜÛªâ÷;Tº]–^á—îÈ‚?äx?µ¤i2sÇ'(­?x”l ‹}7Þ¯íW ¢©ß’@¶Ú"®?›!ýsÔ¤têëþjÈ+ê)ˆçÆêP—¶-¾ÎÚRx÷'‚N[©êD+2Œ;à<ˆQ©Ç*''n¬,{c’éé‹Bá,Ý™‘ä0™ÅÚ_¶]OÓËgÿ¯F¡Ý$=ñ1ˆrz’q»w&Àù[uz81¿òWÊ7Þ ;MóɃБð•6[+* bsÓ QPÇ:øÙÄR Rgç4e;€П;[§˜JXŒö]Éë„Áɪ ¼—wØ’;20࢖>t>QÍîÞ3÷ݱ ÿiºÈh*+…¸–aY›€[–„ ;m¥n#âe¼ ‘XÓ«Æ›ÖÇkºò%ÙÏ BÁ£z^Å#ý€æ ÕB2+B -wöFþ4Ûš×™ßÁÅÃQåB)M$^˜˜›Ëîí1ÅçÈ­Õ.R¿o1݇K0°¡d„î2ë°ÊU–P þi”êƒWì®Û1 ê25¤!á…Gýªdž<ÉŠ ÄT³ÉQÿïþdÚ¡MS’”«}xò¸ˆ¶44oASá–yx?>À[{ÂÕÙ÷1_Að3ýDãά•yÜ"~ ùþ-!zÈ×°̰é®…*Ô/®ð|Õʬ¬2O<ã0“Ÿôµ¶wÚs÷¦ø¡‡Òš)khZORóšFŠ“Wˆp·=ðør(ŸŠÄ‚´‘< æ˜É‚Ãu£Œ„%¨º…^|Óï_^X²ëE™×mïW¦ òNK1f/€„°‡ÑƤ ú}èÓû¾³Þ2Íâ7¤øX jØ ß0k؇cƒb;Nî¿îÚ+ÖÅ´P¥ô17u|.ÇÛ6bt‹_‹"ì•àö[»òFB*} n‰SÊf ‰GLÖî7ë{½ Ÿ¥8ª=- vŒ0•Xv_§DB‚È#ÿ£éV@w€S£ƒˆeQÔømIÁVcn¥£½%†t&"ô÷gF­Ð/àÜÍT½`ê´-þ%-¾É5˜ÖâòôpJ°ÿ•oÚ\*ˆ÷¤îÉ5ú‘< EjШö6Œöå­|á» ¿ ´S7ë4#°dšc€í} @v‡0Ózš˜²3˜Rª(h ¼†u¯=ÕLÃÍéç/¨t¾‚e^QÚñ?Öe½Üx‘ü¡ ¡Ç=K #/•ÐÝÈ™ƒ¡˜D¥ñV{ˆºc)µzhSCö{æ&>ú'h¥•í;ÇÇH‡âý9¯¡4&P÷©PoUPXtе„ÅÜÒžÌËqHZì{ÃJ³S®N;' ËëjœŸÝçÝVYÆ¿!Ú>•Y\§tB‚}ðzŪ{Ô/ó‡X£Ã\_" °*›îâ  ‰Á‹× ~hnÜì€÷ýÑògd$þ^«(q‚aýè¡&b½À,š WÈó|K`o¢¯¸À™>,Ñ©廸9 ¸ëˆAþ²°fõeä—ÞÌÃ}ýÂX©®èÂÜAü’®µwWé.ûþ6àæ¯h‡g•xÃÇÿP‹2Ìšcp”j»ç’pƒ0ÑÃp,ú+ô¥ßuÏš½‚Vc3°æ7¹“T&ûv™ˆQ!Ø:M¸¤:dŠEœƒÖ#ïßZ`ñÝX^ÿyÉ‹ZËè‰Ô™;¦ü½d1€"Ã1 µÎC$•MxðjÊ¡úLŒA ÝAÜNâ̧,£oÌ6Œ£#¡~Lû  ,¢?…ΊÎHýKgð¥Äà Þå.S'àŸK*í­Š0œTÛÏ㥛›ý1t¾×…föd)µ°ôÝ«÷+«‚`ëYE¿Ù‡¹k€ß`|dtSD¢}Ëôë——º]·c] “h3õ Ðô¹ÿÂsÀZØwE×›¤6Y ›P˜ƒ n¯|ç{T’¥BíMï&+¸}Ú«¦Ô÷ˆt ¦– ™4g žÜG.ù)X†˜©ÍCäðqWw0ÙÑŠÄ«9$Ùë¹¶jL­¾ÞPCíö'̈Æí“NÌ«»šÃMûe­×$ºgÚ®ëÐFyg3ÓDc]™q%{+¢}D§×䜚JA 0¯û‰±[ñœn¶¯íiÖ©•<cHFä®XAØ‹øÆDaÎç:3* |‰AKC€ÐÏ­aÇ.hk4°êfàÈ7 ™9›fø§òKá­Ik ŽÐG4RzZŒydòVŒ›éqeÐY@€ßÿ|åÿŒ& ¯îã3â‚…‡&æuÂKL1­+[…[sÕSç}3 䨋ï«Bk”ê3üšØú¶clÔ¿ü-½R¼[ª8Àr«wšuT£'êE/œv$¼-ÍmâÔ>·˜Þ5y ÿf¾Hr…#ˆ $á Õ‡‰ìã vˆIGáæ3K½y´wI€è¡组’‰€_îÐÚMK€HñÞhQ~óIcúÈøÅu.€¶G+¼+€6^šfâŽÈiެPÏßm8'¯ëšECB É!F ÿH;ãsÊÖV@û:‹~ZÁ,êíÕî$OÄ,Î…þM4û!¾óꛕ›m±bO¬¤` R§øB»HíRšF Îý®jµ³ÉѽÅ0 Š–$ðßñäE)Ü×òÛô¾@ލì!ÔM·(·m¦:ö.·øÄ1D˜(ufXo[K‰yž8®#øÖa0°k‹Þyº k‡¼¼Ûá¼XbÒŒ×BÃøÌb3 ù3ÐsI„Ú’v5€ „¡Â5 Ñ–-É¢¢5âD?^§-©öE¾2@°:´ÙÙ\;WÊþ:pá+*­´&»ÔM\± YÚV<¢&`í}7`šÏužßŒH`ûãÈ’9O£ ÀNâ1ëý„Ï  Ǥ׿…RÙ'ÛÙ!â2KººkzÖ›BqÆoOÇñ]Õ.ÎëvÄÉz…ÍY£ŽÞâ÷ƒT°·U"uSûºàëðÖ%ê4·%Úº2ÊœñÔ¯© aXŠñL¹{ÄÜÁá ¼¤ s«d?A’¦M2 î ã¥mX¬} â„N´‰™î” ðöƒ’V~}ç¤L.ŽÍ°•xY…ï;—ú+XZ>µ@òè)DÖïUŠ\Ì±Ô ÞÑÌëÖe£ Ë‚y8Þ€Ï ¡[°á;ŒÁ€™Cz[%ö‰Ææ°C*-¸Láëä­Z>ãBIä|ÚY4$|ž?2QÅšî´‹çs¦×uær?;*¥[$9Ï„r‘S²%P½‘òrßÓê¡3n”È®äÞªÇr¿ÿ¾5½ç®*¯Ã:qÞÇ+1yäÎ ¿Àƒ7$Q§k25{”Íyu­òYwÑDÈW‡@ø -1|£ÃÐñVñ‘øŠ‹Ïât—b ðÒ[£ Á•õ¬ ¤xüs§Í*“´‚‘cXè°¬ì%å—^! ‰^ÿ-)AžÃ»‚„êÊP'iglú€™¡ѪPµ¤R<ºõþî¶ÅÊÝþ#=#^†g×ÀȲ»îyoxôš 1Ô9ŸòÌ-Y°_’7€çu©ì„¦Š-vãeæ‡S –üVMÑsa=èñæºü#Ùd-5nvH`…X “~@D¤a¼@ÜÈKÖù–ì4=Æó÷Èþ“By5SµÃ5Îöp„¹ñ·ýÇ[h.õGɆ˼àÞ`éZó†ÏJGYÅÂţZ,¬„WÕ¶œˆé[Ìô ›-³õHÃí:T›àå°½³€"òï)‡ìĦêF»úäÖ³0Ãú}¶•÷¥,.›¡¹zj/¶«¤¸ì^ÒÀ!ÖoÖäz@å«9ÚÖM¨]1q×9‹ÿ9~7H2ƒ…DSNx%Jé·‘Cè5Uÿ«48ÕõlÁ·+­ƒ-?ô–u¿ó›‰Òç9ð{/ÓkþäkŽ"ëo#q ¨;B–‘0nÖØeO¨Æ¬ª3VØ®õº½_nb1æJw,U¦ëÙ﹇Ñ$æ>²fròÁÀ ð•È)ºzâì||&þîõǯmË„okm¿?z X_c– 'ËkU°iT²–äXApj±ÖU¥îKwJ3k~벯/•#£©džW½aêÐýÁl­ZÁÀËàÚKô߃§ôx¦J¹°äI×V7èÈ6cF惚ãtú:,ÏD7óôÂ6IèòT™Uiq÷! &zºóè±Ò ÙÓXº)k;¡•“’«Š(ñÌËJ¦Ô}î[ù%Fü¬ÿ’C¸”'$1²x,¬¼™Ù¾¼L¤<†MÈL€½Àq+¥$†o¡ÙŒp›ù §† ÉšÈDD×]ùœÞ´°œ 5]Êhá;c ¯«Ë¶»Qú@l’O@ú@ãým Æsß/i^ŽÂ}Q¶ð4êécE¯”wŒkÞU;*•x’|HKQ´VkŠLR17ÒV6XüáüqÆUÓ1ž=®ˆk’ßE(?\Ãÿ–•¹GÐÓí4V_$QŸõçvN<_#üo1<ö†N ÿœ“~eJÒOeP»—/“Ä?¹9š‚ÕŠC¹&ôTó„G‘à§v'`üzјJøOµQ®ž|¶„f¯šØ/«qY &Z¥ŒbT¬°>˜ï©.òîÄ+G3±½ŸÇgßä]Ntþ1³ê5ˆtmZnÖ‡N|ˆâä#¿xŸÎ•*›ôk«Wd âG€Ç}‡×"%K:pØH» &¢èÛrPjAöÉÙô²'ůq^åÇÁÊP$ƒÞô‰êà<ÝP)$`Ç5.©µ´¥Ê³2xzN媀Ù[±?RgñHkñ¤—@Æ lˆ^<[›(SLþ™ùÆVËÃP þ¢ÃÀhß‹“$8W̶Õ "ÁÍ*ÂV:'ò™i¼Î¹‹gÿ0A¥×‹dë4Äҳ갼¼ÆÃ¤ãùøî ÄZ“L—÷ž>Õ¹ˆ’…õ5{Zìà„èl•¶ŒÔMtz3@(ëmlÂ-0hÅ ¤˜†–ùEvã¿cã"sãa7äKVC0­‚µ÷úØiAß³qmE˜É³Ã¹.9õƒÒ…w”i’Rš0%ñׄÆèÒ™—%"ךÇ.Üè-ùRu N÷»Ho -"Å|JóÆ,{ÒG¤õŠUvCq#Z[Ä:Kõò—~û+)2F»šU´å,LÃ_LSb9[iµl¸âO# tîXi¯ø²0í®[¬É‚§·({á ,wʷܹ†F>ÃÏGZtkª÷FüW¿§V£ïW!©åšô8Á|òqz¢o;UnìpêY[â\¬YZÓ€½é5pÎt DÎ×Dë¡€åLêv ó46¾ð<ûãôP‚?Sp$ãš©®S*Ë-‡ùK‰8YAW?á°–ôD3@ž¼;z+¨zn𙫄O&ø7ίÕ·_àƒêG­[ËÎj޴޽܃UC6û›#ý¾>˜èÓˆÚ€6²êD^æ[Ò,ê%B8vÇm0÷tC¡­K†@6“'Ü· EÉNb\¤€åÑ·oò“÷ûas gÞÁ„¿Ë,ìŠGGn@S;êÊ!<:‘bÀ/"žé­–Òçü!“ ¢%–~+ª5¯‡KÜJ½Éß’òÊ,ÓŒV&DWÕyÌ¢ÂÙ¦žr´kå±—‰“JRa•Ît&9ÌŽ%@1õV\ª–¯ÂøchV!J†¥½Ã´ûS‘y}Zÿ'“ÑÁ4nTÇîapÈ,_‚lXäi×®rôrTüŠÑÛÿ+m&Sô6c¯)â…‚ö²#ÀÅwBŽ.2 ÖâØì›(ô5ŠqY õ×_†‹•¦mÍé9»P+Ð)ŽfÌ3ƒ-­/q3ì|¼ùêãM‘ýëKÈÉŠçÈ ó³Ø x€•ïýqJ”|*m»ºn»·Wma+®ïºƒè_ ôµýŒ¡&Î.:‡^OÉMñœ.ð¾+EÕòU+Ûxº¨Pk£aÝZÄ DHðÛ³ À®ûâJÜÃNËÆÍRß@ZBRøU~TsH;…AæcàºèÇm•Ê‹m€Fäf^ç&Ûðíb9\½ç#¬üðë§Ó–—ïsŠo!ÏYEñÊ\>hÂÍw=iJ{Ÿã4pq›}€^¸:ÉóF¨1gF\ŠÝöëøa“.à pÒoy±‘îã6Ø5Ãož‹’kÁVÒ6èecnEž°mÈ©®kô3Q¯‹/7ðeTˆÍ€ ¿Ä8—±ŠeŸh–±_»€0?ä$Ú?IÏÜå‚I@ ÉDYj+¿;­‚h\|À\»~†ï²‹lMFÝÊ.TÅLm„à±Tó»;|þ§© k¼äÆ‘W«½Õ/ÅúÏ #¥9SÃQ‘ƒyóÿ/;ð‰Ï‚‹Öç?]Áxî4Å\³z„ÉŒ/$¦K4—•ø'`Å8*îÅv§×Wï.úŽ­!¸îD¸züYêþk,ª=Í,×7Bï…U^I˜GïK}3÷*›žsœ²”¡`Aﮘ÷&ª`ÑÇ‚¢Ó§ù%´®2û¦: i#H÷¼¦ß?À¿sI0¾QÃ_àÞŸ6æÆ¯×pû5¶ŠüQ9iÙ “A1ûš `³Qã†YãÖíQŒÑÙ¿´ ¬žwÍï”åÃÏ®oKÎ(AÇï~ 6J[“#5Άîâ #z© pN¶·Dw¼£¸¾¿Œåžèaƒ/ •æƒáåÀUGð ½4xWhëêÛ‘ÆóÒRŸøq“œÇÁ ¯XüÉøùSˆpÃUßV½”µÁò9äC$Æuk3˜›H,E§·vn•á/NˆS¤0‡~‰*9,(Åg»Ô+ââÿ§òux„-{]·™À€¶å[SÑ–û,Lý{öAt/üIF[+b؇z§çÙØ'Æm¹7´÷^A _cŸwFxb_$Î%NW”s/R¦Îïfצ:MtÚH™.G”´SsLœ<´ˆßº‚\ LعršÕrÞKK~UvD ‚ýò®·¿˜Ç@Æ÷»yàØ‘½™&ÚM­4lx[8ñs#v ÅZs踷QC€7ïÙP]ÏàX‡OÞZ¥Þß{ x÷? ¹dÛ/zU¹|zßAÜ•Ê)\ò…‹ï²”õ•wù‚¼¥¨Ö½CŒÈéZÌFér zø¦•/€áÖWi(?ÑŒ*Ú$/3Ò~ƒ¯üÌRæVuîÒP‚—â“ÚÜR7µ¿­ e’’§ØŸˆ£vQÞØ1.3ëO9îº!q-Ž"ðj¬RŽ>ÈëàÙž¥räêVj¾OøÿS6/£¥/Å™r—ªi¥ÄoËò°·]'ùçÌ|Üʕ果+›DDè-=ä€~˜Ñ¥€5MM ‰=û~äÙ0™ ³¸†¢ð®e²øÅû›[ziˆnsçˆ7ƒû ©3µ…=ßßìègýòMù|÷-•Çì—Ò/®t©( ÚÐI|¦Ð™ú5 hF̽{Žz³­Ee‹‹=ªÖÅßpJQßo-µ÷ü!‰€¶[´F™VŸñÔ5aäç!f šß ‚wPßµ7éóË¢ž-JCUyŸÏ¨t¤w-·¯c§\h& ¼Á²õœDxEs_•W©v5µkŠì(Å M‘gcŒÇ‚ ½&êE‹mYyäÞçÛÓA t-í•Ì–<¢Öÿ£‹òö^w횎΋íÍÖGcäŠhÀ¿@•*ÙÁBk?§YÐ?1|„þîÓ©²ÓA=¯-fLvÿcî/ôÓf¢á*ä;4›£Žñu%;X/E~ãàô®i ÇQøéø‰ì¡f‰€g"0÷VL(É‹ã†0†D/ iùŒ¥F ú•š“aäO9ý_•Á‹àڿܸ'ãNƒex3ìL¯'éF Æ×Þ-.æÑil®åS ՚ÎÝÖ|)å>!I?ùßOÖ‡£æÓä©$º,D!Ò¸zÜǡІ¥ Iè5ž Îëß¿™~yˆµIPѸLPJø³!ÑUú%€Ôu6ÕìÙƒU•°ŒTPJ5ÜÓ²5J.;)ÿ•†½ÞÐ軦ÀÛ¾ï½Jº"–ùIKDǯàc¡LÈIŽRÚ$—ëù@Þ_j£7ˆœš¼>ÞÄÍc$îlhV¼ùŰ ÁP£¼7íu¾ó‚{í ‡p\.ã™»Á¢ˆ‹°ë[æÎ NÇ_D·~ 7Øé"\¥ 7sEIU7õà—aþHŒgðc® h]Jµÿ}”b¨pa>$^zGœê0»i:®$¯vë{ËîrË·Á"]6jf-ÿ_>ž\jñØSké}ð-Ë’¶¾\ ,Dá¥ì íIšm¼ÜdªÆVŠ0EanG#®õ^d/ßXBúÿIïÇö&%f.csá¡2ná#$FÜ>Š{ç^Qü²“B¦çeB·c+(|ø(ÐÈ—¾Ìy$€Á×··åßiß ÚßÚc\™Bð®M£¬¶ñïè>’ÞN»ŒVÜkädbÉ|¶;zf ±áiAfƒ»uÝjýdŸ—Œ¾ L¡9Ùd§þ˜çènÃôèFÃÚç6ôÃHÓž5ɘ¹nj6õµÝžÊÌÊ’yñBQ(µU„¢÷&Ò€•4¹Ó×Âú˜@Иþ~TœæŽª[+!Ø~×<-z: R“¥ßO€LIˆ=ö aíÒ DoýúÀ‰[=N¥”·9kK:óxUDªxcØ܉L·QtHÇIækVù‘NSŽïºõoà‡ÍÚªYȦl(-ö2W0¸I¨~ ‰—› ³‰8nǃKŒ=!"$×léF¦Þ+,$j’˹vsjXm¯á³Ö-¨k~ÒÉ-…/¢Ú)åzá5¹:qŽ hZÊ‘sTaL±“zÙíè§ 0ϵ®¼¥íÁXÏcpJÊ‚u5lH7¹ÊSô¿âqÍEù2åö_»ÅcQ!µ£g©yáQ_¸ýrÙ®&ËÞ ÷œ$JánJ¡6 ‡ ÁQ‘]À„JâÍWBoÉé í“­6ùA.îÜ|¾nß~çßÕ,à¯O.TpQQ´ÔÜsJãjfÔK«•1¸âª(¨ðBƒúñ9NVÿÀ›ÃF"LŠYŸ’ Õ'„>ÅÁßL™°Q0P†Š›HêhíÜiGËԮƞ5º_,ég©¦E°dšR:è»_3ËÂpÐV ×j§º8,ÑI¾a™GÇ_ÔŽµPë# ç¨}P®Rè(fìtù ôwø¬Ð7g$· êxi+>>ûìwh°+‰Î8\8 I@„JùWPT©¯~ç›7‹âÔI/ð-ïÎ)=ù¼ cúßÀÏ6ØdÁ˜5M`É¡„ˆ[IÐÕ% Fv0Bï”f£Ìm]wñ]ÞÔt>[fð~/ k4Ýt°:½ÙtoG¬tìiO$#ªÕ¬¤Ù,ÈÑJÕ¿¾~íçÂÿ,©b)n›¼·²Géß 4—µ ûYq(g <7Ó>‹>LÅ“ŸÉDðÚŸHeñœöÛ¼P1_%¼Üž.É[ÅÃ,8sÿ½áÄëÛ(ÅØ²Y8]àò}Ìîø lÏH?Ì EfOt»o:“F{øÎ – ¡àC+Pž(Íq¾óÌþ¶ ìœ<‹L}ÍÁC`À&e¦yA¯tEd/Q(‹[¾v˵Mοàü+´ùÜêÕ7C³UÛ· \Hi° x=V«%*Ö$+¬qp ÜÊ—ˆ²Ÿë1$^—º ¿agW äÛD«#ó€M »IF…ÎÂ|HAÄVÅÑKw‡8[¨÷y“U©¼!ö±OzOÈøRvÿ¾¬­¡RÇF>S¥?‡ˆ “RÀŸÂ¡0ªõ¦²‹ùø:·/‘ûº¬™7wxmokBýUf·ÕÀ¼ÀÝì-Ž©Ö_޵+H]ZÖ«*Fÿ|¹U#×’FÏ4WhGìÆDÀ¨_=7±ùz$oã°fЦ÷¶ºc…NêÄÈ*’ÃôS©©ßtµ™k–Ò¡:~ùh-iÔÒAº±=iÎ&7â"»°ão­±e¾ê×k2;Ut¸PCîø9>¤¿§€oÒ?®]&ËQÚw£u`ø*ãÒôØÄ— à’ÐåhˆÕ%ÔUcÐËM³Sà–W ¹<èûîw¾·éÛÞéó †Vȵ6øäO‰ 3CÞøÐÆÏ '5"Äâí:±äÉŽ w<™‰ák­nô×¶Ÿ›žq’Ù6àWî°hÒyyC9t§ŸAˆ™Ó‚+TYaIÞ÷OÖS'xì´¬“íšj;tl|剖ƒ¿‡KoW}*ßG¸½BëšQÇ%iÄ%‹>à{ÒÏD1ñÈ5Âáèh‡áp>ª3nTg<:>´ñ¶‡D,mJëô9e¸ÿÜOïÕ«Ó–î¨þ˜X_<¤W˜¨tìM=}+³LÖ(˜öÖò~‡²Òè»xºRJTsà¢À\_E5rpf“”œX)9 '4ðñ£,vN ¼¸}àå¸þN•Ž–Qèp<еƒ&þI§:ÆE²ÞIæü “™4IJì1¨qH4¨`Ra˜¶®§¢ð‰^©ù»ë1°ôöE,#@W·2;˜ÅÂí9Ÿ¢Cl aB›–Ö }L;yÌdlŽ<8ÃîAE#o•Z`×=k­½+åëˆþ¹¸‰ çýÞ¹öŸsNÜ3ñkܹû„Hil©][µêk,.º¥)cÈEJ GP‚œ¼—xd¶¡MÝ£(à†€;Àoî¾2Ø—šƒv2[w1™²›±\ß®[:}G"·äI|ž‘µô‡úÿbrM†G‡Aæ¢ÿaV«’«h*·QÝÙ`éŠ,”ÅŸVpŸ‚ŽßUÔÇ¥n2Ÿ0…¨÷ËÂvY)¾‡ß°‡°¤Ð‚YO¹Id $Xoñȵí¯ľ"ï…tªÝÅDÇÇmz–²—œÏzä$•R³Š/§o*žN¥^Ï~{JÈw¶þ :-G€ÊÅAÉAÚ1e A«½¤/£jtOU±·³üqº‘wxÌêA·jVKu;©;õÍ̘#™ä– ‡ ´Š[ªûǬ'fùr}]·þ´G˜o¦n¤&d>*A'h°¾‘;û¿¼Èt’ö×rô‚:Ë#óxÎhüÝCš#”{ø®ÏØŠôâ…&’ ƒ<ÚÚ?#H€áÏ]Ë 38 °ºÎM<ón/RXç²w\šÂ Á‹“#ÑÈ3.låõÇÏÕ …I‹ÐT0™=ØáŠÇRƸƒ°8jޤ¦ãÌ(äÐtMŽ«A `¹;‚¶M8~èJ'Þô]UL3ޱ#@é¶¶/®HFûâ=æïðêg1|‡Cñq­jŒÁ jÏGµq.`{jn¿>ÇgõmC,¾5.gûM—m…!D(gš®N\X C>Ô¦ôÝ´öjù#¸K„6½ëä:§ÿ „·Fœ{ó–àê•Óå#´vª¬h ?à‹ß¤ëÜüº7:Vj Ï4Ô#{j†úéˆÝùÕi!ÏïÏ‹Ì8bƒb Û̂U?ºAXRY°IO¡ÿÒÉ,“Ä8 ˆZU ôè)ÎnÿÇ/oæKfæJ.;‚=Mü½<é+ŽÂöW `É.О[‹¦a‹Ú6ñK±±æÜξPæ –`7zgÙ;ךÆ%i?®'HJÑ>¢kOçÑR L/w0SphÅÃI„µ ‹×ø6¹W~¦[m&Ekä3O0*&Ø‘ã b‹Ê20{1 xÓüÒ(=‡@½ÉU´Þa¡Ðš®0ë0LsôYçUW AŒ~¤Jºï“‚Á‚Ìjâ`2…Q×"ÿKÒ’à’÷‘§w°ö´§ñ[¯a»«ÞýƒÉ"1Ü~JI3ÜçµÑÿ’¶×”bع\è0 ãd°Ù/|@y~»Æ/˜GÇ–wS…ãCý°*&ÿm^‹‰÷~-èש3YS¸›§Î\-ÑM0ðï)\ýÆä°9(=#ò5$Ø`¹xQ祚ˆc•Ÿuu~oŸ{¸Åb–u"\áùT?>í “.© opžU†Ï©eÅÍÞ3á•–Û|1FC?°"U”˜ó:÷œÏ}FØ êæ†}ÕrïÁ+Fœ›àžÌå@P¦3“OºûÕäò4‚QX*¦$æt:  ³sš0=‘š—–yvBöÍeÖuHÄ 2‘'EE&Ò :Öz4Ó!œµ9ÎË 0 ±:§|®x®Ë ¦$ÚEW%²pz‹'ûuA–Ý3£Ê ð‹°†yÆÒðløG#ÝüÈžTÖ¼.Šò- øc„}A½x´cY=ä# ÎÁ4k¦2|Ø—W‚Yh¶Ô ÜëU¼‚~ßy”Á,þÖ¤Áo_<ã‡G̉BÈÎEG” šÜé§Ò`‚$ª¬hNé}ÉVE0qª²=¬(ÑâêÒ¯ðh¿…ŸŽŽŒW£ ÊÑ37ˆd~%wÒéôÊ\!™´yðÓ‡1ïöøÝó¸oÔ6Ô$0käÑwòK(~£,Z`üºÖeZ & £ipܬIJjó!K®íŒÌ†èaĺoT_”MŸÑsj¢jÛ›ð[¿í1WÖ‰0èÍ„×P«/QqǪ`ÿÒ*é®ygÏuLP0t/©®œâ/ÔP‰õ2ÇiéÒ×Jl}­õJ»ŸŒçJ è¸oœç|©4Þ3@KÐ{ã͈ÿœ'ß@2UA!ö!K•±~‹) Óã¼ÔÜv¤ÑP·Ü µz>rå4½ð`ôé{l—­ÈFö£ÏÜ’º¨"üÙ‡¡œl¿´¾îÏ,豄éÙ§ ÒⳫ%çpŠ6ÃÆÎ…rDºî®×Ì„ î ñÇ£ºäwÄÜýͧaò0¬“ºÒ/V—XúꃶüylP8VáqÂâ’n½{Ë ‡He´=©v]¸6Á9†Äï'ƶgÓ[>«ç1Í2ÀP¢ &ð†7>LÊt’-9ˆ¸W§¸Ç 3ÙØÃn`áµÆ-ô¯¶_‘Ø*x#Ò¡rka=°`‘|³ÅtR-úÕ6zPɘK¼}Ïé~è®O`B¹tduÃ+~Ur#² á^gß¾+BQÞa÷2›ã°©Ò Àasÿ—ïœÄšj2LÿYôH× *ËëxÄÇA~e.FÛ`¼Pך‚GlÌÓÒˆ÷ßÝyNngÃ$[Ox9I6¬¨£½Ó0!Ÿ‘e•]•ÏÀC³ YlÛƒ~ĦŸØŒ ë è Nã F)ƒÑfx+¬+=ËñG 9oÂrx-ƒ¢ö—…†—_ó\•Z*ÝñJ +‘4HVÞ$á ›Ê…4$ªÊx¨YŠ0b ]]Êü&à‡¡!Ÿo±¤h¨³ÂÊnô(¿¨wo†=‰´2ÌÑ%÷ãp}w_­ 6^c°"ç‚OÍaD1ÐŒçæ¦`’îQóéJ½\Åë´+Ú¥-ÃL:Š—?¶¯¡ÈÃní••å¬:ËÕ€ÖÔ™'<Å OòÿQËø†ÒJ€ÜÐÇÆ›ç~< òM)Q(c%b¡ºÎœ³Ö“2ëI »”7¤Ëí§›À4 ÇïȸÀrÓœ.ê2Å–DëލÉÂÛ©\C%棒¦ú(¼ŠFµ}dT¬¾HUjô÷Aêg,]Èx[•ñçÍš¼ ¡ä¹Ñs(“§•ÿ¹G8+b5CeJM‡¼’%÷Ã ÆiJ+º¹Ö!І+–èh·ÎF­Òü/>Sh#¯4½ $Ù‘ü½—™;áyìæ@ö× âRGY¾5öwd©›w™ŽÆ,3¨¾´!ÍØ 2ÈQ‡D^³ˆ+Ú¥- †dÎÖ6µ¨c ¬3¨ñ¨«òj(±éŨ¿ µ5SM3w€ßr-6û>úÉô` 0Û§‹© ˜L6¨Ó¢P…âçÏ®æŒÿ§/µá à‡Œ½Og iîuÂÊÍ ¸|ÔØjé0¾{°Ðàü4Â¥SþC{®Ÿ*&݃Nmh íIZ‡SbÈ ãUÕk+],pï'V©’º½|”UYa¢ÃœZÿ•®‹ˆÛ+3-EQ!+ÒX½-lS¢ez4uás¯Ȩ“3y2Ù³_ùÍ[.xTЙ#Ë5tbì'Ú¥ ú«k 9f•ßÊWX¿¦MßBíþO‰Ex•Î%!ýWSnè˜Ü ð„‰ ew*ž$/Z ÊuÉÃUyxJŠ2VE[lˆÍ¸e.Ë*E}¹, ºîíPŽédß)³K ã}XÙ+j¡[]_Vp,ž¹uP%üÓÄ0Ìú4Ѽø‡ÆãïîŠ\™ìHËÌ4óáÜÆ‹¡Ñ1üøÕÂøûôeŠ`¥TÔÕà:&…Ñ,T#“4%™‚…S­E‰è°æß²ìf:£¶£²Á·2ÁŠ*0ÊÚè-Ó3z†2!k1uºY4žîä›%È—ÒœO(Ãu}5 0a-L2«^-É'%0ÉÞl5Œh7csaè6Û™­Æ†íâe.‹=vDa"ñ¸Âs¾¼B¥æ“LQâ©ý6ÇÊ¥ŸÅ¥ÒœûH³ u@™-\æT;q.…I‘¡•l&çG°ñ6ø#ÝèÝë·áG~ú²Ðð,Í m™rH¡ª—=(Mj£à îô?ž…œûH3Çä…ßG†aöôÁìt½cgˆ¨…—·ùt.ľ£ãqü†rtÒeXš÷¾¬ùtŽ~!·3»g(ôUï›¶qel9aG³;–ÿ?têÿÎO ý7c~\تª'¬XÈ,§² qg‚c1çåí¹¢|&ÆqeÈ‘g•àQNml·­ÙÊ鋞W¤{Ræè ­åŠO•JBKp|F,ƒõ´YÐå_EüMцÝÞN0]'C¾œA³7x[Wëìy ‡¶áÐ>ƆÍÃâáMcàzÈûß]8¢¼û®`I¾ ™3ùôû»Œª1¢Âë_ÛŽ ˜öF95•èÐÙ•š{óqoáàQ ™/3#·)n(J‡!—gÊ·¼]ЖÜ~NOËl±o‚u°‰6§ 6Ñ{–†:„#Ô·.gêCH9h!ObCå8®ý×°v°¶÷Θ©Ò¢3'QÚH¼È •جÇÖã¢ìi·$ü± ª¥‚rúdÖ%UqSÜ|ƒ…œÉŽÃ•×£dæ[3 ¨ÿ1ÇüÎ}û]wâµl’@9ò´Ô…œóéÔ'`õÝ´£¼›xÀÏÑ›uôumßâ×ÃÈĦj½¢4Ìx¦¬WxW †Æ;'’o  ¢Ën~Ýú6Gnrx¶w‰±~«o›8DeÜŽ¡0Ï·R¢cЧO!H¿ˆ¯†§Ì9þüêþ·Ê÷°e×ÏÄ7åWs¢òJqVÄHîb~ÎLØøSk‘´w3s¾¬£„#áwã½/n^1g>ï|EÔ0¾®«Ô >qÄÉGÏäÝeen£~š·õ˜+î½äÄá«^¸KV‚qkMg-Ë=BE–‹ ;bŠáZ5í®•' Ó×Ü<7>‰Á¹Nu‹¤…­_¹„ð~çtwR¨Iä‰YÀq÷­¤ÕÖJèÕ×’ùèÞlIùí)ïS<á‘dm~¡P “^Ãì›@’íÅ’ÐzUIí¢öC[|ÂzÁ ‹Ö]ê`Öx4êÔú!çDXp?—"É¿¬ˆcÒ»ó8ïXkN4%ƒñîIAJòÝ%»Òõó±àT¦x=â ANsf»³<ͨ¬?àSî‰ó.¨®QÙþ$-u+ìÞðùüÄ×+÷d7Œ†(˜³È&ƒ~î<tS%ñÙ‰Ó6PÅ¡¹õÄ| ™1YÊ5š»n«í{ÑOz±¶êyÒ%K¶Òùð‰¹dXD6ƒ)vPE¼KÝØ¥%l‡d”Ï킦儨ºœù­÷o\°²òo¤¤æIœE’쿽G6$*ŒdÖæ’RK>f<Ô}Acq9ò“X¿«8Tf¬¿½ ¦ŽhMA2å)ôÊn0«.§BÂâë*”‚ÇÄf®uŒû†§Ã5Å Ã.hüYså3Ür å®WøèØ{gò‘Ç—  °ˆC±IäÎ[,\ø,; |&™ŒšI<—c¿²ÆiU2@ÑZ¶Ví•’ªz©óR¦ðÍE?²Ú›Åå;5(Áp”ð`"ë}ÅÒÕdÝ75}×Zü©pFBÝ¡â>Gþ>¬žk]"¸ª Èl¶h™}›™F1FGìºãyÌ.Šƒoi~aLÙuVxð®têš|ùEd Bn·–p=/hã3h˜åÖpªG…’š.ËU=5oŠý{•è¯á”|c†„€ ‡ «)ž÷SmVûgŸ¥˜{¬" o7°‰ê‹Å^<К9ð©¸ëvNZ©Á¬ R1Ä@öNÃk¯Âÿó@‡¥¹DØ[°;?5xá`T‡2Šíœ~z¸ÛkX s)oòC±•‰<ÁБÙ`s ,Eu ÞUÞ9pªµÄ—Äg¥Úç ´•.ŠÝËV*ç9®/Ÿ,óÕÝ :îdô(òšð;”6e.åMh»Eÿ:7>\ÝÉ­pz˜šì† 2*¸ÂËæ6òR;E­÷ˆ½¾Wz×õ°‚­¤ä÷˜˜ƒÝàx<>‚FÒ‚“%y×\íBÞo¥Qº±¨àc{ãÔ‡¯(nÈ´"xÿ[س* ROð Â,‡5¿qEØ/g!çwM.«L(¼àcJÍWÁIy­³iƒò %ã }â¬ÁFC-‹ÞþùPDg`MŸ2÷åacðž›àqþü<Ûô¯‹#œâ;_iã{5ÕÚúv·…v°1ã8l`™@|€BjNùÎyÏ$ÁïÛœ…)¤LŠó[L¡ï½Ž¢ÒØiàÓÚD`¶¼F^¨Iu¸2<¼›A®lwNú§"C…ý ÊQ—„B¤'œ¢\)@ºgÎóZ+éÒL­½{Ùi[鯽¦¦!©µš$¤¬ö3Hʽ—}%šreC|‚*ä‰;ðH±™é—ð8ËÝдª(E6˜ïîôz°>Ÿ§wQÅr–•‘‡cÈ=PR>Ü(Û¬´rÒ‡9¶>’q1Û•!èÁ€ G MÆÇ¡{È+Ìú¿¡õugy0®!eš¿Ï´ÏÖêz¨jì˜ÖJT¶fÐuzÜ…üÜgØœ7—A&NeT·ö¥)-5ndS‡wìƒ 1ÓJaùÏóÃ~}™Õ¢çèvÑè™osýÍ~aAù{‹ì tJÉ´sÀ;h K¥E4ƒÀ^ù Y·ƒ5€Ò MuÈ®ÙF-Ö/¼åöï9ª×p$è™u­¿† ›v¬{ÄÔº¾°kvº=wÚô^vœs(‚ßÓàEÌp>í¸íÊ÷¦ïO«íªæŸ£©CgtWx™6{ $B½lÒCwª«`Q‚<&ÒIË ù`Ø1=Ƀ÷fH; c׫À¼$ìÚ ÔˆO”!¹”jÁ\0¢ßÑ7_\ÕmƒÈ¹L¨M4gWFAvŒíPM¡qøVˆãªX@e°·;€¾ŒªÈ:ÑòDô¹›´¿ùðý¨ðiFˆ;WÃð" Çæëù6¨Õ\ÕÐÖb‘âB@ø¹—6¹Cµ©Óiìâ„Ífy80&2Ð ì"Kô4u³ëÕ€ÞXÚ/‘ëÎ3Ì#ÕÀqf;š‘¸ÿ"É„ã%`‡þ aoùÂ2?¾Œ¦|îC*-*ÄЇ{3Ë5¸5‘Ê»øp#Õ‹Œt\oÐͲ,{&½„•¬rì¥QŰwÐî’õ¦»MCÑaVagSZ;‹×N±‚Ù—ÄBŽøƒˆ²MxÁW#AÒºøBße"~(ŒÌŠxXê¤XŒU(.zÙpƒ–•­~êy)_¨V¡^ ºXéx†…óþ‡­â“yŒ JÒ ± â41[Àq2Ó,‚í–¶Iï{Ö[€¤_³¤Œ\:™F(†3})‰ÚŽ>ÇY‹òpXï‘¢o!‰}S£ø–Y¶­«íušü?¥Ÿ6*¿ÞmÊc¾7ÞWê°­æ–&¸¯òÄÎ ZÓa§1°P?ln¯Né Òl/ñLùDñÇÓpÑ]Ýåݬô“lK¾õ_ØŒëÂ"R¿dèèqÒ Q÷t¥ÓÙ’¡k&vQ€ÁjHõ›šk™@׎ù\ã-ÇñO4¦úGLޤd„Û¨Y‡M[4Pƒá¬ \¥4ŽXþ{óÛ%| Æö=Itäd­ÞòFT÷;s †d2GÎ Ýté­ç9¡˜r­À±,p^›K'²—M—b7w¦OÖôÜk˜°› }‹”ÞJB6ÓñŸ6eØçE„_.mtÁ˜(33µ$¶i.Xî²èÑ£ì…uƒ…ýeﺴ™8¹¿üÀ¢=…I¾ÿÄÿÙµdK ^ïû¦ÒHóôr-ÌTì›±«×}ýÖ ˆ. ñ™?ŸGÞ=ô{ؽÉ¡ìaé2]Ol¶$wüð‹¤ ·±ºÝÛÐr¨û8âjÄRý·}¢#Ìâïb÷÷6[Œ–—A=w¡ˆIH?0 ÚÃ÷~Æâ‡ÃrA—‹.zðtY{j¤èjë³Vº@n”Ä OnìwÃîïoõÝýü+tCÖ|×1Ï!vΧ—“nº`˜É—>« jè“ÇÎ!Ûy- Ÿ>lSÚ/J%ÞÎbF­è·Œ“í|bÕÖÈ›n¤®¦d§í/Å•‹{’”+NX2?+«Ê w·™’G8¨›éÌS°¶ä]g i®³HZ Ré1™>` .eùiÑu…¹#ÑåÇ_Dâ†mÚùBÆí“|K{ò@Ÿö9Ò{µÜ}Ðwðùˆ¯waVuY • š9êÛØVDÓ™lA¥´S“¿ŸÓê¤C_š™ÌZ5äûp?€‹qZ£¾ÕªÌõ°ƒ:¨§ÍPl11¶à[;’¤“µrhÊGŽ« çã)ÜntSô³rÑ<+g §dœË)ºË~vš~‰:J ~Äî9ðtÉG²—Š„M”Jâ"ž ½i²z¢Õ‰T5=fõx#ìí~­ µƒôò|íóù-ÌóK½«Ø++æ¿•Ž«?Y!ØÎȘ×e$±-hÛr ¸ñ•–&Hx¡˜üµawït07Ô÷tOº4†Þê©z5ÿ'z€³Z²šS«Ïò¯©F—¥Zr*mÓ*UÀ^ì’\â¥ùÃ]\â 2¤Ž»|0ïÃD5Wa¼Ðs*Ô³Q½l2€[°‰£ï°äõCtè¯ììÿî˜)Ò.%¢[îÖ©^ÆTÿ‰\¥ÛEš-´A¬ –r6Ì.1U«Ñ(lœÅ—ÌzÙu Bƒ:ᯣÅs¼õe3¾Ôfœ!â/Ó50ÔqNB7"ç*6{fî|ö¿FGæüŸž†|¶0±YÙeö´ÎT¿¬HŸý^‰GAÉ›@â ³~o•)Ϙœ–æ$-g½úõ(ˆñ®¿pªÊîþÔds0(‹§úQ1%žµD»k¶õú¢ ʈ>8‘jÈ:9ù8ê=ŠÞîŠbcMóÇüØðh—j;Å›ûš±÷)<Hàïi“ä Ãú̬pýxÝël† ßÍyc—šh¯×¸†Æçâl‡Ô):æ±´çˆOíêÌš+‘tó®¸{3¤Äû¾=_·ÖJ…©Æô©]24£”aQ’v]×8eÎGäà@+BÓ¡A  U±æTþÉxòÛ˜e°’'©‰@a>³{ŽLõ\¼æÁ:^ÓÞ_a{I\å9*ÈÜæ§¸Ìzé³yCÞôæÔ]96Ûè#yá! Ë ¾Ì®êº$º 5zÒ ‰ÒÜä˰¸´šÂñ¤|ÐP7úÁáónÒñÞÒùÕ-Ÿ“µÇœ©ÏÖ]€¾ÿ:ÿâ-¦¡¤ŠéLdq•É ´ú[– öaÕ’þOîqp*p“¼Ô¬|§Í ÿ>vlÒAÝ`YÛ.è¬tïßèê¯W¸¯z¥{Aíô1Tœ¥Þ¢)(/ó|–SóÈúÛ0û™Lrþúõ¯¥ïüì7%(]%³Vì÷ò-aÛóôvWTvnY¢d2ƒÁšŠÌïœâÆÙðþãå|ò\øBÐÓ˧ Kcÿ O°Ód¿òÔ=úê{êå0 1ìb‹è4·ù•ݶ—–:ÇPWlK£³+«›¹2rÖy”7¬œÝƒ'Z¥¡Qdu}ù\ÄD·V#sRJ¬Õ½ ÄÀý˜ßœt–Ó!9i(F¡A¾ÚŽyç'ŸËt‘캽ŸÝæœa²-ÏÜä@²–_ ‚‘Ðx•~m{ާ¯7ð_S1»þ§ :¸°xÄøMd̶-ˆ˜RºéÀþ× ®±Y4:Ÿ>+¿ÞTÕé5;9¶\âA"4ÔçáÉm(.8Ù¹)?üÛ^ýuX<žæ:@¦²ªÙ©úPr^¨°Šòˆðël¿ˆ[p•5›…6ì,y`ÇæÕÍå"(&‚|ø\°%ûÿ.ˆýÅíN¤Mö05žß¼Ã;«GÃñ“æ^î& æ]8Ž“[$q§ @µÚ¬‘Í.[ÉÒ…:P¿³—d>žOxÎägŠÊÃ÷´^Má6–ã_Û~·«`…:l¹BÛBZÕÌÁÐBw4‚àÛêû8­]ÒkS9`>N2¡K÷锬×®1MÇ~«`a†?}þÙ_êøCo¢ü?YïÊ‹æÌ®³Ôó˺øõ…þY—ÄažñžSÜ0½zgãa/ø.¢U= }@i2~w›I€Ue¸ý {I´5 ©‰‚g±3U2›úØÙ(©›uÛXM_ÁŸ0¼ëÿýã“}Mõ¶+\« ®dÛqKá¬è6@þƯ´Õ¦m}ð®]¿4~ùkS^ŽÑƒœ°0p8Fê=.xg!×£@œŒ#ç°¦ R]Šg\ˆàiäãœNì<¿]eôÿmÍô-â­nü÷ÒëúŽ?û#Sgl9±g¯K®bHVÝ3HèDa4ßz$5×mMv {i‡:h­”Í<ólùƒ¢¼ ‹v&\û(©vè0’ײ¹—ó’«K1¬mÙw'n>¦@•õ€Jº!Øh]æ`µÀ•OëEéÍîUvuölC€¨ŸÏQåGºc?õ,æóý•–[2訊ìo8ñà­ý™!+)·%¦Ä™qÿD]è•–?'‡¹ ‰, "²ÒDƒLõJs%—JÂRS»Ô°B¦›þ%)ð…ŒTXÅdSÀãeœ¥¦ôú6"–wëØåQȵû5K’ó—ŽMçRTMžì‡4Æ#ÃÛìõ³b2Žê²‰êÄ …ìZ6ú?sÊšawK-ác66ó¿ÎÌ=ptí£%Zâ}OÛ¸›¿ÞïˆgäÁ§1žٖß64 Wè®ë_hn)…îAj$QTÈ€ÜC]á%9#·-àÆ²î=ÝßåÀÍãh>|ä4%ë5ùªÕ]<Óæ#Q öÂüéLÁˆÚŒ‚ý›æÈY{'Ðì¥új pJœ¤~àÚ©éŽKÎCì:ÝͧZ¿ÿno¹Š·q§<=ýúèƒó³z !“½W†( MÉaG-VõuŸª@0ÎIê]èÀsõ«:)c “íÇz—Ë[eµƒ©m-PýnàxÍmz|Ä£þ #¨frW@Ó㚺ƒ»äÔnÿ˜£wˆ¹ç¦á ßkŸ¾X:ï? XÂ+®}ö;ÁPêbí¼#Œ'æ]¯°™-þŒXy·WSç7^víV¾Ý˜;•HŽl+·8¿?weøG×_×a¡JÚ­/KÉzÌÁA¿ ù@ýõ9ùaÆp¬L)ÁßG’õ G…@œNYFWÁÊ~ùÓFÊ™Á¯ovæ Žâä‘bïãž3rmnÏR á?cJ«‚…•Șg‹Ñ×ö¾—jå¯"üú¶ù0 )ávôBPO:º®òG#1(8Mi˜ßF‰Æ“ ˆ`þöãU2‚p”’-syšgØ4ñU{âa_Yeìz·ë'‹4p×7© Çðün¡`0êß2‹câZKæÆÁg ŸyP—t™BwÕ8f¾Ð“Q,w—<þÙ×Z _ÌNÑ[—ãÏV9‰¨í &&nUûá š¶+E|mЬÛÐJ?dÔÙZoe·Û¸§ iÙL$6ëjƒ]Nœ 7)ˆCur9m ýf 9‡!XŽßæà:ägðqÒ¢Mç¯3ÙÁãF…LÌK¶˜ JÎ;sñTHFË ¨n:F@išßŇ)Ldøôà¸Ì$·Ë«·í¬dlsQÖ|Ýa³RØâú]€-\ºR£d°ú$W›£j™AN;‹†26_Jž\þáÉ6åFÁÉ:+~ô3Âë;/1]€omBüÚ=Mä 4­0¡O:¦e9ýjz‘sÝK.¶ðõFÄ=±¾4BààÝÛýlX!ÅÓÊš…jp‚S <„ÚÔþgÇ×®‡L Y,²ñ½7¡ÄÛ³çgàèD桉¨(8M-ZâmœW‡Ë±øÝþ(_ $àʇe-ÙµS±Õ*7°à¡áНæîM ¢ã˾Yû2Ù l`R?ü¾ Ö‚ÏÙ#A¿\S>·N´.ô* n}+€W€õOÛë¯×="ÇL¼V•sµÚeÍóÍØÍ>`ÜúõÇA}ÅȼÍöá)Þ5í°)›òLލC®€;cÊ´&„,;M“•G(5$h¤KjW‚j·Þ_ z,|åßýê ÝÃñ¢”R³(tCÖ|Öía²Ûy!¥,}%;XË¢iš¸WÄœ©ÕPÔ‚ñ¼|Òƒ»‹9 ÞýçÏ´G³þ™ÖûJ"]õqy úoó[¥@¾g@Q {øÍUþæó”ú»¿ç- p¿œ¯ýXü § ¢ø˜Qw©P):!—£è§ãþzïÊÆpL Êø,9xM €Rçu —oɹÙ©žDüœÉëÀío“œ¹†Î7rESeq3«IЕ #Q09^ÿÂvFjÎ7£#5Œo“^ûè›ÝΞ§²/’Úz_ZÉ’´úyŒg g¦?çWppS¡qö½“Á³/Y¨'" €¯õ”5¡Ú߯®©>_Žà/—9æ_†€°™žô°$ãZˆ‡mønA:¯½ß­i< ÍFTý[šQ¾ù“5·ÅœöÛ>[kU—¸øî•?Ú·Yï_B¸×à(,¼ýÝ%ƃý—-º¸#žzU°Ž wjyºaÎm„­‰•¾ M*Ñ&öÁ•¯T™û‘1áó߯j­!} Ã9¿ÎÐtïU7ä~Æ>Kp}HT=“ÎhRÚöÜϕ։D™ŒŠ^ï§ßë‰KJ!k3TdÊP¾«‡ÛƳâ:ïÒº°Ù¼ÙCWí¨/.8€TÜY0P÷"n:“ƒF,J‘›Ž–Ÿ¡zAb8NÏù]Só˜@"°,L‚§÷\ ?‘ÿ”W8fȼ«BÂÓ£<(.~oZsê8ü~)oÏ‹L$Û/oež®Ù-¤Ép gFìØY•tmd‹ŸÎ¸ü÷Þ‰ò™ßjm}Ñ­x' /E×_°¾í·3!,ú€µÑ|¯Óóÿ^PK>¤G'¯o?7Üí‡ÛHk®ü-}×ÚUc_g•ðîQÑ+IBÉóÌÊåp ÁVk{DìÚP¬°r‚ Hù/4ŒŒá÷ »ƒ ¹¼i£óäå-Ì+ÎGW4³‚8r^?:„«b±4Xò!ÂÅXtµb;#þDNÕ¾°ó|¤&_êï§L³e×@ÔÂG¯ ær€1eEêeœ$¨Øø'š‹ê´úƒù¯¿º2yL|§&kÓμB‰^3Áè¬ÀØ'5UšÇêxRN‡›¢CÍo“Œjk£“…îyD€\n= ì‘-qE-)Ýí3 ä7¨€—'ðä+RÍ÷´š5 ó¬Çú®ÖâÜ=@ºjpìè"+ûòçÒõµÝÞ.SPB‰,¯`ºK­Ö ÖÍvà 똞HÜgaUï=y ŠOÉj5Ãþ§¹Y¨ËDò(¸RËΔPäÒˆäŒ:]lak›å8é«ál®†T“í‹Xé°Øy”½ƒ£`þ»TÅ€9‡¿šÞ»lÆŒÃirœµS5×Nª¸‚¡ÃrJ'~P˜Â*fUe û²ø{ª>ÿŠÇc—¢&¹T’ÆNdüÀŠU.3?ef °)lük0 – ‡/’ÿÃÕh|S$‚- þUQSá°<|½Ïrè³i¼& ™\k_\? e¯(>FÌÓ-9oÏ+¼1JÊñ»,Üçµèãáí6…<›ŒEP‰L ƒ˜¤Yn«Ö¦uê*Òw¤ ¢€—'Ë}÷I 3Fþ7ÑNàcöÓ¶ïœh)ˆ­úÔuÐp5™šrGDÂÚ˜Õï×(6qžÏwÒ®ø¸E¹ƒ¡ØF­AÎŽ'¢:._„*KàZn†vS¶ÔS@¹bˆÁû Iô| íLáEl5‚Ã…_0š^öãâê«txÿºµGb«ÅðEAИKè– ²†BD-^·I"aÈU(xzLižÚÝÅx©ËPoå0гu-}Ξq_öbÅ0<°d³õûF5Œ´ø!Ò™5üI¹7Àf¡¬‚‘8cШQVÍie#P`-vl²{äPI< ú²2v¯HË×LF…6Ð)øx ¨ð‚/~ €¤Ï9i`F-’þ-ÞÛA;NvU´:é‚®$g5;€Y£-³]ÀÓˆÖ&LW1‚— -&¦õzû!ßÅ"ø×‘¢õ qd(¤½7ÒZYX¿®«©âC‚p¹@¬}ÍMŠ:®~o TýÑÈÁÒ>é½£Í-—ÁÞd™Ý+,x`Ʋ¹âG9Ö]œ`fEØòíQxãd}ÈÎ8'å?ûßÕ”s­p˜¯åý¡¹ÌƯÆX·BÈÂT{:NÄÌT"®iâ?{ì9ÜGm$3"Ðÿ”ÍÔEö€ @ìâ1·„ Ñ;†ØŠ%Í`º&ŒïúU’ìøÎÀ}©„a5Ó^\µ_Fý[š·Ö Íés£¥Âð1Dqbœ¸ ãjÝq¶ž®„7Áª$>†œæhȼ¤4Õ¡jAX'óµ-ÒkÔœ¢^ô ñqî! ¡{ËÉ;êÈANA[jç,Ô!ª—x¤ý©d ªkðjiæ«ùÓ±WƘù͆ÞÚ·ºtLœ–ºÛX;MKàĦþÄ+š¨§WÞƒ™ë]WK+Ë-?¾z¼¶!»Ãäƒã7Œí½/É·X®tkäN´—5àôÁs¹‡çdz/©ãÝ>‚/{{y¥Ö~|EZË·€¼”¯¸†/íç('+a—eÈAÞë‘\P^.%ƒ_f3ÀÈŠ+ÈÑé=2Î C¨<“{~ˆh÷t!^ìW¡zú‰ªÖuÞ¤îJmá :5Ù'…B^öôKºk«¡C½roe-ŽûžñM(†ù¨ºàWðHבD)·½ •ÞÎ6ÄŒoYŸÜ1ú*Dƃ–(•ÆŠÿ‹4;œäp:'a¬„±³F§È7>£i¿3!’–x`hyƒÞ E¼÷Yo†š_ψ¦‰‚Ú_ÔâorçXÆ  Nz ¹ã,±h€™NW:sôÎárCÏË´ý…öJ$›tEFTã`ßUÖ»þ]Ëé®ßö(±ðTdZÿËAvƒÊ¡ÄûYéüÞÉ…ðËäT²EÄ/»bá‹uñcMcú ¸9¶1¥Äjj¡š†ÿŽ6c›Al.4Œ+Ä¢ŒšKªRtêóp7Àà±÷GõÜ`@ªkßIWD§²ùU,öeÕ z’·Ï¾ŒI4ì_/<'M]æ”^Z%c×2ì¥ÑÕ‘D/°º;Ae[Ž›)7Òî+1zŸ†V‰‹+º<“¿ðþî´pöIÁ¸§ „ØÃh¿ÊqBŽâýÑ…&Ošè›dÜV*t¶ †};HÑ»È:lÝæeò‘uD_ë.¾B¿&hbø8(¤b¿ˆ ².ÛYË Ž Ä%žMï1¯ŒÜDZó'ëÌbÓᩞœ J÷FÛü‡+ÈÑ'Z“5èˆ=ºäzáîìrí@ŠÛaŒ2É×€¯Æ?M<¡xJH=@¢Ã⸹¡3Åcr|rù|*ssù¸¶dx,i™‚~N¥XZG@Rt¶XÌh4Û w¤!KðçGo:,÷S•¤¤¥ØÒháŠà&@˜CmÁDV§-BoôÝ„ïzéôÄ”4Ïl’ç¹ë¨êˆËò/O-¼¥'üѧžNWèý¿õí‰_^dSßÓmºxZÝZ={¦† òl¾º¬ÁNÉðý} c&ÙKBt‹}r”¿O—8c ëÅ“¸»JðМ.ÂÆfÏ ÁQÎv?ëø?Rñ®¨Àió@Âá ‹ÌøÐZ:yû¾ŽX#*t8ÞåeµaFÉ®MÀÊ!¥ñ{"Ÿà7<2‘&jA<8,ûc6^ÍŸ€Ülÿ|7ÍÛš˜xk10¶Þ@ 3ƒÓ—Kœ ¾“&„2g¸Ù½°ˆjvApK =……*³{…c»Hv£Ê2«0¸z:—‰Ñ ×ah²ü ç-ÆzžÔ1]ý¬&‘¬»—[w§F …·2‹¥(v&šCâ–*€@Qžªäw1„´nrUBgÀý“ˆ'}í@Y1öTyüÄY`'ñêdÆ„¼Êh–Ëãº,²÷¡kUö='Ì#šÞö. c°eŽA´[eù¢K̶ÿ_7 3 (!VFŒþFùV0 ]X®ÝQtVYcO ªmzä8r0 ‡`‡°Îüß»ÓÒ<ê}á_5 O v7ÝÍs¾4¡e ì>¼zsEzÞ×hØŠ&Sym"3ÂP0ìŽYÑ(â& `ñ€—æ‹•¥nr’uÞm>¬°%ÏÒ#ÒÄ5Á Ò€ùHj7·hF-œ8¬>f‡G¦Ý¥oÕÎ1œ Ýè1úÈ Œkô˜ÜkXY$Q¾At êGfà×Tø© ¡nšß*½Ÿò–'š²õÏÏÏ€ Ô+ôΩ@ÇcJK[#wÖóqtÆ’­ï37Æœ«53.:ç+"ÞùsSÏ‹iò> „96\gʺ=,ü–ü×PvªFôõ°ÜæâÕ% &`švĸÏEÜ‹Ë^EÀ $‹ªþq¤t뜬tžÞíÁ:îµTšÃ±ìð]®å£9¬ÍŸÈå*NÝN.V`ˆ@×ß9+òÊdÀr´íJvIq’vópŸß[‰ aPÛî.ñ#¶?¯œe®F¯d¢Ê¡¯ï¦˜.Æ? K±"Ý*¦~Òé‹Ã·P[ú×.â(þ¹ÿµ`hû»¡è>õ9ß%z0;.B8n`ÞÀY4TÇnÚìPü¸¦ìÉ—"[y߉x7„?‡¿¹$WEo`ÙBL“ÎÝ@ÔÔb5žp`(*ZTãøõL†Ïg@¨®`Æmï›RQ=p¶O´qëv'€óa€ñG$Cݶr¥¦©È›»µLäM%ægD´ØÝÇåzÚÞl§¡»Q4'e(ÐE]©Á¸Ýç%ÓÝò EaæxUÑhýzÝô—¯ÕÓèØ>”†õ[Y¹#h˜s«¡M\êÆúƒ“ñ³E‚øq¶ÄœH:K¾ÑÍiºG7ÐPõzßœ€lìͧ•vƒŽ‰0Ì’ßêÐižkæ&ÿúÀ(åF*|©¬?Ñ™´Äÿ‰J>i^dk£;eÎk }SßË×øÐÖß ó°š½,~†*\‚€åV4?·A)zk¹_ÙB Ž¥G§a+wÇíH\þlðP ˆ Ê–¢25ê¯ï©02[YåQÈÕ{¿*Zw…木…ËtVí}<“ µÄ£;Í’`Ku» åÏÖꡦ¡WÆ2vžêi[cC´Žwo›®5DU«›³U¿Ô]…0b±²æo( Q.Î:‘*Sƒ­TOÔ°&ž0î 4þRWÝ+…|HÏÏùN£¸­áŒ*¨‡ÍŽ(t iáHÜï³KH—„ØuU[“b£S™º?¿©iÜ2o@wQÝ>Ð,wù²-v¸Ã¾6 íIdàÔÙ²ˆäÜŽm‰ë h´½9Y±Q´_¨½g³pÒ Á »÷ö&ñ´Ãñ%ƒ5g¹è¢òÊl 쎩wu$g gÐ[«­…–££B± §ã;ž‹¢¹SxÛ2›‘|•Xz‚ï_r‰ ª£rd»EUõƤæJF.Ê‹J±fØ€6ºÃ=Î>yüŸKÂäF· XÀou-‘–:éŒL¸°5ÃÈâ÷ÌÅ)íŠÃ RÞýÑôÕ¡½¦°BÁÙ øA#Üæ§Â›:Èþ¡o¢;,p˜¬þÙ&‚þÜ2êˆe·˜ImYµªGÎ;ó©ÇÊÆ4S†ö Ýs°Õ&Bôèta±Ây!UÒ= {¤9‰ËsØq¹sý R×jD[Uù`¼Ó¬D¿v+zá-´û» ÁD\užw8ÄÓþ+¯¹}®³Q_¥E å]×Ô »îÊÝ!"&î™§f‰‚MûÿAÿ0¹ÙM4‹ê÷Óq%é¨Mÿ¢yM}ZH.šI`…<[àâ ­æÎ¦ÅOÏ#pR ôʃZ從fkäcd-«¾(Ñàa‚©^Ð÷Ñ~Ó)KL)ØÑúª!CÃ…¼ºÈÂõÖ&!b=¤'ùÚְâ«a© O¢WLRú•RbÈÖ¸Û*šœ ¯¬:‹ºÏ †ó‚`.pÛ6QÛ°ƒÇ‘ç1v”­PúâxS&L2—X8Þ3ϰ조½™<*áÜ/F)0Ú:è%«b”bTrL:•íH‰Ÿ—.e7²ûŠLU1 :¾ˆ\3;ášÛÄPÕŒ]¢·m¦æ$‡§ý*…QñzÑeÿÄO Eeý$°Ñ,!#]od'ÛMÝbqÆŸJ\àRXƒ+û·ÓÀ¿hÞö”×rLt½-‰ÇϦ5ö”r=Çž™Ø«× kÁ½vC '®-Ö=,˜(ŠÒ„HØh òÀ>L/äÚE…OËoíW §–qkJŽîŠÞl7 T=#O•+K*Í"uk‡eª¹Ã#8sb¿Ñ-À\Mt–ñ¬—Õ£”I¨Å#|uïþ¸áW²b¨3¿ú¢l¨ªˆ„Bm©KC½!±޲¦£A¨†Ü¾™ª²Š2›ût:º /K´Äñó½<š ö>åc¯½ÁYóÏ܆4)§Ÿn !§I©4ìzTE¹óÊ@­àCŒ¹ú*x¶óŒal=/j&Í h}Ó°˜cÜ ºð@Ñ]å—Ýï'öˆÒ‘·³õš}‡âôOþÑI¡¹‚KO¶É¡Ë†zw–ålž^µÂàÍäaÊT¬ÓüÛ@1üx×A MåX¥¶—ð?ží÷1g†wD„ ¸v¯"N@±¿BWLt …ý+`8¯ÏÄØÇ: É:þh勱ä¥*7‡“ÅtEƒy‘¨¸ÂÌ­ÈÁ½#2…ù‡Vn6T^Ëó¨Õù³r’‹ò!"BãñŸ‘ ß}{ƒ’¤ót)Ô|Kk*a§÷“xܵ°A§aÛÿDÉH4N\f`Ý]>Uîà݈¦UóùRAh͸ª*Pnít˜ÍŠ2/¤-±ño«[^…Þ¦Ú0­å´~5ÇÉRzë ±µ}½5¥åÃd>ŸáºöbÇè€1Лê÷ÜvøªNéL%uÄ8¼íéQ$Z=À±Û×'~·é»ÎéSùwàšJ K‡Àð»r%·nONÎE)Z/èš͘»O˜w$e'5o.Ý:gÈ£GôÛÖ›7+ÚÚ¶4/¶Å"ú7Îtýt´Ó}‘›a,‘Xj/Âá­•¥Ú_oÀâ`6'e¢b8oعÂ|åú„ï |©§{Aݵ˔P«fÀv§Ô}¦ä½²ÁÅHBki˜~êéfô©7úe—²¡ò¦Ã´gÅ}Á¦âq´´ûz`ïæµ¢ÍêIoT=öžå‹Óc±xp´ù~….(nð}Hý,îDõ¾¯è±q‚ß=cCÈZ¬XIBtWJb1e*¡”|ÝÂW¹B§úé×^€ïU)bÌ]Ô‡5¡L‹ suV6e0A‰½Z)›îHÁbk·vb-ˆÓ°áœ´©å|KÃi¿Ç'ûE!pÙè0¬Êxü÷ðŒ©¼­|£¾2[`Æv³ÅªÿoÊ€û¸s|{ßQT”9àk8y×µ:u~ÂÂÖoþ,Ý n)˜ ¢a½Ñ±L‘j@;¼~£j8ö´Ôq­Ú ?nî9‘nÈ•.jxX¼e»Tˆ¦»tnxÅ×ÅeëYí!]ÚtCe?dgÄùrZè9SF„ˆ¦ê‚7ÊSƒ(2š‹#ÓÉg'§¾hµHã”Ò½>›[—æÈ°Ó²ÊBÁèE›7Vg™ ‹(Êã+¶;‰sä3Ñåü²k/h˜]ó?7®o2¹´Í¢p°°`Èå "ðo ä)Ò¹w£x*fv®XÂD×N6E3×F}Û6§¹?'©·)»?‡Àn8«²j,ËÓ_*úÁ …S_D'R–Ž÷Üvºa#) ¼¶ÉŸs¦ñ³Ð—_,tWfi”ÉL^oÍMLÏ)Ú>5\Æ@4eTqˆW€ODLBfp 9 ¦ÒÂYw¤‘rÐB=_ë<ˆ»Ó[-A2Iy§L55¡[’@#ÄdÍpÒ'ò„#:VŠþ0ŸiÀói˜«¡„— ^GÕÙiÚ>þ“ÀÌ7hŒÄ'ƒ‚:ª| ¹$ÏK–Ú}Æú­t-3«ÁW0Ï$asÍ !FlšJŸ†înÕ¼úJµ«Ÿº׎KV/J‡`ó]UÔÍ,í ò;Ø  ío¸îü"PU›"xaÀŒºçH×§1N5^'ë¾<ÆœTDB™‚YÙ–nšl‰ùØyj ¢t\æŒ=6†!ù®Ýt&EeïòEì}^#]RM m³¨#¯á”MîãŽl6]Žò‘|8*SÙMëz•ši£™3ô„f¢A´³žŠ¹d6w¿B¿£ ‹8½tÝœ÷ÒÔfÊ·Ì~½3ýüœ»À² Ók=]œx±!p^šÈÛKvq)nÇc†Ç‚Aûáˆvµ Ú¨‡°˜} z!£+««‰wôë%•~ˆù= ÜéIÍ?«~ô´bzsC玿æb¢¨FàÅU¶ÔzSc¿c£NH3´ú³¼½UN3áóEBN )À1ØO$¡% ÃÜ(8Nê@½ÀiÄW½•Š*ÝÞ–Y´6þ‹«¡×"ø+kǘ T†ücâùqgv÷V»‘u*YQŒÙA­dS¬ZÛ€ágï—:Om÷KÜ&‘E}¹^¤År1¸9vc½ Cˆ¸å²yðð”î¦çol=;ÃöI‡µ¯_}R ÇaÝ6&TSßYŒútš@GL*ãáçG,ÁªMZ20DGÜä§fÝ¥B¿Ãñù;¦f›Ïƒ€†4¡?Ò®FŒB© hã¾â¹ådÏ'úá®qå†*…T–{Èý„íÓA­õ|³äa{e²j+ÍmGçybµ¦ )ØBJEµ¨ú¹·@LÑBʵìÚÏešKI—¿o˜GÓ¿Qε7TD‹ð~ŽIxjqVþã–lHR{‘“#<€¢Òß·H‹•ú_œûº»¼]~kí†ÉæžqûS¬–ú j¨æäkg½–¥Š¬H…M\df2› œ|‘ ßì§„³U?Ä>L.¨á8*±ÙÁÍ`ãpœÑ„¯)6¯¼7ü2JsËók˜R¼ö-O%ü~9‰²\OŸOñ+R׫_ €Ú=„j=ä¨ßÖa"£à¥aË­¼ƒ¼ÉäE‚ÕÖ>ƒ,R¦÷æÇ :ŸFÃ9ñw5u4µ1tÅÅå-|ãB £[þûTäwmúig‚/î…Ïê¥NßdÕç?s?0! Êo\Õê^ØÀ›;©Sé*Aƒšg…rÞ­¥œP¿gÆ6{°<äûþ·e)“Ÿò¶j‰â'Bû0¾¯,çæímYÌ ”»ô¼p¯bx'~Õš•£ú"þ5ª¶†ÿD"7Á´©ýöïbäùfîÜ–¯}Sòf2¶œ,tö!sCêó šn%¨ü& FsYÔKY+Äg¾…læ].¬ÞÕ |¯w˜‚w §àfz×£îp‡š%Ä FŽ0~Äê‹¶z…Ft ÌBÍh!÷^«¯œ˜VÆû1… `Íÿ|ºG<@˜¤ZÅ3-kdÙѼÄëão’k-Kʇ76L¤HÎè¢vB^B¹|/ôà*øX2b“6…Gtü#fqØÞ0»¾±xMæHœ×]ÆÜ+ÊØ×B¶•O(ëj‘ÚiwØ¿î pßuUódYýÖ?áÑ1xX¢ ëÌ„S1ËkÅ fFJ»+3Aѯ “×=T}¾Ž¢I´Î…ÙØ?5²·ªE âŒÒ/‚oi÷±÷¬€-—û Sj½øÍ'^gÂ&t³kiÇÈA “ú?ÑgvO-àÛ–k›®‘hUMqŽ¥rcÔŸ£D?n¡ájM¿É»ŠÅ*Tq×UëÔ›SW`%ACác²)@¨*ÃÂdÜÎ÷”°,éÿÑRAl7¯oACû€Ö5èËþ³ï<)Œ¤€vŸ ÓØ»A™Þ^Ýü÷ Ù[~W¸ Rš"I®-ÜÝLûGŽˆÊ^Ü|J—·¿´ÏB'¶™Ñ¥ˆO§>‡qò¤h—_¶­%ê{âªü“=7aðÚ”2§+ôúUÏU[}È’¦8y3>\F!Q8½–}WF:ß5Á=ÝÀE˜žšûfŒÓãErƒo~Õ˜æí‰]½[{±¬{Ù¤¡—ÿœ@P©†„¥és%ѺlŸN²wsÎÔížcÝçÞ;§y‚5ÏfÐÇQzíÛ«ögö¯Ä#QÃD¨Ïë|ipr¹Í´•Œ@h]ÒÆ1{ í åßl K€)Ô‡ƒ±®Žõú¿úû´+éÒkH@ÀOÏ‚löÁS;½4R}*à/ô#vuô^ÏL”Ô^ æÐ:>9›ù°‚¬·3)ch3¨´“öÜU} ûL3×ç¢Aó[°ˆŽËºüOÝý÷ÌbsÄù+q¿õÙj‚-ÉLJÁý7)œK·k#Ct‚í†à_ßÙ|Èvîî@*Â_›YEĆ)¦c-°çÒÊèȇqÿhšó¼#é`¡‡*Ý™½ËË8‹Kí —0”~ÔwuÜš+‡x­Ò¸§|sHÿ5¶@;ûÛîé-ò"×–¾Nî`qì¤qÛW@d}kIÒúƒì|ä¼¾uǾ,²ÀXÐA££Öe†m„¥¢Ö^[sÐÏHŠÔËm{Äζ &-L9R¼D>îïþ:Ç/)!¯¡Lá@e^ô™²þº³›S ²v‚Óa‡MjxÑF>ö!¨Û0ŽG&TûJ\µ¡GµáWá ÜÿI¬Sb³zŸÅz]«—ø)‚Ò©’ˆˆQùÅ·T€†hêr”ÈYë´à‘#¸âðÔí1 +†l€ú^sËYg|ÓçI%¨*nж¡âŽ5⻣·œÈÑÖS¤ˈz¦ ”¶B¬6ùr Bdó!¤tûµuv°TPµ±uÓ£”ZÔ͹XÞÂY÷Ã×À®:l¹‡ƒ[&Þâù/¸^{‡/5Ì~s2©A&½I<‰ 3þ·¢T´v#ød\RÒ@Çí§|‡©éªï5n¬XqNÅ‹Hy´¢Öܒײ*çX”Q|ÃÝ Æg»ËÝl=6«¶62;+a_cûL¥wdè¸yl-ñFß5 Ç)2¥ý{ùù±“kd2õÑÕQÂÅÔ‹Ü“x[^gñæì ]Õš ö‰@`Á•=-³ÇŸH„Oz Ü:êŠSã=W{gé!:¿³P’Ÿë6©}çe‹Dº±ðâk?Åa"z\/B:®D0p>Ÿê™¸aÄ¨Ì ÷šÆæõ=Ìëç„|¿sìó]OU0-ó¬q¼9Il檼#Ö˜ÑÆ×´…ûoö¬gìô|g39 Ϩ›“&µÑ0‡IÓäy­¤w'L„zÎó®èàÚ4ɳXYÀ=#¿Ë7dFê-àŸB¬7ðg=}ågè ¡±ZÈÀS·D+(Xm—Wc«áêç'ÛåÜ* pH ¤Xú– ¹WäÑË…q8¯êrS^Éq´¹ìëàLQ—M”øt°ãçMœ–¾´ËÜØdÃÈJõ ¬{qñ¢¸ÿf‚.ÄÜmŽÜ1.íjÎ1Z*(Çr!l)GàyÝ»2È2/ÎWÓ°å>jz+ñíGbÂUê±ó-\òEgdJ]æ ÐξًXDW7{öpe÷—Œj¢‘Jh©Bß+'Bb e[¨x ïP†Î¶{‹:§ä2êè&ÿŒì•ÐI‹Ìç7Þæþà €øÝtð[›ˆyJTaÁ/aÏ‹½ÔŸ3ÅiÞ‰“p@ºuúìnÐP&ìÆÜM ´Af«ÌU³Mü’W%¨ê£)1ü6]7A’/¢n™¹<+Y¤¼"j?†ÿQÚµùøP¬Óß6î†å³ê¤W™r"=ªùäuù½¨M•¨¾as¿ÑþXl—<¶-Ωt´ˆÀiyèï¼ôÿéH ¯$¼Ä~àYrvE_’½¢áž˜æèÖ½Ö¯«æ{e šaá£Æé*o+ØÈr£-´7â率–A`ŒòÕá •/‹-œ –2&e±i„ã~† ì9,Ô-Ùªmæðå¥î{Í4¥8•Ñ)ˆZÙDi“õ϶—º[›«)w7V¹†~J%a®¦CAK§æÚ 2Ð%. Nïç>*±c9|"fÎÈÑËw$3^Þ|×SdhùJc-Ìí4€Ôéº~•…ãõ/w@ÀȤGºŠç5ä¼S+FõQ4}À³–Æõ6zMÛUþ:#dÖCÄÃÝùØÚÀñe¸½¤G•ÿFƒ !Ì™TŽz +ûØ(©`ü釥¬µâ"MÌæÎ¡÷ƾi$‹`Dí1<Bµ-Ö Þ©†!M“h^šó¢Ù÷‰šaO´®“d ›Ñ ØA[Ö%®N.ßsç¯ÛÚÔÝ ÷Yx}¤*GOlJ¦þèË[áé¬j¢ÑæçN²ú⦽ˆt÷FÑJQø`t]Ë ŒF¤tsÎ7ßÅ~‹në6—XyVÖ%Z»Õ¯~YßbîË@:¾qÆ4ùãò€–Ÿ†kHÈ*¹¼ø5í´/r³5&ÜÊQY É/÷< Á¡ñöèósĆ]÷uÚöǾ`òÝB2·8¾kÄ‘úc W0ä—JSuçJšÍ.Ô©©¤_î¨AFµ57/”å[÷RjÒsˆ¸^ »/ZñIÈÉšŸ8¦Ï…ãXø„aEô(¨¡Âm¯Ï¬®y’ÊÅ+å¾ä<»"(I éqnQ.g-@³I g.³äy1nñ îmÂ;•°“û¸z ˆs6EB?rÏÊ›KIŸŽã\‹C-XrÍÀ—Ï!Ú¬„¯Â5è¯ÖÖÎ!97sº¼5Þ[?.ô„8'¦ðÑÞœ ³ùÉOº:w&ÖG—-q· Ï2¼/Ð5È.ìvi¦c1&{N±Œ_¶²ÇŒ:†åª+ë¶­Sša,# ¢ÂK@šŒÙkðÿkj|OpâJjx`MZ4 '‹©±lÔµQŽv³ÅáI:úŸßƒÃoo(x]êÝ™.¦ÂžÑˆ£“:[RÙÄnzpºÓ-¯Ü8ž£Õn.ŒH'j‚ùìD dhÐÞwêQq¶xó¬Ÿ;âÕ܉šM”YYÉ™3Në’óKˆòVÿ¥dőձy¼ù~‚{äº!”#% •¹ ´4{-Tò¾m1¸{R]6€pÌr°ÜÏÜòé$µáD/!VYÃ’‰·´¯ŸXLIÓŽ¬±‘ ‚7EO³"ÍKâ«(‘]¨)¶Èt†í~¤ÔMnÛkÖœ%.‡þ˜&ÀóòºÑƾ&æs ñÄË"y6@N6*Ö’’>4„•Q‡Î=árÍþ$M…ÓÅqkzC8¨HV~DÓÙÚÑš—…'(­Å̘v·dʈ™&gÖþÔÇ=F;© ò|À-us*“Ò(Ò/Y¡]sI²î|ž{á¬#Ëéܘ¢yo_Ô¥…;‹¯o&e ΠÄ+ ¨H¹wéû¹?wÌ/b$£9$+¢×ÌVSsãcmÀÏ­·ÅÈÿ9,¢–u-ª{ÔÔZ+ËolsøÃ¦ÚR…Žàäóš|Ž­¥N‘*Ѧ»}ÿ}4!S=ãý…_uhï•Lº6#³‡áS«9³ìWü•q ßü¬SP‚$§ßÿy«Š$äßF’n¤ÍÕf^O4vKSÉ6ê«ñü{ßÝuM"ÆÍÑÖï†Áˆâ⃠€¥ª7ÀEÂNêU–É'äå¡Öø<ãÌ{ NV£¤dLkIôÕªŽÁµ×iÑk(áûm´[ÓHÒ¦òAvnÀºÝ$õ?(•M,~;@#aÖ4Ç5fU-„‚Èî ‚ÜŸÙLž”èŸe¾¾ G *üò‘¼î”ómlŠà~c¸'“wYùl‡•üDu…)^o@èMì8töv-Íàsˆ¡N]T#Y ‡¸_~ˆê#Ea09ûÁ÷pí—@Xxö*z x`õ'|ªär!qßyT¯‚Û|VåšzYñ3>ÒÒNû£>Y‹ŸÞÀAeyº:÷  œ;óýÊ ìÑè*=~ñ=7ò|¥x§a©åî+B^®¸) BEy˜¼ØS#ÌAØéÁ·ú’ñ)͸ô˜Ç›“o½²ëî@*Â[óÎÓ'êÏúûà#ðâ/0ú´X"ŠÿÅE«ÖmJ qnHOLÿhŒg· 8xí “šßßbÿëÖlŸê1ñ‹b! ŒóßQÎX„ˆEþ#†ùù¨î¡æ¤€e5A¬zÑ‚öóà¨dÚ15û<è0 9S^f»:Üì)”T·–oê¨a–_yÀW]Hóþ_ºÒ#›¿_~_ô.èï M…†è"º¡â1´ûÝlöÆ-;6ª„wÙ'>•ÖlöPaëN>Â…7ß·ïõÂõ£–ªpR%þžY.ë˜ TwF»8\Ùy»ü4ó‡ƒÁ6CÔI¤'^8ûN£ iÌ<Ó×ý `îã1¼}G®åìÑnðý¯ý¢Àó<…15ïÍ%¶Ê.çÌ‹F}NÂ/ÎiúE%;‹>„,'dVí]K©±›¸®`]OB2(‡Œ~daR:/âÉ—È&°àŒts{¿ÌB*†K!ž²öZ÷ÈNèXèä“è Q}[xýÐä¼DË–WÈÝœ7ëšÜ.3ä+Ú>›› ×§'Þ€pá°2ÉÃOV#뫵Žé |…à¢Ù2yëlϸ,ǘðbÑ®~·Cäùn½°âžœÆÏúy 7¡JBJž—±oRΜhÄ5#↎ØÙ‡Ýwd±ÜÉûsËr¡ªü: ÓSÆJŽ4€ÒÃéÑõƒâC{ÁÀRšà9ñ˯ ÏØL8}§Ü·$.£½­øBšÞ·CåP’’7º’zëèz™°ØЪK;¦t½«]ãqnä•{ÚXòpµ'ß¹âþ5û j°ÿµƒ¹RŸµó6….ÐÔ^d­"‡êt×l¦0à®6b3ÍÍXl€16F§‹ˆñø‹@‘€R-Þ8>“g^Y“ìl|ZϨÐñ …¡Dá‰':Æá5é†ë¨PtÓÂÓº!´H'ìzUïØ¤)ý¡ÚÐ’ž†úv’ÌFç³´A€e˜òý`¡u@Ñ á}š–gƒGïß Q ‹ÓòoÞC¥à×k·/ØŠpÏéP¤qÇ$(Ž¡?Ï*Zz=T²Ó ª¬ÜŒX‹Þb‹0Â\ÏÆol|_x€ØäÄ! ÃI³>´«8‚Ïd˜Ä DUÅ· Y€ 0I?c¸C³¼ªÅð%41ß?óŸù3„Ôim·sC|=½NyD1¸rƒ‚ò¿Þ§]Þ&™zo(]êñ>· Œ‚ 1!ìþHj Ãfýv’}S 4Húy J–öbtÕç§'¯˜LPb0"£ê|6MÛDºW–Ö0 -FÞƒ_Ê+ò‡ 䨔DË@T žMËÆšáCÜx*m×Ð4¢|2=±pzŒ¸ôX³úÆd7wRü¼.î¨B^ÝNPßøHâ«Nf tÅõrçþnÃ}\îÊÔ»<þùQ“ñj:ÆËáÆ  hVµËÈÅõœçû7Í;SþæÜªóÉ3¸Iý`….êÛêÅc ”똭J1ÒóU£¡vh\íYæò¦öX15lʘ3¾URÞ¨z6/â6y¨ÅàZZŒ9_© Ǽ(|e‡Òº|L"Ü3– Í 2º7ÜYç0¸ñíž!Y“±o£\xY¸øò™Dœâ`‘Ì^šH“ÑѬhˆe¾¼8…[$Zž÷¹¹v>üvvéÛhŽ®ÖÅG‚èðe¢Ï|¾úf&è•’R»æÌÀg2ïrb q<˜—x'Õ4az£7iô¨œè™Òš`HQk žvLKzf„pÌŽ¿TÓ•qNO…óîÝFß4xg ˆ³ 1Õ[¿nÀ‘Sõ¡pâÂÉóžÃì4¾h±±?9Ç‹kB¸uCð<5`‘óp×{”ýBwµ»ðñ[bÀlØà&×@-SÕE]`š4‚ß"j¨+ '‘Žü`lêPSK¼”&šHuÙ7 ú Ú(ºi ¹£Ê3"TZ«Å‡'µŸH£ u„¸¦ó;ý&¾ÖÅléÍq:ý˜Á¨ÏþšEŠ×£ °ôýPfņi«˜ Úçt’ @l¨æ›äƹÓl 1IF%ýøFaÒ °ÈæÁÎ4di’×¢x §½·Á]Ših¥Õô  œ%æi\8<'8w±÷UDq:¡sé‰.Ïø õC‚¢Q6˜‹²"WÜ'Î^:«¦Ù¯T’5èì0³{…¼?7d®ÒúÎ þ¬öþú³Fnl³AJßi±wØ«.§4؉Xß” ÝrT}7=Ï‚ÑÄ„×TK­“*Èh)/p³Ü*îèŸó»»^@œ_G;Íþwi¶ïè7‡ý„Ös¡à¦âäH 2É1¯ê¼OdŽA…ÚÈߣ š‡À8FÓ½¼¦;Ô˜ÿo–ûÉÐÌòÕ‰q½ p<¶þÉÂ,xÓÏ“  ØÙÃ\$vC‰*‚ _Ÿn¿F8,ÂY'ŠikåK¡µm±îä)‰¯iã„s²¤1sV¤áüʲF<€µù] IÔá¶ ºm=72¿4ú·#Á7?æD–¡‡2DOVÒ.Ffëýž%»Ró™ïS7\’€×öÃçt¨þ>ªxîÖ©O…žlýÚ®tÝ’m‹ý¤V?ßþV®ç¹ºÜfß558Ö" ];MoUÉzE 5¢[GË3’5¿åJ¼Eÿ΋5ìnɵï:Ñn¿ŸÈqsjãd5 Î ˆ(T¦SºÁ¬£v'mûùž›´±ž¦ò4¡q’ 9VPFÛZiŒ¸jÓ×þ6`ÀoUJ — â µ~’D޼S'düÍÑø·áÐêàCÃK$lóâ)›Í_˰¸ºŒzxhŠ èsÚž}”² 5fð‡bürÆ×9 ¸'aô(®‚Ý»›Ýë™¶S€~bW¢ÛaêO²ÁÑ3ë=mÚÙ€åÜU\Aƒ¶ñÀ¹2Ã>Яd&7%Xöà†¤²_¶Î§†"šËža¡3á8h\H_P^ê‹[ËF^Zi~-jÿß Ìx¸§Ý/vïÍ˶ i–§Z Ÿ”XÓO¹Y%ÿñ&æ¶ÿX[Vl´&VM‹ÙƒSßW%ç"†á¹Ñß6D¤Ä^3í‚é -•é|P3Ès7VÍÇc¼\Øé:S çÜá"M'*ÐÊpÓâ°prŽ ;¡?èÔåø[=®Ò祔…AA $i ðÂHTœ€Ðßf†ãu}JmdIöU `«£3Ûôa[¬³ÈÿoX',ÂR#k)ügÿÊ^Ù=ø ‘\[×±­>„Žy‚é·g†¤RJÀƒ°‘9m¹ñ3Öãª_û´Ë°þ¸|Ú•'¢?ÔY-÷é £ôô&§Ó«aNEÛ™UoÄÄö`CBø!.$ÇË$Ë¡º§¹ö;° Uñ%©&X¯¬pD‰hC)–†õI¤'¥B²X‚0 “ŽÙzzc‚üpO06sÎ*é=õæ3)Ž¢ÃiööŸØ7tÞqJf͈q®ö[ŠhRŸÖ?‡¯„ó­A‚ 鼸J~¤ô88I-ÆuØÖÏÉÖêtk‘«C, ¿àoüÅb×d@o9õ=ÔÓ"—$è§õ=)VÂàs4ÖVêM?zÐ7Ó¹Ç`/† â$CïÊÈâW³ ìß <ûÐaïX4¡æƒÍ}bK¬C¦cFž :®öIDï|Cøû¢!Ü„n†¨†jÅ3„ý5ÑÏ4ët»8(”Q‹»å öŒ?;oóýäÅó=‰äMºðJÄü¤fvñkŠ/úĸ“<æýù3Ta™¨cuf³æ¨ÈI&b\½‡º_ÆGž{”#ºÙÊ háêñÑéHÞD%y†8ŽuÛoÙ®AÃn¦7ëÐ/'.¸87…\{&'(̈kËbD7øÊ0ñB|}Ë”±œ²ŸÒ³ˆÖ,­`xëu( ÄXzê  °Â«Í˜t8Âù‹|›Ìï @}ˆ(b÷\ì÷ü¯‚¬Óèçs¸†»¾,O(ãš-–J)¹éwõ³uö0òsÚ¸íÀ°£r޵P³+å ¬Gi‡f†É`5ÂÑ™éUßz™Ì¶€"Ÿ.œCÕ÷ôÝKœ;Ö™‚à݆™íÉsåZ%“vË«¾Óo(Jž¥Nï¹òÅdžs8Å,Ñ–×¼VÍÕˆ#fî2þKV×p27óÓŠM\ô¸QSOYz#½6F uqþ©—¹ $9Â;eƒê¡v)’4ƒÌ™àE7öÐ,Déšúx ïð_i_8ãæ1u ÀB-–P£’Ùy†‹a|}&Ëš’ôxÅ~‚,>”k08Š89À¤!^é1JB¾×A 4[ÑoF.`ä“ëW§u³ ¾U„#³{ÊÜØ ÓZ:ÔË&×\’±ÞÿLåè¨3*¡…ßg¨tãlÒ@d 9— éO*”vߪA"[¶\õòòwù2Ë;'4dónˆI•×ÆÝ¤Å—íŒŠ¢MÙ‡iøËØ$àN³EÒšx´¬¦ á¼ÆRsQîU¥PÏ{´HÃ’nZ´aãtªëøh…¸Ù#Œ ÕÕ|3=þn¯Aû\pq¸>Ú36. §mùƒ+µß:¯þXãcDáè¥a6 YÜ_„óÜã¤Ú>2ZgÛtghÔ"‰ éü¤’x¸ˆÄ»bm‚Ùµ-Ò¨U‹é£;D’ÍÍKŒ§wš‘'ë}?ŠÀàœøo”®VŽÃ¡+l‹“„À˜/ù@S#çéÎD·T”|öë–»œŸ¤Xi®üF¡Ÿ•{g~“â]|ÎÊC‰5× ÅÈž¥âѼ seו ‚'ç L¿6¡í‡§Ï…H]«p¬<ÖxY·-c„ ©³ƒ2ÌwK'¬š,!¤Êý4“¢¿Ãtdk£JK´ºú6”Rø¥€Äò{µØߨ+Qé]Û#ÌCª÷FL±ªa ãÌwP¿ÒJÐ1ð÷‡ijjoéòë@›%žpkÆN+·£(gÏÝ=/;¾r”žiZW ¥œæT[Á¢cQZЗ¨/Q¬"9ZìÇÒ÷|©ìõòÁ!§…Jï‡Í!p¡ù÷þ–WòÅÇsD÷ðzüiŠc8-~Y×ëÈVU;ÂÈ!¦fN;ÿùcÃg·Í2Éõª×Ïyðf¸GÅ3ÞB˜‚JðÛ<–·€5­qʨZ¨vîŒhdüŸû­–jÀg®!ùÚ5UÕ](1Bÿ@qTˆ##¼rEMRaÑ;Æ^Å8™GLýLÑ=Ë_:I¤–{ŒF}¡ç~ß?Ç7ZÚX q]7ûV²©î2–Ó¬©Å¯}¸é,9ï½ÏtÑÉ“·÷Â):›ù.:¡{ H 5¹w¸^¶¯¿¢f­ñ×ÍåŽêÝ‹-}.äÙÿVÍÒ˽¾"›5=spùšËð†@;–¶èY•*4Àµ‹H‘à)üPTÚau̇†ÍC&TŒe”Xz®ô`ªYœMœ=f¼wv³ˆ"ª¾ÁÕ.)p,Ieƒª›ÄemÖ÷M(õb£ö ·éo®¡_/ hýݰ ŸüÛcZ¥LG®´ÿ`ë>@üO‚ ÷;„@7S0žD<¦l»\Ï}wÝÅ‘pxíÏP½ïAs#:Øî¸Î,乃ÆPމð˜í‰Ûò«ºIñçݾ küçJƒŸ|ÌÏJ3•ÂïÚV”tLñ°"#a­ð,­©o+”¯•C³Ëv5Âçæº½ªÐÊßa'ö:¾ ~lõ˜'-9ÓìeNÂé·•Áæ¦\P¬T0±mµ×c¹’=­<ÂØÛ¡ÓÒŒï=AãhÄŸè«mçwLë4±þÙ葜/)¸¦]/ –dD¹n£Hè»cC *ZK:9í¬NŨùø¼´7{ ‚[_Í„¡4:ÊÜ^ÇŒí£î¼ç•Ô09ݰÖ"Œplóœ)‰aŽ,†þ€2à“òDæ[½Zèú^Àq}Ze‰p}Ã[+Vs¼èªóÏ*޵ Là ê>PVä ÚàèÞÖ-ïeZã1 gï#wÐ{pu†kVD×2¡Ù8 V8n)bõ¨Ì œMT è*´æT½fí龜ϱózÊfõÿ>J%éܾoËô1]¶ëó{‡Qº[ãæŒ;B€ÍÑò>Ò\Ÿ µ3!i†9Ó|Xsr8F`l NR+Wµ’¢ê†3¢ ¿äf‰©ÇIü²Áº]K>ÇÛôúÈ$ ×ÒË÷!ê?‚D—Ù±4Œmôédªßò“û@jFx×áÍ]$á‰êêñ(ÊÂL7d’*ÂA€„QwjÝô'¨áÞR'¸%FñÌÕl`ê–ri$­9E—…ä¨lYä?)dÃ2úñë‡êŸ|· 1Û©LÏÏÄËY%¸Ø'„*óËcéÎ{ø˜@"gÛ_SÜÿàSW˜.ÍAöÕ]mÁHÎ~ˆn.zr cDQºmk ¥áCN¡ËżP‹¬!UI0þéÚKµÓžv|à‚Î^'7´p€pèæó%Øé§9ŒM'ÍP«egAÔŸ-UÖ˱´Õù‰?€qèB=ìjg8©.RtFTœ‡Ô¾7Lk«1¾G°¡AY7¯z{ñk*ï¯íò¶l$4h„‡:Ü®ŠÌw½º/ìKÀG#Žiîä°¿¯ÂèÞˆ,uXP ÀAuʉÑê@ÍjüZ¬A(Sš¡ó«ú5/i¡2*~P_hwE˜ònòHöXÐëÐ'Æ:çØÛ:/û´†w Ø÷¶œ+нg·>>ÀÕ92Qsþ]_dC¦Ù‹–zßõ™A™‚^ÀDqvtÔê= ²0XßÑVpŽ7Ú€¼/ Q¬Ò]DøVãkTø)p%ò¿~îí–KÔð¾¡x¬€±úÇÖL+íUf–ñd¹| Äøì åˆBI2²?šÉ{RìUX }ù꩸گ&mÀ ,/:ñ ujÿ zvœ)Ÿßû¬Šl6R(Y¡EÞIÀ“ô¬+ç#'Ã^oVñŒ!($# /"o°éär‘k66X# Ýò¨ò;Âù~¿³„὎uB)Zè@–ã¼·÷çìû9O¨²É´tdUÛuZYa=\4Ð{ωÇ.«±mÛ¤ÂÀ›H¥ÒuÍ•)ähO)G’dÉßoò·%Yð¾E<È<´êä*¼²ðÚ}ôβê6›FœµtŦ‰vv³…^ž(_ ÍFu8\ÖHR7hlô*kqIA¿ÅoÑ«Íý)+Sh®3I´öÖ+)OùA±ÌÝì ÍUˆœƒ¦û}:Ÿ¯ŽR¥}ìÍk^$²`*%àœG}JGïRDõv^øÚî;{¤â†×dY€/8Øé}šUycüõÎ2§Ý[øGp;É1A’©E¼CDA”«kë¯)¡G½UÒ¥æ…äÃG MIª£Y,c;ã«3K¦‡ëA'~ç‹ÛßÅ¥„öT>ÀïÇ^f&?aÏ-ÝÅÞVH±KŠ'\®(©¶×Rÿ³îSXö…r©ÂãǦɑÚ"¸ÍXÃ’Ú¡#­EËaa0CÄdßìè°h ÏQn8¿sj©ú :äëÄ\¤JLð{™•M“§Y=QéSùzpó\ˆ£„—ƒœ·ùÏÏx‰2²a«5Ÿˆ4f °Ë\i¤‹Ã¦©m°ÇÃFõäNÎ0±ÃåëM <í‹]ûø!g ¤W`Ù Y;pyÖò1Óéÿÿߘ¸ñV¿Gï`ð‚û«6%‚6RtDNlaZŠÚúCqËØl«†ª‘Жê$JóÆœJ/b õ½·dï0“GódF“ƒáKr¥*°°Ü Žx\rIYÍá»ßCæ¹-Ì´3WnÑ÷·zH<™ôf.Îåjü+(&:êæüÆV°.Ö'\}y‰C Už·^Þ¿§#uõëfÜ:ÿyŒkgÐ]‹IòŠëµ 6Jÿ£nñ c•‡–͵@]=‚p´æ¥0êF0•†—*7dýDºº´Û­7™þgê:O˜AÇŸ‰¯Ï*HF'ü p¨RƒFãÂeR2ívýÔblãìŸ4õù§öŒP¹C@$·Ä =Îaf”äBb[ûI%.±V±*¬¸K³˜_»„1©¼ yG«À•þ²N½É8Ô혋å=DúU4ÉÒz=!ÌÂê;je.ÊØ VuËñŒÉ·Î™1Oµ(:þZQÓf›Do EPÚ­‘ÃlãåÓ8Æ].gVHÁGÜògªÍ»¥ œyYÅñ-»”¶OÐ'A!)qvõøIA.Ü–C®*òÊèU,i© ¢«-í?ÃÕÕè˜|¹µ8ÿ¶“Ô¸Bï}Šñ_Sÿ„B«XTéKЭ?)Ìém",~ >óÞr­AÂáyü ´àæ”å‚éDÇ|¤ØxºoAöVœYéJìT*¹Î½¼ —&ÛVþ[fF6™&nH¸W,}.EÚø'Üo÷T:E¨·ûŠú¦~Ú,ÀguÐÓ tº3y#H—Ûª•PA Þ>À!Ç‘oR·ÏZk{r…(SXUIôSÌ¡×?Õ(­#’Æw@Åh@öÅCŸoT÷A–æÓ×@ñJ0ß…±m#§F4ÍÙäÒ×O¡ì³Û Þ}¤8FŽÑª¤8¤cü˜ŒD`±Å_ªµ…ªƒ|æY{& rVUœ+bq9±¢­`ÃeÊ„\åT¬H¿‡Úg{+$ ñ†©GÖ$ïÀt~ÛõWü{õ@9@Æ¿šþïE5Ç -Ÿ[ ÕL%»‘ŽÁÞ4’Ø0HÌŽºF )˜!#d=•¬ù:Þ¤gÄ(j¼W]&]{&ˆ ÀUÔO»Ág.4·>Ç?O¬Îø{>¬ÆŒˆÐrIv ú+yxc¶­ÞD™\:5¦îݸñ×nsl&ìN‹¾µÛߨ@ÀÛSÇfbVd¸Pk±¦mè @Aí/hf;Ñ^;“"4ó|ÿ(䲬—Ô +VÞ9®Äj¾;u”,&òÁ$á­ek…˜ñ£5 548Œ"[ T-ãÌ–À·'‰4›¼ÙÄEÁ’eÓ$@ö$#©Kº ¶·×¢°kWûƒ&*e1aæ¬û^‘l"¶Úå„w@£j@¥fŽý_´8ùñwœ¡,ÖñÛk  .ؽî—3IÉJ‚çB—Ú?n@̪—ïe‹Á¼XU01hâ¼»£sE’96t=Q´ga‡TŸ¶Ì|¸ÇJŠë³ 7æXqH©L·ÁòK7Ò˜Ú‘Ê©–¡€Û&/îét¸Òˆ¦¨ìÈäBÔ¢î “¸šûšêW;¸ÔvéÆ~ªÚÅÀ¨×B*¹Q]Mà‡‰; 2Ú´Ë‚½z¦Í‘1ZÃÂu4Ù×?(\¼=~ ,Î-¡P+ÐJæxš¿Ü|É!Lgòè]â¡§æZ‘×ñ9ujŸ‘-uœ *C? Dá.‡9Ä¿!{ùUûGÜÇ ³é¹®ÄgåàéÊ¿Ö/*I>¥ßA£…µkE) VèÀnºì8P—wλÎP˜4û(úzú­èÛðä'FêÓTwÕF~úúÃsãç ¬zØY«ƒ+—¥ïzÌZcb߉ËRXš<èË¥%ÜFâÀ€ëfËN ÌHrµöù¾66q@ÃÊT\Ã’né_ÿ«xH©ZÊ´.;VZé=ǡˀ²…NîoB Õ {Ýuéx"º|}eý8;Ý[çÜ™BˆŒ·Ãœõoì°gksÓ *71˜™Ø”&Ú) 7²ÂÜCüô¤>¿…"¢'^ºdbŠx¸wâïô¿+\b‰°æfCu_„¥´ŠöÎ # W /4FÊ|Ž¿o>¬Á\1º›ÖóÖ0œ¾Íán±mŒ\\ úBkR\Àó:WCÔúă KzÝ5í;×÷°r„}-C ßfzo¾I£q¿»­2:µ’‹†þNt`AàöäñþXŠÇìÿ–ëÌ"NðàŽ=…f¼"‘¾âH’ Kôä$ÿѽ4ÑÊfõ=½j£;3ÎNÃìèß¼s¥MÃP£“ŸRý@Åf°1$¼sÒ€5ò+vö·÷¢nþ9.¼5½qÑi{Éú‚¡á7âƒ÷ÃxTüükÐ1¨QõåGQÂÄ £ ¯KÈÕa¥¨çư¿Oß›Bõw©¹ª‘ÖÚpkýT>j‘XŠ„^¯›I¨Å¿5°jä•ô¨Ê”ÖAc²¼H- »¨³ ÆWÈ´Z´ë¯yXÕx¹MÊp†7g b{Q­cëb‹íËÒÈü*;ªå8Ÿ%ñîo¯;Ø[‚–RŠ `Ih‹,÷»A8mIÒTê§ÒQ¹¥)^“p }F‡+mY8i¨…vÚÂ*/‹:Pvea"ÝQxª_ôš„»¾ Þåú®{Ú[}H†½Žu]vn¤²è%÷;ÊüJ¡¨&:žÁ^n~¦V±»¦á—V2Hv,œ¿”ÍbSÅOý/Ÿëb‚Þ¶mWç9°(|ñžb…3ê_Ϋf¶ß­Æ¯T™ZËk‹ó¯‰ësú˜¤¶€=øœêê8t°–%gÔlMƒ ÊhÇòK ¹O÷: ' "G2Þ^…w^õ«ðÈY“0„*A…®¼Æ-È8Fþ01±@Öàà_N[`S÷± MH)´¡Wg yq÷±³+ÚJqwkggê%Õ©5Ëábln[=Žd÷OßÇ/µÆ;õ†Tqîȃ®òÑTîšÀ²÷÷MÌ R¯…¼Èª¼,,qMø:Ñûw<¾ÌÌ8Ž 7iÍøMázƒa†xï@Ô¯r6»‡ BÛWU(|ÚÉlmðc•eögg‚÷ŠªN­NØ*5äGÂÖ æ"$µÈþ`¹Àý$牖Á1m™¬køæ§å;Û ù­##GMÉ \»M˜ìJ»O›´Óß›ïÉ•7°cxé‡_Α ¦\3ÄІMÕŲˆÕ¿c“Åvì¶&`ul‡FÂZ„4¥Þït€ËÄŒ!YZ(¼™1­‰|uJ‡Ì?`‰™çþ9Î`À™5rF|ŠKÁäê­2wÊEõ<.àPĹ:…¹„¡-b]«¯"‘í6i‘4Ûk¿Jê×Ïâsyªj©;1©ª­?™‹©M<íÁs&ð‰(ƦHÍEÇʲ¹5í$P#› cÒQ¡éôÜH½‹Úoì'Kå€}Ò5_lÝXrcƒz¿<ŒøFm=œ8Ð0/éL–{ïXæ¸gÉþŠ}ªž|ye£èºe¢TÇ.8ÿ®ª­Næ2˜=—_qr¯Øÿp¡ÏlÂKœ>õF¼¨ÂðÃÕk“p„…!un"ì²ð[4vû0K(Ä·–j?i:ÉáÅÖœUà YÌ^æ:‘YO ø±4‹Tä Æ\¢šq‚?‹ßÚï93u âÓ í‹¡}äñ#6þïZûR+ `»tU&ûÐnBÁÔÇõ)p`xÿYŽäŒ•!y?S÷pcoöΘO»Úd]¸æ1àA±Cè6±øÅŒO-J{ÝAeü×±’C¬V€¦þz>´ÿÚF]šßï™ýhÙ9¥ŠSX<Ù ¥t¸à¦èOËÜÏg¸¢ÞA–ëÛ»„H¸˜´X±CÆÑÌï£TíØ½nä ¬ò¬8¿áCß'ìiB×—ÓnÞm|-<œ }ð Lÿ Pû!Öq8Ü·ÔG´^¬‰ Ln…/œÖß¹Æ $0„L„¼Í¹“ภn]Í…©}¨/Z¬@µÔ¼`ð[3¿æöÀq8¤½ÑwÂÿÑ2xõ; !…8Z`I4"?%–FE ïøÙ|8èba*NI¹Ì"y}ƃׯ¯åOþÙV>ˆ †ÂY‚Ös>£¸U„a |‘ð$dë-Z€ÑoÆ”ÝÁ¥›~0Ñ’JºSI74[1ÒBŸh¬féüÌôëžâ¿(6åµ_)ÔEv*Ûöº¥á˜üߦo4t±é§s¯¹|/KâÜ ü¶_ÜÛjé,Ä JŽ–}‘ ‘¼^2‰®Âd<÷|cÛ{ÊPl¸»?:CI»»F×Ç$vm³»sB+eŸ}ZÕþm­{ B0É*ë0®NQxö ¾Mj´w—"¥ÆªfƒU±â¢'‹çGˆ£áï­Hí {\2 ƒ5‡¢-\”OZÊ‘|LIü¥ŒÏ½€]Ó$mûšw*îm·}-iʼ…[¨…q… ‘:=«Û¶®©rChÚ¾eÅsAFzXè¬Ù‹ÌÌÉqãˆiEyÆÄ™ÞÿmÝyi>¨ºØ¬”•؈N[ ÑcÇ ÓCÀ1Ë)øyÌPd¶ZÒ—žzìAk^]Äz|RžÒ='¡‘#N>©È@„´×š9æÆ¢é1rwñðk€xA@e·qk–æ®÷ž'n}BqF¬9Ó^œ-Lž|V‰÷°7ªÝx@½OLA²›6Ô1G)évfÌíZÿo£R¯jÙÙ4=¨ãùzŒukHgWPÑ(£†,ÙkY~çQ» ‡£·¥hfËjý,ø±³"ɲI=@½[‰Ä­ióG×&Â.9ìãwÉ•¦µL .ã¶Ëg?Pwœ!*ñ¯¹=û,“ 9¡7œ7ž?s'¦‡µÄØÙ ÓÌÅÃY5Ø ^[ÿæÿOÆåùš`ÅÑû¨,„kÍdÙjÙhÖìrô¨Usà!sJÆÂ ogôæHõâ„aŠhçsÙÌšè»C?Óˆéqò0>ÐwÌ7úKX Pø½# Øè6ÀPãðÈÇØ€ÚP…3¿_Ê©wÁzW-Ù,ñ¦·*´ÆhéôþÆa­bŸ ý#éB|H¦7ùæIÝÜ1fƒfÃi+RM›M©™8n«#Cþê`U ŽŒÑ<²;Ûó`ïñ‰6F²j åAlEiÏÆ¿?t² ¥i5ærFOdDòá}³0ùMú|ÿ’Ûl€ #«†¢XÔ1ê|8Ê#5¹ßõPÀwè;)TOÆ?T±ÉËÃææ%—Bì…º Òq]hf©JÇê㔑\¦V¸Þ‰¤b¨\¡yÂv´ù 9‘gß ’…Ú*E³\ÑjïÖ\…€½£Ñ9³³Iª†{W›©Lq=¿²©e.‰ª‚ÝXÔÏãCMl†ð¿y!Hlšç2-ØAËC­~êûW5ÛößÖd ï¾"³³=çÄDÑm1Ãï½Ç…G×ybê˜[sIp½lKrœsd4‹Ã!©FЖ x¤W—ö;4éhÊU¸é@ö†v­(lŸDá©MùòŽüâzvÑ׆ŸÑœZšÈ‰gQr3]1.ŽõžÕ_Á=m–›«šïzO;¦ˆâˆ ‰³&ൂ8K›Ø ¯¡ 4ù]!IÞ¨åõvïà5ÅåŒè,Ì :•˜—²Ô¨ ábÈãv 52ivQ&&öÆHd0M˜×½S]Õ¿Í®ÿüíÁÎÓpÛ.ïmáðøÔÃúîq­1°ôyŠÍhá¥ý£'„mã­U°ô“å4®n0ÒÚ~ß?hEœ§#!¹Œ°-3™÷*ø"û [e 8Xkò!—÷1U¶xC -Þÿ[Ô# ²üPD5ƒæõžª÷xŒÓI/ÈO|kÚtÉúˆ^»q%èw`¡èHéʦ8¨Öëèê*>šº}ÈÃ’ f3ž¬Þlh®¨[ l¿å)º(<,·?ÃDrÅ(™ï4zÈ‘9£æðÏûWrÕ«e²vÁqîÕeÏ›bšùb»° ØoíÊ= ½é¬²†ÅKÜá¬AÝ„SyRSxbIžòéqóßÅr¬R%ïN ê@?$%‘ÙõRvÌ8 Ìûë3÷s:¬ëñ¯3ÕP)ÄCd(OlÜí»è ffw4‚Šoh?¬Œ(,ÈH¡¿Ç< XAÀídçD›ôÍS¦O “,E°w m̦~Ÿ™*“'ZÉ=;±Ÿp4®¡óð÷}H*=ØÕ²ö‘"å°Œ}9¡Â]-ôôsw«Î8A‹ÓžtñGú)4º<æÍ½(óñNì¢v€m¡Ë%«›–G,FLMòaàp‡¨Û\3Üê…ëÞE‡û/¼Ü,\k’ær°gë_#1b¯ÒO梩нôa \_‘äm6²@¨¢qmJí¡‘6åŠõ£g”+pÞ×Û`Ÿ¹ŒrÀb“D•ÞT¦Ä^æÈµóhòzÍJñJ„lõxGydœKМºˆà¹S0~é¿æÁ{Îïp˜@ßs´ÎEÔÂX<ô³WÃ=æ|Œþþ6~‰u‘ïàˆ™ôfÓBçPƒÊÔyYPÀ&P[¨ÍæHþÃ3¼XB«íÃÏÍ;'çÖêÃÕOç¹ÉdâŠàÿÉj€,Zƒ'ü,½Û¥eþ—þŒ­Bê™ÿ{ÍV6*ÿ7C*,Y˜‹ ôXÃpr\÷×ødt|Þú–ˆÿm,Ü´RóIùºÉø&_ö[Í.S£/×Óðã(³EègiþqÔú”Cz:B‡"…ðÙ ÔhF)Bºic%ç”=D™* êŠÏœ¥ñ²Rq˜TGaÖG›8B©Î÷t”7õpU±œ_Ö™?W7èU[ï5`ÆüIŽè‹c'ì@ï|«¿kz™ÑJxŸoT1ºGͤ”â•BíÛ´¢P¬¯¹€+j=â«§–‚Á±u-Òæqí^Et¿ùgjP7S¶Pue4qòž¿sB«2„éêÆñB2ó,;fAg8ëZÃ=²ú:tæIS+K§©­Qà'è7íh©¥ä ¢61H…®ÀÞ+±Ìð§\¾øu؆­U¨s¸ÓüºiÚ hwŒü_Áz…ºÍÏÉ h-QADÏG8!ckaÌÕrW^jgÚøÄBä&€Aøà3˜©îc³Rƒ›üMG †ËwT‘ÚåþâÎû!ô¹‡Io¸ù“ãÌêœðdB@80àg8 »óäic®ÍÏi;êÌwµYÎ-Á!¾gùÄ9÷†KϘ;ŠœÁò$«†$HþE¤)“s| '\b|ÖkuÌ“p­IY'w݆ƒ¬ÇÌ–l««F¢ªeØý£æmÅÇ^ÎÍ Ÿû»v&>kbêѸÓf*#¢€yËG«¤‡™óÛ ~Fqu²Ä4Q>™}ž –amb=[G»7~K á—ØšîåPYÆ),Rà Ø’þg` ú(]É"cÜdw‰ÔÔ ÿµ< ä¦i´¹cÕòúoü;(ª½m—ª/’ê?øíç«&Lë 0ô=„8Úp;hÒaY(ä÷–‡°;­Ÿ4G­Ó ¾oý>BË¢6MÑÙ¨é5|­™žˆ1;&*B2Å’hižñQr“&ºL´~%æÛ“p‡[¥«MÕ²aù×EhB,qO0¶– WWÆo}.j\ýmò'ö#“µ2X;IUŒŒa$òô(yA3à“Ôþ €_²ñ‹í5Ñ,£!·›iäoãG°}#Hf­~¥,PôÀV%—­}``¾#9Ã$ñTÂíöLz@èAžuB¸Ê>.÷«¯. }@~]ðXüÚËhR&Öµ"Ô¦ªÈ¸w‰8jGEåô‡_b^›¾Ð[TÐN¶¦Ø5.~NGû~ô2À€ ž÷ïR ƒú:ƒ›·rØò¡—èü×íú¶[r4§áÀÎ×\1 ¥‡¢`Â!‡D°•¯EšÓj tÄ©\ŒÍN +‹ŽÄòÖù(hëQí7~;ê$ ; (šæ£ïP3šÃ·ð`P·p\& ”-þ;LrŠ!@ùá7®^Go¦rEü’ñßÒŠÍâí´——f†deŠgI™¦"‡÷L‹ÍðÃÂÎ5ë·1{ß!U5©yjzçÑ¢sÝ__Åøxc¨™<–Ì,Àþ5Di€e eM[äú¦ !&°†‹­mðy=) àAgq‰;¸F/Ñl_7ÿF“{ eˆÒqR—Ð毹 ²Ž=dÞsïĦÝçFj=´üª€ß+Úý0 r0‚«ÎϾØá˜­ÊCþt.¨ÑºŒëäD”•9Ž]ä2¸!Ž¥4 …DU‚스Ic¡<iôh¿ÁÓ×]DX8>&‚—ï®ÑÐ+‘®“=ìèÜ37Ü™×­Ĺ™£­^‰SÇ‚ ¾BTp²¶Ö#dgP3'ÿs—–w‘‹4ÛëÁÛ™Re†»n˜‰Ý  "Æ/ÊXòÔ×8§K¢N/¨)¸ܳh‰¤Ê·swÞ°Ä-®’1ÎxÚ«ÛwîÏ¥¡¢oõei¯Ä%mKM j»û,zÂ(ê¿0lÞû§uµãDj •ÄÌüô¥>eÿðíV[E­3%¯àù…i‰x4Àa”lt^ÖaŠ`_n;;I¦ó&_;±üø¢_H€Üw¼æ½´Œwƒ½ÁÎgŽB:Þþš°M@ }°bÚ $¬WûÎ+#,oÕSŠÅ®yƒA+È #ëqäÜ;”o¿Ä¹ŒBP¿WÌUÙ)µ\5J?S)ókÌ œ"çúPuÌ}Uyÿ¯ŸœcÆßíè S‡~ÛI?rÖPüßÈä$yF¼Ø²DÖ<Öê4ÚC@ Z+éð·Äêg%Z¯j/I˜$A–,£ ÌÞox”RÒ¸a—Ùí]¼»B±6ŽK„8Å´fyÓS oˆ âxT$Ûå#Û{A¥†xxäx¸Y``{ÑÁ)èRIÊR Ú¤yÏüÚ.FÝåïkí–„1ó(—5ú(‘Á< 4Y_C¿¦A+jÏ¡‡­KA£S…«fhω šCY®Zƒ:“.\Zpä˜ÄÌV½ ñNñC€õugׯ"‘p3´K”©¶öñù$ç‘]^/Vó ¶ ü À²ÚŒÅx\o²9«°‘·qŠ›¡mZ32‰è4|µarÿoá©÷ïM]hâ:š;ŸcÂZâ±u„‰¯º¾#ܶ³}ÅsÒÀªõD¬É¶œwu$KÛwµ'üfÐ&7Ï.œYj«kë#)Z :© ÃÃèñ|ë´Jר¿¨‰kÚO„Ü¢£µðÑQØöff¼q/1¯ïà3Q<è.†9´\Ò5òLÛ||5vœé‰þÍâõÈ5Êš=ˆ›öÚ£ÛZŠÄïô‚f3;[•BB§Õ£iÏé7Ó¯O,dYü*ª8qê‚|[tÇ %ŸÔÜ]è)pQœC?1ÑÐ]¹»Éî€Ñ·—,÷n%ß>8'…PIiÌ ¸Þô?_Egk Þšw\µ¤a=8úXou<ÊhKó=)‘ù Ïà—ùv–Ê,YÌ ¦ØŸG±ïv^ÜMZ {Ý3ØèÙ|š„‰ÑhD6HЧâõwº$ñÑàÓšÎ-ËVU»$»ho`[qFf»Gøã)ê'ùCו£qÒÐOk=¼JaÔ§¦·H¦ ]5†ÿ1¬?·wM¬šgAîˆy‡ÒQb^åçxSöÅÒö!ÂgWþd…äÐP/„ÁH%Ù¾ÚÕZ5Æ@Ù™•CÏ Fqe媎PišXš†+ÖV¢*PëoG\yôXRg=º ¨a ÿ¤_úfŒ].›–h²–mͬõñ‰Ø5À)õ…Hõ®u§ºSÊ—³šR‡ÊG Ûër>mh¿Êt_Ï}êv°þa@bè€äž)—«%!ÉM%œÿ¬6°òÂá^"ªaQéÔsÓk–vEo|žu1ý/O0}mT7£ÜâÊZÁ—x³|W"¯çŽ%ÂÁÀdaÁPˆÉSoÉyQq›CQ´y<Êi8Ëu¿tl$zŸH5K Kß²Öß>0R5[»½Ú2!S¨ …ðû^ÖWcw‘¤§áÁ²<àø¯¡ì®v£û³æ·¢½¢â%+.CD÷¶&«Ë87¢¼7ã<>%Æ8R¸Aç"÷ìö#ˆÖ<Í,“÷¢Îñ §¯Ó32/IèzÞð\{ãDç<ñ,³ˆ»oœÙq>½!Y‰ÎêtsÀ@÷œÀ‡bŸâ²»²Å;KÐ9Â+b ÁÃŒ¯ôÆ*)¯8Æ[g0½·Õ¦§&k}F:“Z Ó8쌸çßkÐûKÞ«ÐßíZ€Í®d[»Å“Yë ×™Ìµ8‡S :Äç–Ý©ªólÀ¦ÐÂöçaͱììItµ 8i}õk×÷ñw'qOãõíëΓžp¤7fÐéž­þáR¢þ¬ ½ ßêÒŽ47u>ÕŽ4_ÀÖôã•ftÔ$lF ¥Ó¿/Stêêáßv¥’Ä•{¹ÄÔ%sˆÞ–Yi³ ÞÒŶG¶lÀ¼öoï5: £¢ä {yd8Ö¥D9™eéÁÄLRBh°"Ž "vÁ5Y~Wì=œMƒ(Ê‘OTSkcÈ“%Ö²m«J[¸& $1ѵ\‘@e7Å2:Ý.<ÝÜžœàg&&¿ÜµN%yRQîtP­êî ”BÕpÔkSæ“Ã~ ÆJÚ(05éy ª´¢?m‹NªZÓ¶´3Aö¢ND±`qW@‹U(ƒËúÿÐ;LæŠËãö³>)˜{RXÁ÷߸}¸—5ðZç–oñò¶Tjò¥i6‡¶Ü{Ô5Ú °®| :3Y)5À¿½¾+‡xäëî5Óë\Ç£÷Å·t:曦¹È”‘Ñ!a| ËúRé2tæ»ÈÀé’J,½×’/47V7G¹7uúT”WÍË*™C­@;ø¯ë î4~è2Æ¡z:SíÕõS èÖr==ªÎ¶ø½µ·Š[ z˜<6P¾¨‚¯sLã/ûåO¼¿¢Âp]eýJ:74ñˆŠ{ sŒ>ã¡/΋r!Ã$Ó$­WqcçªÒÈQp}cßø@:¢r !ŽúÊx’Cývq˜`79I• ~÷(@Ì0‰ûù¨kæå¨‚DJ=z0*ïý:©F:hÇ’!ãeþÛ›æ^À£¬W"ò¼Å«Èc3•YdP–¶yŸ(kîD=Í„¨F³] |HÝËá#Ý-Ö¤€ ?˜½Kâž]†9ë59j:˜)e]gÿ9½>òú» Ô9<§ýâ†M¥Ò úox<ÊDòt6ÃBƒÒBï9R¸pxcöÞ.<”¬úŸÆ¯| ¾-'ºêÒLtŽÇï"¯$ñ÷¿ ¡úÍû\Ž ›:žS~Ny{¼8¹îްåÊ÷œ„è—¤²Æ£ò$8Ù°CÙ‚öåÇ<°éVéÚf×»Só‹Ä=Ò–-e‰ªGº> Ö»ŽW|øöø:ª£Yz‹W»Íî²":¢ë6¼„Ç¿Só·ÙÂ!þvb•ÐNÄTÙ `uUv¼»ûùVbf¨Ð3“tÃ|ÛåúqûC~U’Ýg”RáÑg£¼\'=ánd\9ä£mz§ôè8šÛø‘°9a”ïÜ[w©ÐšùÁ¤êå,‡ –ýÿ†™ëéïÓ÷†§ÔZ¯3¹4Íý…Ä•ò œbŽåO©ð,æ1ÝÆ’ÃÅm/ð 'zÑóŠcÔÇ © ­u9 …=cÐàgŒ5#i¼Œ˜\‚)ÉŒæ¿áÄpF^&Çzz«]jª›” y~b~.}³ŸÒç¬oë‘z¹–‘iI 6 å¸]‹ÌYWLhŸ.€"bí&¡<¥™§M©D‘ÅrrFÓúE§–O!$Tá£'8X,Ôõ‰žÖ÷o'ÌWF¨lÚÚ—á»e$¯ó¨ð¸åø‡·™ÜùùHYìN_ö:ð”¯qn±>ÇÜûyn<ä´Í¡ÝlÞGœäîͲZ¶Ÿ½ô6ï$n‹Ñ ?Î¥û!=ø n×––m§R/1­öÀŒ^ØöWOH+oþ¿4¢¡WV‚¼ã¤l¡h°ôe€U»º.œ)¤ßBvO•Îéd\n ÿ3Ë¿46÷¤ú´²¥_ñÜìT1©–pà2HËÊícDWÐïÆVTr£V±—u¿QVÝø^hâª1¡X¦Zš¤HœÅoÚx«…Ã\B±uA€WrDÅ4HÖ"åQ„™ÔnÞ’FF ÜݵÉHy+qñ…LBYF>ƒš-çJ§ýNÞ“)Ùñî‹åF:ø IC¿wÏh°óÊ%qÔ½Á›˜‰¯öì€u€Vù4m´P7;Ÿ2jŽÍ•°ˆzL¸ÅJ9Œ 7(œglØÕ(ÇT7»-¥È<Í©Eˆ½x^O€‡ýáòw¯¼>ÐÅh 'ÜH4F¨(Lɲ9ØÑÂÙ Ï› šxã\ ¯¡°ªås  g±BuxìÞÑÝsèT¬åû>H1“F~øXV‚)XÄâž~í@N”4˜©ZG žº·¾_²#8¨3ùu”Å9®i‰MI Œ©PÙ7¿G—ª«~j ‡Fz-)h1BØKñÆ©[:Ã"PƒLÄFí DeHª¡d°ˆHé÷¯M¤,gSˆê‚˃hë!<ª'Äts-t òG’öQñâ>ü¬qž.œ–޵¬ n.½ÎͶÙ7rê² |]¸(¨‘òq·†µuíHCI9 ²z:v}€’·X\Œó/_ß+x¢¸à\L%Ùp`*ÊC1üi-ÅÇ÷ÀüViÝ‹ zN²"ߪuç’cÑ®„ª‹W;r/ºö×÷—®@£åÁ­ö0i¼§1@ßò°nJÈ/Ñ 'úw^‘3dÚ0 ÷Í÷HÏλqÌBQg•ô(œJcŽ˜Y'¹qGi\MþÑ+ù3òor)Ë©ò I?´š†)‘攊'LœYTªk§RÔ´ l•>’Ù6ŸšÐÚPUR4 ¬ªEÔ6m5a;Ó(cí¡cOüØâò0—!Œ$IR ˜f”¸‚y±x’T”Ñš~Çpª¿¹Væ¯Ê|riŠë£v_=ž5"ð+ 7žˆ—å—KAj‚ x ß¹ü‰:Ò¯í'/ˆ6å5j‹ÊID™]»•t¿¥¹ãF@›œOv‹YöTéÖóÕ xñõÀÚnª‘#ói³4@¼¾ñïÙÕmØ*µPáð1±ŒvGp(yþL}a$=Vˆ²—›òPËYK+’ë•}½=AÀšÉ»ÃöéiN™Š –Axqã]›6|‘£ù¦8½àxE§´G_vŒ$¼«+«7]§y‰@"Оübx‚‰Ùç+t÷Å/*³‰KÝ$NÇ›ßyé¿PÏö¥Ànhý‰K±Ë~Q;3óDÜ8ïŽöã’hc_fÏpÕïN¾]O6C3xRR7lç<Éæø;ïöÑŪ춄Œ¥ –Xàiöƒ¬ó )„E€q sqj69+²üIê á—k Š4Kfà̽΄{-;b ÿïÒüëvÑvovó…_,-çÏôÝFd°"bÊ'”rÂü‚¨ðµ¤ÚàMB“ú~×c›=Êê$¢a¾ ÇV lRæÈP,fÔ‰n°Ø–N Þu(0HÝ $6Ù‰¤Ÿñk3t zI¸ !g€|ö•ùUÀºmjçüshˆ\gK‹ó 1‡w¦ ÕBövm¾`§K,.|¼ånæÐÒiýõvZ¤{Æ?\¹>2"Míþ¢æhó‡ZäÅ&“9ŽøkÕ†~´—ý…ÄÿJJ:­õBVTKÍxµ4¿Ä&-0¿i”W¯hɶ»0 uw!/e½ïÿv8½2¯a¼ú~#$ÖŠµòäZ—aI(öÅd½ÛkQ ¿HïŸöÚªÿ.7š,΀샚.Û‘‚ ®@ý6Û è«ÎVC ÷Ý­–¥ÇØrøÕ†ðíhP2.FpÎ-Ëh¯ÏaûJý§‚ÞœÙvü)´ÎºÝðswM›Šéò7L÷† Ëø¡k@Qí½£bÎѾýRAˆ'ÈÖ². X_&§ÄDpv® ˜§jìë„T•Ÿ0¿ZKï•ÖT“’®9Ùsˆµ«a*ÖG*kbQ4á{T ÀÕÁ#žÌ®\uÉ÷ìýÝöc ÐRØtæ«y/±Ï_7¾4¡LúöB‘tÃÅïVÉ!ç¼£‡1µ-h¹áa½­½¦-tËíŸÇUXÍIp‡ŽISgEÃÝÀæ»Lèx²ß6MÍÅýëá`M È6°qJ.£»V™að{Í® ZDõx®mk]ÇÍÓÌ7}ò’A‰´¶FÈ )W Z{›UóŽ;Óýà!´/¡‡Q¶$Õ”•`JR Þ'þ»÷hž êXA ï·ÉúRÓQW1¡½aÔ¿^‚„"ø’ÿe÷1”Œ¤å¤n„H{äãùÚÆ‰ñ·z+[h‘O·dÌXvÒ¤,þGðE÷.^D;I!ÐÖ3#ÇH˜Ob/ö<ˆo@LgþÉ Y€„ø[Hf¥Çž˜|]¾TX¢ ûÎ ¦ì·C?u-àOº5pBú—“¼˜çŽW:á@ºåàDß²›örF³£åüƒíüI©bÞ G IÄÎÈ7©Ò1Ž50+ß‚‹XüèÕñELÏ’¾\¢³¤å…ÖÈ;ò€ÇD*O”%„¼¯L,µÂõap{ðS^º‡Ç[Ú §âÔžÌTUžæBN&ðÿŽ-=+?¬9{DiñÒ™¡›z(Ä×ñFðÊN)¹m'[TÁkïI„bǺ,)uý¥³à‚îÕŠÏh ² /"ziù‚æD(_Ñúó  ÈŽ5¾ÂEÒI¯¼öÊÕRB;ê*°póû›>à*Íáÿ¦Ñžò}üÕm"~§eæcIÉY«Ü0gÌ—§—ÅUýÅ›žMã°h˜Ép`›k¡ZeîâÞìç+ï±âÇ¢¾+?ñ›,Êä“}¤µ“¦¾ ó’PCæwÔK_÷´/sëeÀS;)Kg[×ÕÌj{¶¤ðCýøy@ø¨Í6kü‚sÍçrì×6sq(>å¼&ÍmFÎfVaáli'ʰƒ9B6}刻ô4ôÝg˜ŠÑÀÕÃÒM¨¨3eää99YCN̻̘iš‹PéÃ-=7UøQæÌôÄæW]N§ra¹‡ÈüŒöp5Ò×`A÷ +/ÜÍ'©?¾îßThP1í.– ,Ï+]°„ %T±r:p‡n(áO"tÊ^O88·u‰ à f[†ÌOhg¼‹[‘iÆØñ³ Ë‘N@Æ¥¬[hUŸŒZÈuÙ;¤b¹ÔI½;Fö[#ú0DþZo-ñçq9%5v«¨ W³1^‚ÎBÛ³¾úbä¡”µõËþ‘];]À´Û'»ðT4õ¤9WˆtꦜβåˆÚNÃ÷Íö»¬I@ˆða\ J…ˆ¥ôëéÖ€ÞÃOÈSûÈ^ ãÙݨeIþ9kç;)xªŠL€º”xŽÐ=HÈŒž|«†}³ƒ~ýA&zýô€‰DPnÓ…)WˆÏ¼½‰©ØAhøä›ÓF‡O²¬pûŽ ‘@“Å‚çÈ_^¶$:”ø%;½è÷\i1#¼ Ñs¸èƒœÜ\Ñ€û¿¯ÿp.Ÿ`w#|ø¾—7–½Q€ô·šA½ë7ûËâ8ñ¸oEØò[9ý}ÔÞˆO–Y¢z£ò\àfØØOÀ™2¸²Ó¼‰”­º3÷ª‡­Á4SÆt诜ö3¬Ç0^¨C”›ž[íjì®âb• Ü& åUÑ[Y<)Vm31²mÙ4iÆ‚@›èÓ{É4$á÷ÜÜ•îÍW•;½(—O$ŸÉŠs£„& h¦›8(†©« ¶!^F3øshe÷Nex¹ÈPÀåÅZ-Xñ-t˜Šñ$Ìl~!5 É@öøËLÜ©©Ý+V©g ŽÃzÒð¿ºz·ßèz×¥¯KnwâÈù š—×ìXý-zÛ—Ëjµš´åšDˆ|¿w^ 4Š/ùFé×ú°¡=t“zê˜` õ ÛñM Xé%¿ï1vóìPNuû†ŒÄaF8œ#ÛþƒV(16ô¢£¯,y—0+³åE|2•¬Ðm iÖÝ+ûîA×É&³ÔÁËTŽÉSz_µÃ™ý Ùì9.euª*x¿¹‡×1°€H˜ñH­ðr³ç™2üŠÛ6;²±V'ÓÛ² éOé ,ö…×–5ÞªU%MPpIòŽôÓÊzå ¾¯^þò\„„£J9úŒé/B¾¸1X¿&ëDæ!>[1Ç[/IÓÔD…W'æ‘¥¾böY2 ÿš"¥(‚`§…a‘¤Væ‘]4D•è#ðgG2;ˆŠaìüïgl_I Ö¶€¤'—/+‡©Œ$o´Hû?똇¡õ3!Îd{;œÐw£&žmžH0_;.„5§Â9E ú½^ÈÍù滋W;ˆàÇÊ_Y 8“ŸÞgVáëGWP(íM'§ K‚Ooï'üÅvPf®®s€{âí. ÔÁ£7™<šbÇ`¥†Ð8è†áâ(CÊŸ4„]÷ì0rnšÔ¨@ñãSsÕÏßmlÍ´8»÷ðíèmÃA ‰œÆ7LW?Ï*özGSq‚‚ÙªñòXø= ášGâL,Ju¢û&ž³çÝõž}•ÚÙ¥Ó[}¨'dÝ»7sË n;/ÜÀU;&y\4‹l ¿êçÊ{tÙWدOOºô1TÁ:O¸Å*úõ÷ügW…ù”æk£è­å—18öúÄ@ÁêÙÿy±sÆ—ÿ}’fäQÚ/д8Ìç¿Á¡#?¸µØØáˆF¶@œ³£ÓùÜþô±8ø‡XáMNÉ]½Ÿü@>oyV‰ÈÒK±yy2j½<×ý)…ú• s šá¸iYälG xÓA±Y@YŠ$†4ò¿ ìè‹ÃgGÝØ’®9Ä–5(بdžboÍÉU8UÛÃKWöјƒÁ‰þE/Êø˜ ˜Ö!ó+œw”Ýȳ/óø¾i4°<æz7µ´áü3ö%¨˜;•Á…:MOIBV-¹ ÿ­JÙZ—}è9hq#1{u|ç^ÍÈ(v mw—Õ‡¾8–ƒt¬Î?Wgh¥ÜìxéˆÅ1gÚ>7—©¨ÀYhȈ‹*Uï 2Öoat¶ÒM b¼I% æÙµ7±Q`Å‘€žçU@ÓËø3ø£©A.b!ÙæVÒ ƒ˜ ™ä•~Z6dïgnªõú0#Ål•T~Q•ƒX´6ÜL¥Bß9ЏäÐ_ÒÒKÀ‘ÝÙôùc¢‘؇kZ«„e[79‚²ˆñ¡/gIs®ãœ~Œ¨” °©¨¡ÞY[ñ-ê‚_*£eͨ]|-è˜_d JŠáùÏ(|é1Сt-À†˜W)&!ž eP—ÉÓUnž2Ò;Ðp»¾\Q,†MË‹Ùè¯FÿLýéØn4ÞÎÝ™è§Eç(…4†ü뤙TŒS\úûBÒßL‘¿{·†åwÇPŒùž ˆÙ°põ¥ #ÍvÉßù`ð§~èÌ”û\Û‡ø§B ª@Ðnö Y]ÖmÔ6¤â½`a!ä#à{ç<ÜÛx)J-Áw‡Ä)k+±tÕ]’UìDÏ… hÚu¾W~È qXvq-òœ¿¸€¾— °Ÿ€ÃîWàÓ§BÊ8sˆ>³ðoú“àG;ß'˜×}k:–,ùô-´¯åÀSòÀYVI¦Fò*’zNû©æÓ ,wb¬r¼h'Ô‘qñõ|5Oî^’éj0k„„»=Ÿç¢Yй–’” 5íü zÒ /ãdíõJ%]CKC/Æxc™rföHbÙ*ó<ÉÎ_ë#Fª‘o[0hìQÖ¼åÕWñòáLÆ<¥Í=ð•Ôæ+ò€ríc ñEŠ5ÛWƒ¶Im£˜Ÿ¹n]((TÅâ@:É®”ZöÓ'' ¸eï÷g‰Eg¸÷åЄ‡@tBèq»Ö2ì÷g>>ÐU»4¦}pžê ÒOeÌÁ tã™FµÊÒŠHÞo7xzwHŒbaO_Ã4• f¶å®?ºÕص¬dø²a»ðoÆw¢ŽµLŠ¡6¯?ã‡âNkt$ÐweLJ¼„˜¾mzµJi vˆ%íc¬$æ.@Õ̲­¢g[0‰Xð“lquö»:\»†Sm^ô>ºÙv“$ÚˆÄè5"=—o¾[£‘aöó§ºÂá>§5™Í0ÍCðU%ð£gèà–=·LBž¾"ÀªÂqz¯CzxLϦ‹âì¼Ùb±»ìŒ­9Í·11Ó#c5L¹»®!°'ƒ qÑ׸Bã]Z@ ®ãvÆ9£µÒ­Q·_¨deÞ@±?Þ4 “G›‡°ã²½ó>•ie«ÍxkÏrÚ€ƒúy‡7S´f B?PB6¹\I9õÕ ³Ø¯—!åóµí-þGÙ½ 0ôé#OÒC”‰{UGf¿ïãËE3ãÐÖVûâÁp¸#“Àó»Î“gÉÕsZø1tPÇô±cΕòo/}²\ØŽé°ÛñÿÚñmTê9„ý>ÚóhM"˜íEÈHjõB0ó1üû2 (Õ¡¡}ÕY58”l†i³Fôi?­¬f?ÆÆà‘ôá×IÒj£pb×ÙA+!E¹è)ƒ:æx\p¦„)2‡î²(j'Ü}{š÷_Ôã-ªFAïú*y M ïùXô‰ ¥Få¡õ3¬á›"ÉÁK‰rr#st½¤"?ÑŠ}N& ãÒFÖú /ŽM,lDæÔ鼎ÔVœØî0Ž­—¶V¬›•QÍÄr¦B©ÚºÂŵv˜Öн ¿µ#y×,ô)óN§Z±{¢³éâXL.ê‹Ü£"ðÐ2‘Îÿð„;× Cô•Q¹± ¢Jü y¨{oI>÷>i Jp]ÈÍåâ`.Æé‘h5zin¥¤YE¢BÌ…¿^{f]¸'lH>‡ššYäükp­Ùi ¼>°Ý« ºu®ˆ ¶¸úƒcX6"–¦;’Šþ)}CJ3½ í‰ Ê×-¿§ë_0± wïG¦ì0žÑ‘Aoy2•UˆÀSß0|–·VHU¬À$…”)ÜøÝû?zÞÖ\›j—¿ZVúåA¾šÌjª°5oX öoº²âCœØ`̲ ÕßéöTÅ9ÓI™¤;«õ?Šâ˜ñ °s·—ªPàéø“7ÊÄÛ°þ((>mM¸úè J™…%öGç:ŹºÉ‡Õ©#5A!KðÜÎlRKÁÅjí´÷o€®¸á@‚Ò*¶ Ùó8¯b( ž}ú„8ò¬ÀfÒÌØ…0b¥ G¶º±fô v9ÞŒ©…€‹`Ç’^ë“Tì,·§§_îQ§Ëèì6ßÍ‹Å.Ÿ¦H:_HÁ2²ÄD°ŒŠ€±‘f cl+Sþ'â´qXR¦ð5Á9ùï£:»¢U Œëœ T=Eúˆ4y—Ð/Õ/Ä ;ý=CÏ¡Ì[@‚­µ^¾Tî•ݯŽ_öüÉŒ36¢’ úË[HÁ"Ö£3˜—š­K¬°;Ë w%%øæŽ¿K–+¸[¨åI~. ƒNHbë§®û©¨™q+ÖöU;³Xs‹*œÝAYÚ’°³äžB&bz`6«îÕlr³ ál³0Wèû ~ ¿‚ûOíCc%Äc¼“‰mÛ˜“‰mÛ|Ñ‹mÛ¶‰mÛ¶=Áþ¿Ã^ö°}¯>ôµ«êgÕÌ žÚû.Un¤” †âÆíû-èI.n’x`¬jh76¿($ž¸ÐUŒ[{!'ª¿ÄÚA²ýõÞ1EJ¿~¬6Ķ44eS)ÛVÎMØb§ÌO)Ýd{£û‰¤~Q±ö€;PÔl9§Rvü‘´¢éÐe=u?âŒ]¿1 ≔z?H8ãðE8ƶ]¿€uT~Š9%æ³t@½G*‡*:÷ãŽý 룬õ5S;¶VùéÏÞêÓ´ëá€!%ôàAãç!Ñoj¬VdH¡W€3î0êçs>« WÇfçÈc*TK ž´AÒÛ^uþýÍ'†æêkeÌ­é?‘Ó³ƾk{`=™¶ù;˜jŸ¤Tã®QßaŸNŸ¬MùJ g‹û¦”²÷‰D`ÈÄ(Û„V<­ †²Éùß²´TŸø*ظk7¶9¶öØ"'^ã¥ms‡$ïOŸüý¬¿v&’Œ» ÷‘ @wâH,T9¾~µx¥ô!^ߣ¶˜G=‰úl†©pªù¸]?”±K»þg9ÌVÿG7>&ã©Ñ€n¶4È–l6HÌÁÁ‘H©$çy軓œ‚Ú 1Ðü,V~cE \s?;à &@Ò2C5¬Tj2MU9= {Ó]V¯£­Þ¯ ÈÜ*À,åœöM6±Ì¦áM)5Ô—ô³V!Ÿ"j¥¡»_Ù±à2×ZóÝ|· xܧ•…g¦ÉDœÉœ4÷³“³Š¹z”^3cïË©‹'ýu¾e<ú¢€ª=4ßÃäiÔ6)¹1ðýÈ€9·ò´³ÈF(øÄ¬ÂxJ’÷w¡d¦?‹™ü“>ý!±q639t bÒ MÅ—œg_wnߌ½í5³˜ÂøPß·Ü›Ôïl]H[‰jÏõ(&Ë-Wia»,tð cs*ÓnU˜sšMnÜ‘›°Y汜–ùl°†HEÚ¼£ï×¾†³Ã¢G|¦“¦9ñ%Ž=b1ï«s¡IJ¼ÇÞ{q¨û K“º4ëߎÅrŒ¤"HFSÞ£E»‰Ä.¬×ò³ï|ŒNG‡Çt∪^Ÿ€À¡_}_9~à ?“ˆ]'|§±+‡k…ø~ÖÜsd?zE'!hG§ø Ù0Äuq aîX{] ø{®bñ‰ Fäa%á\µì©"YzWaB,G;C†…™XG—Ýé?ÎQ 'Yk.6ÉJ·©»9—þN/½wÝßž°ø:3Q1ÐYºÄˆüJ }3ôTñ›z\ÂY©FÖvH6Ñl@öÛM ¤|’›ºÊÇê!CyÛ±üK]fFuŠ4„œ‹.˜oÒ3ð ,±.œØ9›p‚¤`zË;„óä±¥v°ü‚T«])D£ Y‹0™lC»DüPKZ÷—²V®Çª’('ã|Fr©"© @÷À(]̺ZŒ… Ï(9EáJ-I¯eW>“P,j^¤âê´ ‡r$§žÍ¼½ …xÂ÷‹j²«Ë‡[¬®‡žjû%:]î…YFÃW)]¾Là`p~ÊÐ84÷ŠlEEnnt‚žýŸ :Í\)ú„×É`.Mè€+¬c>ªÛ€Ê¯"§†ää Q¿|Îy›ÀuÀ yý™!‘_ûŠbYØŸ¿fý*(®gekež¿¦ó¤ªI*šÑJ˜¯½mëz†­±1P§Ðƒ\gàðP׎¶g» Ý1éj,5Ö¾ââf¾Ÿ-i±÷k¾«{j—ñK(ÍÛ†k]ïG‡Q±“IØ®e5¥’˜çƒlë…˜¤©%IÖ„JUŒ±)Q× æ~Èœ0&.ºƒ RþÒ}ŧ³Æ®ä]ê¹~•dü̫ðNÞH¯Úe”íá&r¸®}‘Óí u‘e™~;ÈêVªñ"¥g†¼<šjEìR‡îÁ,ÛJ ŽdˆïZƒŠz’ÎTõ’¼UË[d&´f¯–}±g‡&µ)¯R½TB ìÅ]ö‡ü¨7Ã.Ò[„'‡’çF¹àЇøÖŠH×®tΤm'ŠUXØl×4G}G©V„Eî“Kßi¿…yqp$»ÛÓz:À4FóFÝ9C\¾pÈÓ hQ㟶™w°¸‘V³Q¢aíçD}ú0úÍ·IŸ>™çœ™’¼&Â/³S Ƽ—§×z…E®£âJBŽòÜ/|U ›¾›©,G:ÎÚF—¢¹+"èœe•÷{úê ‰¯ÆãŠP÷/ø:«œÈËùöÈ%ûð¦7ß•|G‰:ÄV°²Þ¼$¯ÍÈv8ÉHƒF·¦?©p\B½ÙZç_8ú`4]D÷‡Dðk0dnw9€¶g)é˜û·miLI)ËzŽ·–m®iç‰>¬C ;8cê`#lú¼‡iýÙÂÛ6gk®'Êy¤æG~ò€i™Úž»_^WgGñ+2D>×7W®þ¶…õ¢™2E8W‰¾±Æ4ï.9$OÒö4S{ÚN^8•C;ê¶hþ{žÏæëéR|R3“3Ès¨2;­_­pø‰‚fÁ÷÷ˆçZ·'›5?ªO ¶îap?`¾SÂŽÿ£uÿÀ5oKúk$ï ¿^¯ëþäÍ5©"Ù0Æò’FkZ3½;îÅ[‰›ôñ‡†Î*ÖJ|4m݆é„Ó]¥Î‘‘ŽkSâ)øJÞö‘kד ¥\Þ£Un’bÍ¥huÙY6 (ãZ¬ïÏ‚Î÷œÜèÙ‚~ Y»b[û¹:a~¾{cÈÚUôŸjº–â¬l¦ó^p7ü@»C ëžg”£–—Á1CUaz9Å¥–1_É—î´ßìN¤ã«­v÷ز§z%F˜iÑq ÷ FÅêEã“þ2÷4¨ø¨KÍ塩ǘmf³ˆ¢ ©ý­£eŠXa®ï…î*ãoxUÑ‘ù+ã >䃷d)ëš¡ùgÜiV¿‰‰A»Ù q´ ýÅŠc*í,À¾©háí(å¿J–¸&G#føWBS[åpE0€0 kÓ˜­ëu5zQÂÓ£,&¸Í‰+6KYBÇ­‚£xŽc æ¯ìïÐîÚ˜lCI|ª¬Lÿü9ó`,4¼-8R4ù¬u÷ èlQY+¤Å#PÕg“Ê|ì˜b§{Ô–Ÿ'Äó8Äsúi½§¡h½4#pÔëj²yº®ýõìŽ`Ú$Ç0"ç9<>úÚ>|(M U¨âîjÖô´˜r¯¿ÿÇ"T|g’÷BW Á}Æ„ÆÆ|MGá_HûNwí*™\Á˜yÓNqwqwÛ† ³HlUÚ?=ûî‰Äóc· Ç2rÉK°EÒ èh%ôtÓX¦¾: @fú¤Ä~ðÒfPêu„<—°i:gG¡ÝNýíï8tÀìç©ÝjL#ã°ìõúÁ#¸QKTܰ­ /Ñ,7£”9K^pˆFb·¬75é,“9¼ˆ üèÅ}æ*Uu–„96¯}(J{ä’ЧÐþÂyíÉð4tðŒv¸·Ct®ÊêÆ¥÷Í6ðúKo ™Ó®î^\‡ ñÏÙ! šX~Óá0pÙ='yǺ³œ›MÞÆÝ½px¼VÑ“¤}ô ¯_ÛÈü¡—)ÑtkÜ`h[òeBåöü |ôkÚ_]øG2ÍÇh¯]DC›òGÌÿG¡9@/M–AV“'D‹ÒǾÒìv×O,œZ½[4Hñ£ÐŽ®gˆ»Mª5{úÑ ‹vÏ–+e/¤¸ö¼ìØ+3à |êXG4¦EÛri¡ùäõòÇ* † ”<øk“øœ±7й|R•7”­÷óÁÓý'P>˜f /¢²J§¥]~ É ßÝ”7#Ïx[õ:?¡W9ã'ýõ&'ÎÀ›cGZׂD6S÷ùе¶2õÒ³z%á¸Çœ¸"fzè‚ï]Óf^«IW,™Q…iVz$BþB“ñL*ÄºŠŽ& {.² Åe†Œí9(;0Ëé<5¥è˜ÔiêØü XܦX;WHXTÿ }ÑÓ«™[axˆ›è«îúÝ@ÂXà‹µ'5‰•8)Ò‹HÇÙF³Í¦/š4Éš.xÏ`xЯPrié–ÏüS+6Š]2Ùì#Ÿß”ïÛ¯ŠB\Ý(ÛwänlÞx ©}ŠK9¢O϶¢2ö¥òýºa¿ Âe'Ö––à½uE±hå5¬DÍd8Í]d}z€ÕÍ„zíßäµÒõéu¸^®¦àÓc¼@‚´ôq‹µ±ÙõWJ™YïÐ,E‰šñ?´Ñ«-Dùþø¬…ïâiq(¦io½Ê· G 6`Qç:?Ÿó¿¸Tìhü‚°Sf4}9±âŒrÛò< Ãß6’­<ª9Y9?F'@r楹!:‘´<¡+y§R6Hw$äGý€›?Ã'ûˆ’K^ óCè·¸i%Vj´ÐÊŒ¿½šÚmæ?Ô‘/úm«.Ä@S ü¿È}Ì#uÀ¸l#:厼&¨*€rëS÷>1_çª4%ý(ëPó®§·.ºÔý-¥ç7»v}Mw¯vÈ+ЬãOÝ~¯Ø²’õpŸ@8­ùßBBøoœ#¿ _!`ˆ+â1…‚%F´ŸQfa¼¹“íç„\ècÎÚþ8]^ò¯‹»¿y{F <Ùì$$“ï~!rôH< ³³JÆ,ï´2”žD‚j¹c£ùCch4ÌÿƱžˆðÆ[D(?ÉWUåËzج™<'ŽªBö`0&î¯ùL ±¶ÉzD/šëÛôÚ(EO'3M|:¯t›§VÖDÞ>íÈCäV‹o%›c'T³Å»ç°âޱ½ }p¡ÿ5â‰÷ÀÁys$ƒÌ¨{hHî«ÙK+I·@T$ ³ Ùà¡ëW}—رz‰è”4*¾‰×”u›EA¸XÏ7ÏU¾0Ž7—oj½–˲D Tn·BkÝ Þt e‚©rk55dkìùaß+8j…qŠ“$öüC·æÖ ‚R<[iW˜P¡(®þa,1&¤4!ë´lå[ªòѯ¦N|ZO5N¼CƒUeîC¤U ›5ò$­tß–zúsW–¸C¯m–Gøj»Ã›¤Îî´:ÝØ‹& V;ˆôNCaPHù<˜|ˆeØ"#8(ƒÄWvlÊaeb[‘Ò™E_ý+‹E/Ä" Skª2€S&jzºãã*Hª)àÍÉÈíØh­jy–%aŽÄ÷âk“#Ì=Dqs8Þ­ÚJÀ5(íñ™À$uõàrAÖ:Áä$:~H+’õÇáÛ¡`ÆVÌôöÏ«{¥˜ pòtª´Á®+*´Ã‚îuOßs¥:1)ÿLBÿ¿wLhd=j®3Í0£ßôÉŸT_½–;ÑV óøÝB Ó`J ›¼!¼_®Ý2t±-3”%Å?}#HFd9z¡+*ïH7JçÀøÉgø¹ìÕ"¯d0ûgýu3ÕÓ)^´1]Ë®bùᆬ ÏFŠ`JŽ·eÑs(¹46òƒ‹d\ìó³}¤ˆ¼Û!NeæKeðÒU|«u;³‚ð"*þÏ‚ûS•2{Þ+Z¼uú [»µ9Í$K¿zñûmJ*´›²üþ°Ð• &Ì =wVaçÝ@ã+ ¢ÅGSò6Ç¡“Ô à•Œ‘·½q5¥/õy©ä˜äØBŠèúV´¸C+fÖ¢E_8Ì;©0K«·Jwº[pØX S‘†Ké†ïM%i¿m6ehâÃQ©ª ‰C ®æÌö˜ùë±¥Oxô~ êY²\Ùq63Õx¯ïûÞéD| L~fHu‘˜åüá4GzÁ—3}j¼b*­‰Ôª¹/ð…acUò‚_AÇVú)¶šw6Ç7jd­ö*ƒÖn+Óì3ÿàß“”£¸`!K½þàæƒDÝ`j/ÒðÝã•‹ËÔšY¸Õ« QÙÑ;HJ¡€*ŒýÃϽÚzÁNˆ&}«„yqöSAÇtû ¡¶ÊvîI0ÞYdߌŒ`¿Œ &>h&ôóH²‡G+£…cV?·Í%_oòÝJ†ç¨,Äk"…ϼ: ŒöOáWì´Ç{c¯4´KŽVg+x9¿öàžtÈB3z‹(îÜFÇ ñV÷ZV7¹…¶‘9yÀhì-,‹>@ðª?1¬Uœ’ç¶{ …/jd~fÂ"_TÄf§V(º…QæO©1 ¤³ÿપjyŒƒeðçé¬3xÇ…„ ‹aáÖlâ©¥*<:qÈ\}Uœãmn¸áÑJÄMŸ-øŒ2ûǶ€½zMä ÚŸÇÉ0ŽáָγæÅòµ|ת¼×pçu5D1?ÀP¸”~ æÂ}Öèã°”¾ßK8ÖÆ`ÕœÈ\-©v`á€;(Þ*b³°N¹-q"Ÿ>u°þéþLÁÙß„â#Þ¨òñ\@·ùR×'(d‰vØÍi5 È”†|†=üƒáËM}Ø#X}ªrTå? é¨bu·‹"Aò…/AÆy1 $o˜«P·I:-—VJ(E$1m ËZ åÃ(bÉ/Ô㧤œ¢üqýhiP…8ÃZûâHwæcl-l„ƒÂ€1>=Ù .mH:Ïÿnæv7IóŒrgéÜXRO7Šó²PÁS¼²]‘…éïYb·Å™ŒZV¹óÎñð·CÚ¾¶Ôp9ds$ðV!ßšaÚ&ŽþLcÝ+½4©Á)ÏS-äË•0’S«/Æ ùàÝ×™)ð&\ÅÏüMIfbqTË{ÀI¿çvI¿E4Ð-ׯO<¨)з$þ–¿tÍœ»‡Ù*í¶”ËpÕ@›lÁ7…DÎ ‡ ôt0Ý’öÇW<;lxŽü\erÈ„]ï×x7ïíB:ÓøÌ/áýK" ¦ÿî»ùÂû]œ:g«˜¿gåMÝ’J¦\#‘‹hš+£Ü⺲í ±¤ÈpÑb"WLô€n P,WÍâtúñ? [ÿÃf#g~é­Š¡WCÕ„âzlïz¸P*"—½Ä¥3C{ÝÿeKìC`ÍÐ4¢¬XuÑ»+û½#™H#ôSm¸8`ÞYtUÅØ 3o\ÛI‰üÖ”†\ï0¢å"©ñ§d˜4äb°z+ÍòbMYB 7ìŽó1ý¸#8HŽ’Å=]r/Ó“/<^aŸ:ócqôk¨ÜêðH„ijCçãi:aÔ-Á\‚žÛK]µµá3f?rïÐÅVÚinOýyDY¹äÿX¾`˜Eè+cå¿ÂFû?ÒMp>¨Òÿ ÉÁ½ÐTØ€óµÚ,7lggg åLÈ;ëÇ´ ‹…â >¶*9qÃæ¯…}å3ÿÑäs)+~–Ólk…³Ûzm‡hÄ¿éLAÓQ˜)‹úüÎM{¥•ËAȱy4´ó;M4Ð,¼¼Ö¤‰ /]åD%Ñ €Ñu΃ͱ.K×äg±KCê£Ø* ƹóßG€°©Ÿ-ö"& K43Gñ+uÃuÍëãÚúF¾ŒÌP Î/£becŒÔ¾coñÀöZ¡|ôf9°µ·’„²è~ûŽH¥ï…ÙÆòÍW{³ÿ³JŠBy6_󎉎1c›ôj©x°H wÒUËœs3œ€«•Çåg•Í'œQÕ@n]o]0Ån”t<$¯naLaˆ¤—¨‡Ûc±¢)‚r!˜ Ú‘Ã1m·›ð7QE8eÌ%[T:óäkæjh?aÐiëi>áÍàSË 8zd…‡+˜y‰ê쓌Q­;¸[ôôùó?0¡f„vRq—´Š-,‹hó‹lÒ«Ð ´vGèˆnƒdЄ™*ÎT-¶1†ŠE0” µàxÓ®á/DzÙ.-¢)œÏR2NDi–Ï(†,Š»áÐØ¸(ï éÖv?Nm¹2—ÔØQ‰B~¹šä— ;±£r•T¼¾T/¡¾ô9þЉœ”’svÝYÞØ²PO}³âªt0cn´p§ž‡ý•i¾¦?0V¿vSˆ®ÜßZkwDœÃ1nkAš Ÿa_ÞÈIzOI¹Ø9 (¨‚Ëmç‹ÕiÄgÆ‚½OJ:‘†Þ{VÐÏeÊØˆuQäP`¡”Z(\Ú‚Ž±ùïåÇÐJ~V‘U!t ÂEÍÊ aHœ1ÎSQFOüYwkØæ“dc‰‡ó¦u芄V¸'ÐÖb²_ŠZdBnñ uÔ HŒþ=N¸%hcÉ’e¨ßŸmBû)в8„EüDŸ4Ø…’÷M;)C%vµ nïü©I(Ÿ¨©«’#…&¼‚0÷íšu̸í&ÕŸƒ¯ù.ïkXp±“#¡r׃EÂùD,cöH¼ÿØp²“Mf°¹7psv­&Á“˜zâY¶¦¯vAýzá¥NCoÙ9ε³'/<6S>îëúÙ!¬¿’_4åªñ ðIˆ9+húÞxŸÖ¦—˜ÄŒAÍSÁ ïM&¬¥%‰ûŸkMQárhO^3Ë-“*å ä´<_£ê±B>™Nö©¾@TAYršÂ±vc§#oûjz3ÄçÂÎ`ž`¾:ÃJ{‡c1ÀÉ> t7K!„¡þÄèm ‰»]Bí«ä¼oÕ?XS+†©b¶oxiª5â}ª3ÃÉ3é}€áš zï?…ó'ḵ2¢›µˆNJ·£T{=ñÎTž2ŸÖ]x¢éÔW¥²±³¢Tåc›Òh¢¢px;¦òþ£¥Cžëùö¹²5콌¬ØÔÏáö²4ZÜïŠÁ#¸t3ºçk½’»ïEÌüFëK¥KaGÃvâ•í,¶ì‰‚nó„Wú®Ã¯¨õÚ£O ÷H•§çÎÞÔÏñ- 8eS‡ªÉ‚‹ñ üãÅaN9 3e0ÊO¢¾záߎóÝ”®PuÂ#Ç›iÛwþ„uéúX.~ø±ÑÁÍwÐ2ÍÍNx (¡÷ì'ĘæbÛ­‡ïŽiø¿TÁ ÛíåƒÅ¨ sâE„°ièÐxCö‰8·B ^ÔܱÕ~°o‘æ#§ïÍrí÷Òy…/•i^v;ªp0ÉÔ‹¹fšµ'¼Õ^B&óIµ9"¥¶Ò¼× ué»Ò¯®€]þ¡‚Ç›œÿZèéÑšã “^šü6Ž¿ÌPÿÂÕìÂFv`¢5Øî`Ö[ Ôô×GÒ\-©›è?˜ÂšÊÒ†´6Ìýç“¶‹…xgNXЕ‚¨¡(™ºó–È ~öÂ1)Õ¹§%'¢ð Õ7ÎYô;©È“ ŠÔ ÌE0ÍΦm¹¶Cô».69›AÉõEv†¢„òE>#W£—â=}TûLÞÇw•æ¡×£Ü™–„ÿÚ+³·¹‹@záMyÅô\Å92ÎM>WˆÌšÕŸíœ’®ÉËÀ m]uýá¯NßüuÞù̶ß–ðKãï,%6BkçY"h¤ ,pÊyQ°RÿÚ|Ã6/§0¥±«½ä"J•U…ëæ2£DóÈ ¶[ÝÚ´)ãÎ,¸¦V Ó­füB3ü‡†=í(Gžÿ¤t×”iø‰*ã(ö÷¦ •ÒÙ –Èêî‘leóÌÛDoùg”üŠCFZã4ùô,C:A ¡uwÒËšÿ¦ëu@7n˪DeZŒ¢äÂ.סd}cûÛ‡T!Y)ûüNHO F8I˧ÅDÌŸÞúóš˜àz®YÒÑçZÝævÌ9¡“ÞƒVÞÓò´)œÿƒ­v Jk[–ïg tâ/5kg)ÎãOìŽH<ƒ›9v•0-s¡!Ïï‘`Ç]×]^I†ÂŠêkZP¿#2(1“Û¬û _’Lë!ÂA•Sz u3>™;ѹÌÓèÌkYg\=êýcû,|“ÐiÁªÜ\‹âò®í}‘îcY˜TÝ‚‘M߆:)7Ùx¦®,nV×GæR«^N[T”_‡tžxù·GAQjÃ)¥j7‚cMÞíêÈ•[k0ד±®² õ.jLh‘‡ß9ÈA{ÚÝÊd”Žª*&Ò†TæÕÔwabLDKw³Ùô4ö(kr;óšo½{DúEÙ¥ðß´#úƒ™Õ¢[‘Tè¾PP)ÅVÜûn*[Ÿéäžf`·X73 )à oÁ±$]y º+EºÑkžº!‹ú«aÖ$Æ´c"'»ô^ r`žp§ÏÔ+rÇnËÌÿËü/õÌÿ¿€ùÿ ŒmL \ìm ¬^N¦Î.öN¦>–f€ÿ¼0«Iendstream endobj 4 0 obj<>endobj 5 0 obj[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602]endobj 6 0 obj<>stream x¤¹uTÕÛó>NIKƒ Ä‘F…áA:éé:À¡»Kº»AºARî.i¥‘îîüïýÜ‹ú¾|×ú-×RgïÙ³gÏ<ó̼€ê¹¬½€¾….XÔÂÜ–ÄÀȲ0·°±ÔÑÓËèšB¬ìÀˆ•ŠJØBÏÎ ln«`gii ë˃m,ì¬õÀ6\èéÿ==£±5ÿ‡MT*e°µ ÄœëëBÖ`[è‚°Ž-ô€¢‘@FÏÀÄ1r±2r1LŒŒ?ÝøKÑš `1£R YX:YC l¹ÿþ@«G÷S ë„ØÚØB›½ˆ›ë1LMò?Ø /[Ûƒõ~3ë(ÛôŒtÌ Á6k0b°´ƒ†C oa¦1GE¥ˆÍÁÖPoõÞò3~¢Ö†à¿Ü1‚8´F¶¶–\@àÏàüÜb°1`0Ûé ¯1ײ0ûNTÔŸ‡…!Ö`=[ k'àÿ&ÀÄÜÂÁÜå?6 æúÅ^ßΨdþ3[‿աK¨k†`[ ˆ™™…¶€õŒ€?¯Ut²~n‚~.ë˜ë»¹XZX tLmÀn0ôT{0ÀÖÚìæòëÆï*Ї@s¦ 6„èÁ:tlð·,¥ck q¨12022²pp0q€Œ?ÿü!k@ó¥oanêôpTZÇ øük[PÐÂàBÏÄÌ  12³@¬ &ˆ‘àö»¹õO@þ²! Mëßá`|¸UÜÜÀðÏàý¿Ç€öÃ@û³8è¿]J[ØBôÀÚDª3²2êAÿú ÆÿϸTg1ý? ñ§Ú>Pýÿª†ÿ§EíLMÿÊ í¿˜üiüáTWÇ bêô‡öÿh½ÿ¬L­ ……ÉÿlŠ*ü…Ö¿ÓŠÛê@ RÀÜÐ Íøß(!6¢G°¾,ÄVÏè/Ìþ•L´ôÁÖ¦s°¬… ä'Ñè™@Ìn*AôLÌÁ66Ë?ulô e …+Û_ê`sýßó 1׳Ї˜˜ *:ÖÖ:N¨PPCSÍÊ pþ ­R°ã_52˜[ØBñ¥[7(oZ£þD3ð/Êý¹ú÷3Z¢¦:f+,@+; (Ûèš>¬±ÍíÌtBÑð'AýßY6 ¾…©©Žõà ;Ð ejè+þUâê˜Am %ÿ°Èù÷6з@ƒú. #ÐJ‚æ¦`ƒ, ¿ÿâÞU& Ž-Øbcò°Æ ´4µ³yY€zPêÓyX`9YžÀÂöÓaˆÅƒk,ì@S£‡C@g°µÅƒÌ ´0ð™•hëð°Ë ÚYƒÙg‚ò²ÝCˆX™(ËýófV  ”©þY6`û_  ØƒÀ|ó 0ŠăÀ |û °%v ÔƒÀ”~82ÿ Œ@Ù”{˜€ò3PáA`*>¬@¥ ¨ü °ß=@•øþ_“¨ú €€ºÖ:z&`è8óKp2u¡«¿#““ùÝßkƒš#=Db ¤L³í~r“žtÐø'¡œlмÿl»ÿ.°*†“¨û°Ã ÔûW12ª:‡L€¡ ÿE“hø‹Ä|(.hÓB~Ùcÿ"±ŠÄÈ|@+ˆ‘øð2ˆø€|(Hˆ hù`Åô/ ðî ´ö~Ùc>bÚý²Ç´ÿEâ:³CÊ’¿Ä›Úñ =êÚ/ÄÎñ³)ØØýÕ[~É%;çßÝáw 4¤£ggû‹eÐìÈq@a¬c­­UË_ʇÚòþê_?ø»ÿÐ|õ¡áy¨fëÏÞõ·³ýŒ°”5ì~N.Aà`ñäàøi ÚC¬í Ž¿Ú£‘Žé/e¸¿šâÿ)ÿ’pNп-æwLB Oàw^AéNàA™Nào–30…>ÿæŽÚ—þ( (Ï ü/à8ÙÖ¿ÁÊx"¿Xâ ýFèPäw瘠ü'ò»sLPù瘙"ÿã # PüO›¬@ñ?m²ÅÿÓ&;Pü?lrElÐÂ%MéßÃýjÊüq-”>eþ¸Ê¡2ÿu-”Meþ4È”ù_O Ôjfgj ±„~iý“%&Pæ÷ŽÆ¥Y¥?Ýá*ýé'Pé¿ÜR¯ÒÿÞ ¥à÷`b*YX?дG­Í Cª®é>™ dü³ä~iLP>ÖùÓ”‹ÿÓh+ý#¤›ËŒ>ɉ¬w§ò7K©¯6)ŒÅ0GUhXhµã¢Éƒ#×Y;™ü&Â>Dz¶c\¦Ò_+É Uk‚Kûe.ðœÑ¥˜léÊ«?rú.áÄ«;xXßú5ÜëÙêSãd™ÃV&I‚¸d>g`˜±™®ù®L€åõVñü Yã×zv¬Qe—9“¤›]¼š&ƒa2e¼ý±êxT€ás2w©žMf‘Úˆ&Ö½ËHK%³G™ê÷‰KØrÝ­üövøQ¤s|YµA*×#’ O«KîEüGê²E_ çÞ¢BÕXÎp#ðf½»lzG÷ÔSA˜æø©«.‹ü5ìk¤À)×´f¸% pÙ‚o¢…'‡Mh1µ‹3òŸ>gëúnìgšðT"¨‘%à.ƒ³’{¥mĵ‰¥“q÷BÑá‚€*9}Ÿ¤Ÿ¶â4–°,•2žL´ºÐšºöz«¿LÏȳŸÍ¥ õ«˜áRÁf£<ç8Nˆâùx{ŠV¥·P°„Mr{Þ“‘å‹ü!çŽkÇ;ÐÍ‚W;ƒ¤odû7¤µ¡/pm£Xº®JáåœX>ì5›SÉ@_¦sC”çœO‘êŸF?:cظü±E(|_Ü ÐT¤QñyúÁa]C‡H­³àTŸÎ]’­wìœqdg! +®ãõšÉmm‰²×•ÚãCjU{ö„¾-gGßZÞ™aâpö;Õ‚¥ÖËüï]¹7H®zíèÞé¼»_òI¬Phž¬¡ÂO}Û¢S]æw¹"o3=ùf”,Ú/~?ØÁ÷ú´2;UÃãÂDаƓ ;ñ ð%Vc™O‘ì>}ú[¤ë¤D}ѥî(Ž[ÃM¹“{Mò°k¶q©0²Wwqo-÷;u6¾|2âþÜÊ]¦,CÝy }¼i2Rr{xfaT¿LZk`Oucá’9{½‘‚Ïêú®øIú o—/CtÜÂÄ·BÿéZJ#¤ä%3æ;rn:wÖp· 2ä¾MϤ3ßëçÊVÒî©ßà ¿úíR1+‹•S„ƒ'¾ö„¼ÈÔΧríü¦R?Šƒ óÚÆ€%ËQƒiÙ3áo¦¯ëßd —Öñ:ž‰ÁF¾x#rg¬å˜)y:H‡â±„ÅÔy_)ƒå!Wù½çÍs˜;EŒ'_bˆnP{âLûoÎ)òÏŸ—™ö /–¹D-ŒbD7Ãî¢[Ÿq¨ŠËK8Ÿîž©ÜlÙÚݘfáGQ_`n¾4+3œ3>¦ ý’Ã7ñ}8ïÍrËè³ÃŽw¾ÚŸÑ+òàíßçk³åºêÖOe¦‰ÐPäï¯}ÍlWÞ½ì)‰3‹‡–©›Äµ^qÑð/׈!ywDÁ]|šô±½Òîеua§Aì³ÓhÇÙµæì>NŽðŠ´‘ó…\½HxÔãÖøHUÛ¡0Ö­ôl¦ä½ý¾Œ¼(cÌQÕÍ w,ià‰zÎ…Á9$ š±D_Ët°|³R!›:ç,ƒ7 öû4šNò‰túR¶0u3ñó^ßãf8DQ8duÂû#¤ƒXìReìY{rôË+¥z_ ¡÷Uñ»¼L _ÀS%yú>³Ý̾rWé‡õ!Yù´jùaÞ‚øjF¯&{®×ôHt]E 6`ñ84Lä—zh&Ö3[—*_^™óúŽ´›òÆÅëñ‚åñavXDõmô)ý¼ŽØKôÔüµ©j”ÉÒk(ÛéÑ;o%ç’«ð¯Ö·ì_#g‘›çéOˆãºÀú_[P¯³IZ³ÛÂåû+ŽUù@ËDۯʤœ¹ÉNüŠáw7ûs6±OMõTT ×$i­@Îù |˜ÛòrmÂù½Mª)z^—ŸQ†èeˆJnÇñ]™Œ…vh®|8C´¢œ”*ªÝ×ÌoûÎÛ¸#×´Ï ô«/¾Û{JãÚ}•ø^(²Îìžñ&mK Cå8‘ÅPSÅ>¡ÔëS0¨—QÙF÷3lÇ‹¼ÚÏw½Â¼I§×¼‰I1»È¡ñýØk±j½«:©Ëo3vs{Ÿ»Ÿj(Ö…ù©×ôâÒùe‡®‡}¤•Döí©þXÖ/¦Œù=¼ §"%raÄÛ>=‰Pz4Á`VâITt΋g9oÖ.„’™Œ €éCÆ»véZYIÖ_u(/`Mõü©Ë'ÁêÅ 8Œ+xqÙÞ† W:ðfÐ"€6<) „;†EJ"q½„ðYxŒ¿‘«øMQ3²©<*>´ÝĤ´â_М{]ž4â:I„ã¦my¢™Zóo L^÷fV¯Ê˜êl¤|vù¾©S\˪Šó™ÒOØÎùò[yÇÁJ_þRð2Ï·çÈLÈßô½j›DžÊ PŸN'QâN…÷%ßÐýÈ7‚µÞ9æ¶&ü7)ìQ-/({çM&¥…ñ½x´lscVßi ^W땆°O¬ô÷ËÏß$ûPäbÛï§Ï¼­¼ ÃLÇNIJÓ†XAVA< ÃÓ`Ûƒe&’’' 'ì'„ò¼ž®<ž=¨²ï ?ìrÏKg”>aŒ¶zÉg?m3|§¿dÓÁø1ù´9«y°õ[3!ãè+·[§~žˆ:Jl6î€jMÛÏ|Ôî¶ÁÞ2el‘wFSÂÊd$ÛÄ™±+‚]Ûm¶ÕSéãm ]ú°© ñç9†ÞÔ.M±ìœ¯&-¶qüÕNX’T‘`–4,3ÀÝE«§'‚nMŠ!ñ°KèKÞÊb¡÷9!Œ7Èä!“Ç]eŒ6F¯;‰,xè:x=/ͤ—ç•™<8øQ‚òfI‘Æ©ñî,žå!#:°¨CTÅß6㣇ÉDnMšs8*÷£$èsfÃgnQ†Í‘ÀdGÔξ!eû¡´Ýg¥&Ç“ø”H1XÀ޳Rù±{×ü–ÍÖ™]ïc•øÜé…EDæAo. ÎI55)ÛÍ£Vìw£PÇhVŒÞð!ÏŸF(¾"¢¾7‚ݬ¶ñåPjT½=LÏ-~þŒƒ&ܹq[Å|õVs ×kﻡ[Г¨ Ël#œÙº \§‰Õ/Üãܦ•+b+i¬_\Ú6£èhM^èYx·šìœmè-±ˆÏ †/`j…Í« À‚j ªÔMê|i[-­·Ò è}Uy5Þæ“R`ì7¾`¿ ÇM~tL¬ÌX­ç²»”>âgj²·O”OÙ©/9ñOjA5àTI¤É苤 –»Ç'çí•©ç&ÖÑ!y´š:Õ„ØÒ;à "žŽþ:ö\6ÛÆ)aSÂ{v3Pñ^;A8¿$…®Êôi1ǸV–*OÍòµNHI;Ãåæj†pƒ³›¼-´ä¯¨xn×ÔîH¹Ö¥Œ 1ÓýíéRQ§ŸX,«/6XÇõØ¡iRž%¡Šwi9Ç\Ijqï³âœ{5¡k=Ïõ·° ÀìÊ|ô™B·K…;¤ RŸçö\¢ÉpÚ%ø•Þi™Iç7:©ok¾>cÍôWiqá_W•Ìå¿¥"aLp_h­Úž¾Š]{ÖÃ3¢Z%VF¤LjñÖgœ|Þì0þ5•5Œq zëa* EàMøÁÛYõ&¹%ˆ ON¥ ¾/ÓÕTX| séJÓ^HŽ£ÆìG÷¡/¤ïËp|ã}õ¢7+ÒĘà.<nÿb1äƒþdóü©;Ëñ>‹uÂæ| ZG›Ê)y~7÷yH?—÷·Lœ’Vqë²­Rۧ݉–/kÞꛜ_f¼0£!°pîý’9YHMÃLìÚ+‰€b±wîgÃâåç¹B±LÄ,ød^á˜~êÎFÁ U1z»¥ŠØúáñݶDÆ„þƒ×Ó7ôÓ¥{ÖJ¾~qÒ¥gyìûõEÑ}N9¡Ñ¶Â6cÌöüÃO•.æ\‡L$IýE3‚ŸðzسÐ_§d»nQ;Š,Lݪ>"¯—m@ë›s`܈N7¢q”̵[âZ>Ø*]Üs?ûAA©öZYâ¢GÅjç}x™ µtòœ‰‹o2îóž>Žxó‚×V7Ïc/.µ––rÈ)$ 'Êf€C2èIÓìÛìeŸ&7]Ümñûõ„ë%Gß3áG}úUG­–5/[ÅÈÞ÷ìí„|E!¥Q ]ŽàRœzniyÆ3„ô,×´šzjCÜí("O>.Ðâ™A-XGÝ‹™˜Ñäj#¬9âžË&ñ½ÞZ9;\¯ÙzÞÉ0`|<#aýàDe Ø™›:;+Œ~ a2åÚûZb7!ð^ÓÓ|®‰•bïéœõO¶q«£8Hé¼úK4»ÈÒñÑ1BʆJ9Æ“‹6¶ ±« W^Ý„ÖLxs¼=‰ ±ðì Ê‚UÁ±Ñϲ+»{(I¹ÑIŒ(4ŽW¼^¨½ë¾kñjN'aFùt4Ý”®ƒYÔ Q&_Ïh·ªÜ‘%‘ÏX¨•è‘fÌN0lº©Jwë”Æ‘Ñ™$Ðm¾ C¡ihcñ–&¼˽×ñ½hÝ+æÂ–± øä'ÃEP+͵²h†[M„zœiK3_¤ùU»íâ´'‡rp¡³hƒ°à5¤áéy‘†éˆCçúFu©’qfµ¬m“ˆüL±²~õ–Ì» ?ràä²U{÷“É2a¦ÞÞ9µù„+åíÛW½6E:ØFÌN ~ï«cç»BUšnNdÒ0åixCL¾Û›œT˜‹}ÌÄ×C(§ ñì sŽC©gù„Ô£ÿ‰*”i|ÜÅôiìø[\-Týîâ¹Qz¹ÇƒŒ9zø1ŸG`D5“c•ël‡˜;ÀÑ£âð™O‹Öª1q%:Ê0e]}Z{ŸR*tü•sœÝ>óQ5œŒY? Kj{Ì- šCcÏ9l^íŽ?W û®Òxé䎱A‚ûÅ#~¯ð˳ËáÉ)ÜYdábUíMÚÑ5õEŒ.Âí$_›vÀ5†7iW§™^ î(<54 pkl ‚À¢l˜!O‰¡%IÙaÃfz‘¾ñT3Ã0{}Ï|ß‘(*òéåûÈ€JDñOÒÇâµ,›©<ö®±3ü‚ÌTiWj'ƒžÉÒȧ ß^½¢ü",®¢lM)@›­zÌåÕŒýõ-ÿK&z·Q¬|5ÚA¦™†º‘(¤X¼]ùDm?[·Ý »‘5¯²zÏÓôFbg µ ÝÙ÷™ÙT¢q ?¯± #G˜ÚǯþþO»"¥†0œÛÞr lin„PM’*Šî¤:<†DõiÜ-R«]<ߺ|=Ñb4’~ýA<©çМÚN¢þ˜p•ö[ù+ôeù•kÃŒ³™RÄÞ=uT„êm»Ìus,Ù¯B0ÖÏ0qÑ7q:A³èrÐPèåª|Œîü8<§ë£T½édøõ4àj7^•[akúhnA½Ö®ÑIŠ †f¼ÊÈ‹Oˆž?Z𔨇^°Ý¼I‘ý>v£ŽºÔù>’:˜ÑŒâirùƇ( u_‰EA.=³Ç NÈݳ¾Á¢ÍcŸZt¬qÃl± Ú3;½Ta¦R62#ôç/¯eån}à{k:këó¨è‹wërÔ ÐÒ ]'@> "ãgûtÄ\Dc²±ÝùJà3Ò¸á01r£ú±ÉÞO,wÃ…Ìf]³¡Ú”¬b€h&»+)ŒÒí†*`].š½l>Ôj /‰L¿ðQU0ÄE¢¦ˆDc«$vO3m´WœOÓí®ŒålT$1›,¡Ü•B®sŠî”/òH?{ŠÃc›´œÁ/D·¯G¢¥þ€Ê„¿†´ÔN}ñòĄ̈s2£‹òøô‘Jí|<_ô˜IˆÏýóõ¥’7WŸßåǃëT%>²Ž$m•—2øÇôšl%rÁ·öµ ÆO©Óº¹àY’\ì;ñÑXe ±¬#I£À ð Óñ áÇ&Ô)C¿ÓöŽëKX¦>͉í`P¬±>2Œ“uÔQSDx³¿Ä± ey(I¡ð–½ŒÄ*p¡º‚Ô‘Åö³ýa»S$…ñ¤~é¼×¥SÖî¼3¨LóEçØ…DˆÑ‹ýD Z— U–ÚªQKᇢg½+iÛme#1f†Œúú˜:˜Ýº;Í*"zt-gƒc*ò‘Ô‹¡É‘yêçÛßõ JÐ9Hý¡?Ù"3c=Öæ:ÂéÄ3Ä©@¢ÉîãÈ4z«_GLøc!N8tWÞݽ6C™BmÚËZ§©k±´sRxŽãmne}fê%ßV[©²Wá°dþ]¯F/~²1ul%}qYªýûþ4kâ¬t1l=ªuKðHQÀåwÍ7´VQB“4šÊ¼BiVºhËÜGšÓþ3Á$húÌê¬AÓ+Sñc»òÜ ÿœÇ¤´î0J´Â³Çnxʬœ>HÆË/Ú¬WÊb­ò÷Æš^, qù4“Àù3Õ‰µÈŠÉdKÙZT4tgˆ¦D‰. QÕ(^=­5ÚÔ¥]êwdÙ€5’šÁS¢³Íäí#WÜiF¤,[t¸Ô©¨ÿÑ,žçn+£ n7Þ†yqEN2†­Ùwù[&œ–\ž{%´›ôôÞ¥%ù°}>öµŠ«[ý½‹¤Ed‡GÌ3þ¦÷Ÿ¼Œ×”¹$= yë² ÒuGbu—¦W¼{1ãÍ%Ù$Úx“†ÙÔÇŒWZO|$ÒŠ!rxŸYëóqq îÈ^ä.Ô$ïüšÄÓß·QñÌ'Z Ã9{??ûž7ÜÝ\ÑzDgK°Vÿ$Oör•^½’[ç\€ƒ\‰fÍíócw›Šþ·;6{‡ˆt›]xs'ä³+ÕgR7ÒÜo PS‰¼Oò¥¥+'vó~äÚ˜%|w”}¡0 •–’øøx´À†ußEãžþéíWó¯MõäÊ#¸Æ…rÁµÖ0í27÷lxþh_Áœ-xV‰J­ü+´èH{Õñ`ßÅ’öC‡³ àM ýxqb–eå—oˆÛÏÆL¸V'ˆc¼î?åÏÚù8iúÅ}H?XÞŒ|¹EPˆÿÞÅ“tõÙÛñëØGñ\½ûsú‹‹ôþÛ •À#ÆÎÂ×T'Óø0³ðp°(Ê€¼sÞ§ÎÑaï|ZáÑÆE€u4ÅøzÍuD‚î &AˆõE:ì30ròŒ1bxÂÜãfá “#£¨Ÿ/\2¹‹nÜ¡,æ&°h°ÈÉ‚U”æm¤$7¼Áœ´n9Öüm–V:/whœû&²ük6|¸Ï5›8YcyÞA¤as{ϧ×RÅñuf«‡`•3!:¦4묈~T¹³Âáœ2Ò¤¼šµ´l½* ‰5ØAy$8áÌꙜ Ø‘xfv²¨hÓ…ÏÇZnÅ ‹/øá-2`03Œª?£ŒÈïN4E ôÿÀÀÈhµ÷_ľÏؘšv³Ûs@´bº˜Éž®Y5T žøB¿Ie˜Akó ¶ZÄYu‹ñ©“?[á…—úáß8YÇ9¹¿Gyï2Ÿ½NjáëâÙVÙðcˆÉ_‹½Ä’FÓú÷¥ÏzyçWZV$XŽÞ~ÁäÈ*"ä±t“qLR g&¦¨¤C½ÑApUÌÇk˜:÷;ƒ_’„Ý &õu@påõ­—òÃqbpg"â!/ÈÂêˆÂ+‚w²–+`Õü´'£<ÿ ÐRâÌiÿcÅã‚üÒì¶‚çwxwMåG•±èaïà›;W#…lÉoœ­œÜi­o§îi÷k–Ðzߌo®ÿ0Ý2ÛýQîŽ.}¸I½Á9ßÉzÏ­˃LùÞÁ`øÙDRà§ÜC¯íl|÷£;« €! ,WÕg×û,VÑ\û…s†®‘t)/;äGËa% Ÿ¢U˜k˜oµ.r‚TaßáëºÛ.úš‘ù(±§1x)i {öùKÕ=FüáÍå‰ïòE=S:ö‰Êó;§ÇЇšîó 0tX««ž¦*N4±‰ÒRd¸˜³¹ü‹·µÃ9ˆa øáëv¥ôèn‘lÈî0‹.†¥=÷fßoS†v²Šy&B/%áéÊya›Í³ßOàÅc@Îd.ŠÕ HÝ(ô¢_cRÀÒ­…òÈ Äø,ͬWŸ^t索G—~åPGÁz>ç´i‰å³£N¯êA;çŠ6Ù‹=ð‰r€‘G Ý4IBE^lb{Õ¹…Ô-Œ‹Cªä ¼Uñ‡1xÊÆ>—Ïò錷wÕb´™šÅ'Eq¹¶)ooÍΟñêM¨P•x²Ã~ëÄ5Dyv¿2=BojœAày)ðò†*=¤žð6½ÄSIª™~å r!º¥ÍÁP'X=Æuf­¶|9xC('¿ÄP&Y–p ÖŽ0_óª¼$䚦ÒhJÕÚÎJ7@ ¡AÂvÖ}àëˆ}à»ú§‡e€g¼¤b ´Gƒ-˜€4ERwñ%G!§))C;‹ý¹Ð ô™(øÄó dþ«â˜L¶F‚¦Ú.ïìSwòÅ®.nTnƒëŽ€9î~¢>1ÒA´@5}IÖžaäu¸kÎKÒñIæV9*âi¯ò`¥)ǵ¼é[ )Åøý¤’¤Ž—U›Æ~Œvf£ûOíè kg‰G BÒ,wzÝBÉ¢P5§kPº›>!Ô,¶S›SÃÞÌê|aD¢“yb‘Ó¹ÉoW VÔ¦’ŒP1kìñ‚RÜnÛuמ-÷¹±ëö²äÊ£‘¶úÙã±Çhà"¾(V—¤S}% [.v”TCJDÉÁÙ´þv•/Vaз½×Þü‚ÖÄÊ$ØÜÚIy$dOŸ 6ÁGJ(¡l©¥\8rå´ÄÆV'úe³µ#eFŸíáÄ|Ô¬© q,0¦")pdöŽ^îMBúp{éês*ÔÌ)Täávì7.Yôy$ezäÃÌÀie gîÞ%dÐrÏ«Í<Õ —é"§¦d ìœî‘oÆë_ý¾&ŒX¨"âËgD`˜#´&¥å',…ÞÚqWvJŒÖtdÛMeàûìv"ïDÂÒöÍš€>0Qæå4xh"ï?2Â+sÑ¡û’~QpžùznK¢‚F´úS²Óç!å9ÁE°m§pLlö»\]…¾0Ánx åŠJ¬*؇wÁõ«S¬,ÙÑzȈΦ$žg™þÄÓP6á…ûÜ«rG9Þ–Cë·”•GO¨Äž.‚îÃð±R ¢¦0nw/œLV[õ©~üà$ðl£Ct)èJ™ ¹Â±Išëîe¨º_­ˆó•ßtö2Ñi4æg6йë ÷ù(eåeAgqµ?r‹RòW],ƒç8Û¥©ºƒÛAFš×#MøÏd^õil×¢i*ÝõÒÖ_·;ç%½/QÝÆéc²Çl»¾ËAžÛ‚S·FcŠÂ½ˆ ¤MNL^×Ô¼~|z&O3‹³™ìöð1s >]—àùzÿ,•ôS“*9u€hÿ;ñŠqý®/ÜŸ¸§†k³ áp(Ð 6²žûÖ»MËù 4´fŸª)dïÌ>!{Æ! =ûnÍùe­çÝë‰èëŒÝW‚Â|Ú[ÎZ'Ž8–ÍßaO=ó:Ÿ‚KûæÇ°ÖŽÒî5ô‰i‘j¤4DúÔʬÏyUmô}‰ÝöOiZ¤ù­PX-û½ô(ìà%$þn¥žŠ7«óðvb=© Hxr¹Jó}ö˜;9± ÜPgÔä‹EúÂEgÆ€óHNa4sP7euvoUßBó9aÎ{n¹{Ñà†£Õug|’©i ówàEµO¡X“/)‚«l'ÁùCN#VU\quÛJ]œ^¿p´ÅOcÆÁ¦¼©†ÿ„pñÁÃØBS9ÈAEv~ך‘ñ}9{=N¬ç·X–ùA3ϧ¹€À}ãw<›æ(*JôKxË:ªŒ&NÁfF ©æwB–ÊR6>˜gË©OŽÞ 2dËßÀžQê¯óåÁèý¯¹ÙgÖ'ìy#{…Tu÷M>l€BíûX¦d.³WÙ\ßt··ÏÈjî¢è2XÓÔ¯bh7Ü>‡Í!µSòk­3;î* õ)f²‘m’.õ³O$œÅÕy0ØYiߺçR¶§Á×òÔGÖsšbÈ,gØä`¡·©’rª„(Ÿ¯£ænžê’¾Mã¢jÙ}øHúdz]Ÿd‚ÓçIxÃ’¶E ḩ¼i™§”%|/;?ccϺ»4¢”Š–×R©S_ìy³²RùN´ÆO7µ.§©"€Ä cÚØˆ;»@zgæÙ°€Æ#¿á.C6;þÎGêÚÑwSR[óº6QÆ~<ÄÉ¢Ïö·¥b4ä“N›Åߨä¬.¦7?{’ q>Rå¥K$ɘwZ ãÔ)rÍN!õºy_Þb’¼Q#ÇqÿñÈ åÔR{>‚vW§|·;&bpû›#‰npé+EÌîÏŽ¯ËíÙãªÙ‘dq¿Q_ïgŸëF¥ "i¼ªZö7á T©.B@ß!±ê±„cs´ûÆLÍ—â×,O=¯<üÑ,]ŽØÍJ:‘Élv–ëH7ÃÛe;h‘§Uç G.‹÷þ:ÏÎÿ ÓùtaOX+Õ›A,†.þ¹ƒ™>—Pì(Y„²o]‡<Ù£åöÕFÞË6º>ˆZ,SG®„³Tª}G¸…Ô{Øþ©éí1Hdewn¯Ô95.¹Z»$²Ìwƒ‰s—ª°V_°¢<]7ä¤<¶p.©ýPëÌ{ŒÃ­ù¨ôÌuf`‘]±ÙÔèkæ7f®Éd.¦¸÷®ÁöLLE";=½p y0x¾ã©zX·UÓcë{ŸÕÖØX^½%Å^ŒQÓØÖ# [³¿û2ÆAž»ƒýƒôca<ÿFáЧßïM¾nüJÓmAÅ1ò/ð»ù8ɘOÁ´u*YYóN2R‹K³(G¯î[×ù˼À‡˜?>á%“H´ ˜˜[Ž{’,¹˜£ÔÞ\÷:â½@تaǬ1>Yjc8Œn@î××~ß´h:—â-ðÆ×R‡Lð[‹2F¥âUv´· ŸO(™Rçs¿†áó¡>O R=ÞSêÓ‚ð‡B¾”Ãßùs7nèæwT¸;„J•ŸÆu8™°Ïe¯=q’5îÒ²nâmkîŽUŽd÷<X2W 8Ë1Qš®KvIJõl¿'á£QJó†# ò‰?}îr<ºèsccÕ ÷}MôªKà“šŠÒà?*µw®Ès’©â/È–ÃÀφïέU¿Ù#°óÅÅÑZ&jYÁžná§Nxï·“ {•Îì†;©‘€óX§»I®6|§-¥é:²l“•z$å6r+YË ¸dE¾ôO ’–U6ŸL®°jß¾þ¤´}Uˆ‘\®5Zïò¼NNçi³ø1„<ÈÞN• û ú÷”cG i·óeGƒ7’+oÁHeœË,Ÿï˜õm†§§ÞÏ—ø §ú3|FœÝ(œcM¿ xdòÜg´Ì‘Ê6 úZ'aäûUÊg o>={¾QñX žø¥$áhËê´§(_HV5Jçë©`N¡„UÄïË2ˆì]–/MŠ ?™`H×ÁÙO`dx7¶áÆÔýt<–+$âš6Ëò“{‚ÚZRõˆç¬Û£xËùî…D­sÊL»¡ ªZ¦—©•°sî¹Hr4i©ùÑÌË1ï˜yo´Šðõ`x0ìa1)s–°Ú”ûéÏ„Rúo„ÄÜ©~¨ÝVfR64,Kß#@³¬Ta~ÜŽ!.lJ—ô9²+Wb ûÔ?+ï¼ñ5Àt˜ex§7J¦÷ ãKÞ—Æ)étU•žVÖ€ ø#°³>çmrsU?öðôd DfÖr]¾í_RvÀµñT©Ãˆ)¤J½Æ#'(ù’‡3äã*ê‰õLæ½°ŽG LfMïåúŠÅuÑ¿[`ðÀÇÀnYJy?q‰P±®$ùòó3–Õ 9áÜÍÉ„'À¶ï³â(Á (ޓ־ÓÏ͸¾®Wßj|w^öКwÎQȇ¬Æ404e.ÍiÚz|ÅtÃýpùãù¦ ¶ˆ…çsÕ®€b×ë¢)õéJÕcüÎÞ½\£ ß“¹ì#%ùg°B^DXž$N3NÎÏÜŠJ±¾T@«_R’){s_û#›ySôCNíÌ‹Lßõé7­ÍÎ뉩ªŽSEµ¹Áã¹HÊ­¼#ñšÏ‘ÎFndúo¨ÖBGW¹tyðk•@‡s¶/Îß`'óŸ­¬ÃÏÿð5)®¿7¤?}Ãä{\E?û¨][‚Áu*pn¦¡f4üõ ñ„êUÆ€]eÚɪ´ºéuì¸AïS¦”ä¸$µt“\ç"î·ÓŽ™v]Òô^Ç6»_pŃ î¨Ó:lŒh'TŠÒVüKù dÚ=}/ça™رŽrè ú2Cg4¹ò6…e>„–ó–¬P+ò|âv–ã¹whõUšV¨|Ð`•èò*ÕïCL)ûG"0Óè`˜Àó§*oí´ç븗ø ¬Bé43°u9d`òh¶Þº¯É»}[¨?³øÌþ‚µ˜Wïlñu‰§°úfâò¾ƒ»#]øõŠÛ}b ê‘:=ãÝÁ< •=ä³Lìïìè7Ž”ÔÞípër?‚÷ h1 ¢ÑAÏoÀм“ÉN-[òßPJDKñ΀ÏÀBS%n Bb,Ž w}‹/ T Vrø…JÞ^ß`O-Q#6NÎ]pžê¾Ëà žÙâk_f­%h?9öÖJ¢ÿ©X¦ø4»³y/³¯JtŠM-šeʵäÚMŒËáFø“#T"©9v°{¨Z;™î[ˆ}:’§Þ½¥Ë§}Î'^]h}¢O¢Òô±GYŸ}=s]iB•óJÎ]-Zµ½æá ¥U)vñ?ÞŒ%Ãüd…øØwîõýé#‡@¦Ñî¡¥FPFì°ï-Uˆq ÙŸpg…/C=¨N‰¼Ô±i®¾“ÁSJcb;9_¢¶"I¡1(o¶x+B–²/À»ªz"G»¬öYnRQÜô°§­)·WËáqTئ1yaäØÁÚ1n=Ó<‡Î°ŠÌkÖù¹ö½_W„SFu¸þÜl'aáãÔ&rSž)Ñ„P€,NÛEQq@#™W2Ÿu,•ßû¥6kùkŒ/<‹k¯ZîhÂJÕ6>… kK²«âYQ(xÅçÔ :”ˆlÿÐ…‡«¡ ‰þ5ݨÿÜÔ{v÷Ì¡tŸð$šç<¶wso"RczüŒ¿Ùn6rÈa峸%7YÓwC[-ÃÞ†7½þ 5cïmÞ Ï$8goìö0±}Ó¡°¤=+ 2H‡‡¼¢´ 'N{‹`„‡ºS²ÛÑà§zŒ#,÷év›Ç‹-”¾¡óǦ†p _®Q%Œpæf|ЇÇÒ—±â0àÙÛ=M©B¹Q Üm/BrÌ~2L¦‰ªVM+U™m5`ÌÉ[/=.ïù+IF,É50ês…A˜I¶ü£[º/e|¢U$»íÕ3¼ Òø…hÌæ_iùî3ÑÖf†•k”É0>MXDÂ*V¿¾N~™Ø¨º‹Å³ÆÆòôK/%¬.mË܇؉üš=bá˜7*Ž’po×z®‡9[3 ºpûÔ·ª;UP1„‹{m 9þ3o!+›Ù~gùêš ”¥Ç£nËcÂfe_eš4» ÜÓ}t† ŽœvŠð<1QH’õÐq.|4¬ªD\åDx\*Ä ë¿l¯ôæd5‹ 5¶çñdÉ3ê—hÞ‘Yþ _ë^ Ûâm×b§’ž/Ø8W¢8e¡1ô÷l  ßÄ4—ß2Öm/ó eÈqK@ÛÑRä©è–OI`‚Ò¯œ#+‰z2þcùµæVVøÛ1»¬ÈPª2Yêû}ÿbª"%éu‰½1ŠÏ%z˜¸€øˆ´DùÛ¨EZØbsA;‚=GÖAž%~6ÞØßÀVg`;ÓW°Ÿd¢Í×Ú< j–ƒsº\ä×s0PJ+†uPaü¸ßŸg4ãåŒÝ*ö7ðàž£|fö¢¯écЯ#›–‰qÌ)¥¼Éô?Nmš{]°üb(­¶¡ŸËmÍ·XÞGÐý—¹F®Ÿ·ˆ|«6,–wõ;Ê}7×Ì÷‹-ìѵ{»9ÕÓÞöë 5ð\kú[ꧯÀZ-/VW» 0…ùl„cM´ÏvíábfZÓÄé+sÆW™†g¦ö>p¢Ðó~ë³àÇÌÞ^Õc)ÏpM .ùbk›}½‡€×½îïN]C#è}(WìšiÅÙ_Ó˜;šé=Ç#ˆ­0Ciù\‘yYyMZéì;î"°iú{¸QúØü¢¿üΪëK¥/扜½/æ­þH¨”R¦í0ûØà®2÷RT3©àÛ|ÞüOɧøÜ×ë^üI¤~>’×>ù¶l5ÀŸ d¼_¬îô€ÐÍ=X^£n!Ó¶AjµÐÒÅø€ð2 ¦Ü"¸lx^âG²Ç›Vg»‚f‡º5¥íq6¢wÖ.Ð~ò ,ñ‚Ù£§¤“âÈÃTëqvÅx–]ÐãbpósÃù|Šöä1â±ïè1>–¸¬ Rùù+Ìõ½î  <¹ßÒTµÑûSû†0 §Þ0†þ:ãn(\ÔNf‹ cÏ:õÅzÈ€“ö0—=‘žy}H$¡p¼=îŽWÃd,¦ð¤Ô‡'U \zü¯P¢ñ°¾e&!\~Ðo¯OkðJûxe_üÍ¥[Nì½Ówr»/(¥pŽ\ú¹ÌƒáÏyæ£ $É7/K˜-+¼6Q‚ýÆo7#¯? K¢{ÈëNpbÁtßø#‰Ú:rªá8D´²TzL%n4^/.iud#?„+ {« ´Ov7÷`¶·ÑIÆF~!Þ¿ Èù¡ï3‡åÉ®_U?/6HжŒSB¦e~6/ñ*+ÈÊÍ AŒÒóþõ•‰Fõ‚cD>3Œª/0ɶŸêsǽ2–­o«‰‹•Qê³Øø6Ü%Ý”ë§[2r¾¥3~í¤5VtTej•×Ih"½¡nû9šÆè‰a]rË‹W׈ZÊJsþkñB ؾƒ„+belÛýÇ4›Otã”ÕÒbX„¤¿‘×')P#…3ò Ë½8õÏ/ Dú\)†¯·Ù'$˜¦èÁ ã]Â[gн{2ä_1µ¥ÄÒ’=n˜~–EéUƒ›ÔA‰Á 3¿˜èSŸÒ6¿´ÕŽÉ¸½û£V›Ñîí,NDˈ°tg÷ˆ:'x¼Â ¨×’AÓìTÁ½¹ ìœJdvoH[²Sœñgi>© Ñ2¡P5w  ·_&vZç >JÝÐzAƾPŒ<^Ʋ£S_3á—Œ°à{‘ÍÎõ¯Z?5Sèa•¿$Y<[Ž{zÅ2èùÖL–ÏC­VÿËÜalÚ­ßJ4¿½mäîwñJº¤NÏg>™V>~¾‰G«}’­¦¸MÞöK¾™5ÍšY÷ÃfÑãÇDáüXƒPøáj+¡«û^Ž—xî;yGή F맸í®<Üz¯«ÉÞH‰¥¡£óáY°l¢*(þãÞF¸c .yö°w<ãþüþ1ßÜtãë‰zv² &,pQ«‹W¿SRÉ''=c)$êǪéj2¯Ø¾t ëïþÆŸÇs‚>¯ßÖr4"‹à>@(¸6‹S÷ΰ÷¦$;~ÿØløPUb*è —!4¡PG{Tß`0ZµÄ-œÎ×Õ&Æ”xÞ}‰¿µ¨#ã4r–¸¯Z"¯j L4Ü[øJ × õtéµ²ùrè#Æã75e(ò/•Ö8pá¸í¹U÷1 %cž„cÞãá!Põ6¾M£ÑOö{­á dÉÚxB,ž¢¾g´)*ÂϲâC„—àbNá¨Û.û$8¼ÿvnó‡Oå6%j_~¡§¦àb—™3pä0kå9+kÄT¦³* $ÅH/‚òˆ:ƒ=l$"cØ-TJlÛÊW †#|Ãéöéé\>u±×î´¤êÙ—¡âÑ€pîÔšæÒ}ZoþBÂ@ ¶êÁD›Åtÿ¹)¯ESóïÛå Ûïxd™ÛyNìéÙ<—èèS Y‚ÉabõU†Pü+ìm˜Aÿ=@¿ùHÄñ\Šë‚œÚ‹æî´ ÷š†«š(Ÿúg¾:BÖÕÒBF•™!p~„ÉÔºD‹×%ÖÝð÷5ɬ¢ÿ|‹u¨Ë+n·]ì¼ÆŠÝ2LÒO™å­ùÝ:AÍ÷N'0=©Œr{)'dE¾`{606Æê)Ž+G‰àÔЪ=¬­§uõÌR ;(š»c!ÑÕ¦óa˜ï“Å€–¸¤©}kI'Š~Aàíœ(lȵØÜ†ÙK[é eÁTÄ28îý‘õ£…¶üÝ'/ž>PÓƒÅ#P›EØ¡fr~€"†¶Ø¨Úqï‡Z6 ÚrÊ·éØ“ g¿jK(”ËÈf½t@èþÔ•–æÐÎmÕÏVÏû+¼Sü½Ÿ+r!§õµ9ª–/tàßÛŠ%¨ÚmbÛ>CÍœ ĸÀ¾üä°­Ä;tR›0½Òp ‡aó¾Èަ¬@Å:ÿ;’eòÕ`ó¹UmŽ:®Tq!y±Ã11Õ*D#goƒî¸Pý2ôà’Ä£´Þ£Ðtµ¼š¥'×⢎©æ pdßù õ±ªâZºhšÄ//ïõRÜ–¿øyÍXwûOKP‚¯m?$)<}44IYºiS…uÖD„ò³o#Û©•—“¬|(ã4wZ€™ÑÊh¶“Ùí1c¾âa¸~‹D: ŠÑ/%Rç… )ò¥5—KðUïs"e+qÍú˜JQ&šèx>½Sa€­s—TêÝHN%ÿ,oÈŸ¶=$ ©è úêR;®HNïW’ˆZÕZ]wô¦dPßšYl‡}ó>ºŽr…g¤Äþ=„Œ|裱V¯ûÌ®Qæhei)ùÐad‹' ;T`Ka°éì÷7õû•’¼|YFo©–9 âOY”:r[ö—5uPqJ/o§ý5émÔù.ÊõŠLÖóÀ^P¢[åç{²…jøÇi½¸ïÌ‚îeºxA8~œÖUýÊWÝg&¹n÷;6¸3biŒYEÇZ¯Û½¡ì¤pQ+~ÊÄÿ£ÃÆj¿°’~v(qQ•AŽËˆArærX¥õ\À­;8X6vÎ+FÔÙ±Føí&5ŽS¯ÒÛ·`ùñ¦[P¿zÍAÁÝe•d¬Þ™ëÜ¡6gbGäU489[-?þ²J-äØ×Bë­Ç΢ƒ­†z9Â$µU¾±YÖäõ刭Ý}9Š×ºSžo‚øª¯Ÿ_tDÞÜ¿ÐT„@߇ p”…Ft’è2â5ýÁªyR·j~s¤Œñë#é¾%¹B²ÊÖFõ'{€üÑÉœã²ìiþZdŽ’ Lqͱˆ“]ÏÄÒaÜÒ’C€§—œW·áÌ»~6'ÝΗŒ è½"¾NÏè¶Ï ˜ÕZ2…Ü($•ïà‚³.rý:‘˜jÌíÅØ2ÇzKU‘uÅ>îa›E€ü9óI—¤ßƒä'þfŒ=‰Äþ"0vø•TŸn[În¹¬gZ¦E¿²Ø"Ë{0Ê j?¹ý«Ç[)R6§òR.K¹«&C5†Ö•ånaÏùp¤††èZM.4ÅÐ 8HÍ.’Vo8áÐÚˆm»ڿ[={KÞÆŒ_æÁާé/TpÊ•ª\ݹ“f2éÝÛÇýÛ†ÔélÎ>ŒW˜t¾íQËäØaÖezå1’Û6ž©0øzœÒý“a×͈@b‡ AIjDZ‘Ç|¯ÝHhjÃGKÛžÔ·>öq“qJ9,K'>‘šÿ§ï¾|i ‚åGÕly¬Ä“[­lO3?µwOè@„ë” ×àA2ô¨H”âçFaÜl§0Pÿ;üª‰YéÉ.«×Dx9ó³.Ï‚æÛ~Ï7»î&ÂzÉ Úþ‘øÙ%4ÚæDÏÃŽ*,T 8h°ájmÛ`°&(©MWÁì"¯Á©÷船csEˆ¶ú{ÒÏÿ[Vùpc<Sˆ\$Œ_ßœ©8g6EãÓ ×ÅVoL÷ÉÆèl™E8jü·-4-“k0n¾ÏäôZlìIG§gA(ûrÁ˜äô"|ùŽ/<Û~zµZá'*9Å&Íß¶j;e‰P\§õî˜Ä¦Ç`D.Î–Žº]å,9t­G×xžª9£E‡@Ùõ][5Ü U|º–a¶X‹7ö1suyaj¸f‰ð¹™ñ÷é^p>or>p²À f@ë´CSÜZ%Ðò…¢[2A½€ÏƒÂ ­¹(ŠàŸ Û¬¡‡g®œ¶ú3~uþŸð¤¿`]þAÞë/-¹<øhÌqUÞQþ˜kчڕ–ÁNŠì öÞîƒÉØÎ¾ôÀÑ=]ZæóƒœùU¦ªæ÷õÞOtø2LÝ¿ð$rºJ49YîÍ7Ö~«;Kœ½àûwìѬ$¢Éý¸ ¯åŒH9ÏLæ·Šs®/Å‚wT¨ï"µúTóåšÝ*ø˜fMè¬Û‰’›woQâANšwðqʃÞñàNôWÇV¢T >Ñdºäº,V–{Ï[¡Bφ@Í‚š• c¿—­9™óµ‘gâ´@º65¶¡e.”ª5ùà ëµ3ëÆLqîz+Lëmš0_c:’)ž—‰‘Ê^ßÛž¬<`%þ¹œ›º+úg`:w¡FL‰ìjwÚä lN"c ;Ö½Óiœ|!dJ$ÕbÛ<,ëÚ½=¢öEŒÔí±ÿo’u÷g¸ÿ8¯]Þ§ý¡ŠÀ‘¾Ú¼|•1™iW*—¬h6óÂOi`­¹M‰Åÿî›3‘Äg ꇸg\äÓÄs㸧PgÉT9çRC Ís¦¢ÈåtX<–ŽFìa&fÜñ0¯,±Û—‹@˜Fs]{)ñø)!|2cž¿Gn[ñ6eð` ÑBº#†ûGíOŠ´«Z‚Ýf)UwrjL0Ù*‰r·-Ã8H{c†ýy„©uX;'õѺ: ‚6í;™ï*ü@ÏŽ¡-‰Š5;3ú±æ8ñ~rè¶­N™¨óH5Õj®yŽi²30ŸúqviÌG6âÖ'=¹#€ ¡¹Ö5:Ò}¸”óÜ£içÊ;`±®ÅÖº›"©/½i¹²ïý'qW®¾#KWž‚Ø)ÐmÀng¤¯6ovÙ2þ÷Û1g0$UnaÝð„ŠM€@}Ýuñ#±UhGÁRƒ¤B†úéTŽIGz84ZÉ”Q"½ôbcÞm¾™ uÂ'”‡¼ªAx3ÅO…H6Í"4o@!Ýt$ÑW²æÜœÖdê½+SR±2lmn‘0n„ÔKyúÊú¼óRBdBÚy^æîZE8éF”54 äÕ?\ÿVتhŸçä]‰tÅÎMÙ`Ф*‡= WØvn}îTL5V^XÓXð«Ç‡•†ÚÜ‹‡Ø#ó«˜_úéœå;‘¢fo9s=CMW*Ï›3_ ’IB¨« ØÐ›5‹Ê$z†ÿrSN÷ŠQPº½º-S]ZFuNÆxÉ &™œÐP`ÁÉ¥ßt!ñqw¹P¼+-Ÿ+ÅÚF¯gª]Þi 6ooÉ䈸‚|$­ä¯…¥ÕÎÈ+í„…ï­«œ¿ z‡šaAëˋۃܙKqDGª]'PsïÖÅBeN0=Oa‚n|P_ÞË\1óEZ.ƒ]3’Ûy²*ܳX"ŒB¶Òqþ¬©Je9t î”-ô± ÆÚ…Ù4ý£{73.aÆj¹^»Ts0Ž?.3ò Ï` .Z*È^ŽƒJH§©ËŠ?Y®ü@ŽÆvr,éþ‰õ·ñ£v2êþm¶sÆçkG+/DPjH«TyÏ UŸqvÔx²ÎÒ×+ÔÙÏ£ùŸˆiਮXô Ͼ±¸ý¹€2ÃCt¹±©1AtU{Z¤…ÏÏ Öƒ@þýá Û0! åãqÂë%hHCQù‰G-Ñ*µ#­µ’Ž» Et~½ŸM«àÈïO;Н_ 4³ýµnÂIR;<2¼Jg®Q¸+àÌ'ÖÔú*€iAêŽ<Þ¸£‘"&ý%å}‹;÷§C1ës–Õé©IŸ¹íã\\dF–ãì)·…‘õ"HH)½Xú5•«&àVh8Ú>ÍBX$¶—?¿ é›x›aÀ¼—Èlû2úµÇþîËœŒlUÉY¦°kÇ ð’5‰ùå@çF¬iIÞ7Dyž¾öv¹Ú.|as$(l‡G@´µø-ìYXS—¤·Z_Î1«&GŠ{ñ®áJó Xœ·À­øé6õ|Þ;Ž$K¨TfNó;[£äÿ/CÞtIjWÀñ;e¦ /Lå™»Nrí¿›íç¹Cù@G`·§šÃŠÁ†Ql³:÷ùbWÚÔÔªh¸Éjf¬Å&¡qõg8ó#Žó~ö ¾°y-A”o}•à9ÿr QuYyëæ2Úð€†Dä¬Ì ž! ˆ§žM—ó:–s\;- îbr½M~­çö¾˜%åe^€ ^³9+SB,åÒHY¶êåqûÖñ÷S—O–^{ZŽ ;ªŠÄ¦ÆÕnÅ^D¼BÈ©ª)$›B ­ôHöÞvÑÜbv=[¤ }x(»ø»({&døgat ~Cé—…`ŸœT.ÕÒ‘!Õbjœta[\†Â®éŠ{%©Ù×9‡•öƒÉ7°jïîáEƒ¹ÇhzŸÁΠê­o)ÿ®–ø­ªeæk…gè©åm†kŠšÃÓ‰³7:¯- «ºÓ]:­]¶œÓ{è¬ÿ–Îm¸Ä.Ÿ„.BTë4ÂÛð½nÿNÍܵç~’Îdò`æ‰êp_ºËÚ¬lÝ´1”‡mÊéj¥ò_Åp|®-¢ž™[lKÆÎldí1/  Ùv'íÕ1DŽÃJ+º r”Ø!-,þV §-ßZS|Eq(«‡C¤‡ØÃpÖ|ý˜¿«„ކÒM¢Òq+ºs£÷kepQ1ý§Y¥ŒïE€…/±D i8ä8wOùNø‰o°¬j’Úê.|½v [¨º·å()R´ñk¹®‚eøcq¤ûò)ʇ®AƬߟ1l0(§ »$]û.7ã¾(K&èÿL÷}f#¯ù‚„èúO§Y¢/EÌkú·Eõšݬ¥=цێ5¦@xÁÀÞQe \¾a/óeÁ“ºT\lÜ­Uãab.”`t£0¼ú¿ƒRuG=LwgYcη܈´®¶`ûäø`9åêm´Ý"ŸsÔ £"ÆÓI¤È»0K–³-Á)ÝórüBMÄìQɰt=h1âkµâމÚüˆEðG™(wýWî §o¾/Þˆ¡vè 5 ®WÒ äBoâ.CZ¿ÒxuÅ´Æ}±á÷cÁr©ÀÞÎ×l‹T{‚—}€ bä—×õy ?KšrÆ•ñÃQ%„—u‰FÃѾ‹áÀXgïoÜ&ã¸-œùÑYÜ ÁùÖùAf¦l¹ÿ?¦ +o·%Þv›Ã¨¶G"Eo”!ˆ:5{1Š—œ5É_\¥“-ñ%ÉÛû¸"±øI6ÜSñ}ß)`þç £ç(” êZæñ]¦@|bbÔRÈdp[}ÒjòË6‰âN–shjËpûAʤ“xô1Å?:¬zôÑ?¨l?qÿ™“€ \tá²›ZO½4—ƒßa?çâËǪ{BIeÄ.òÊ€ÆÆ÷f[³ËÀ ðõÆÔèí\þðåÛž=Àɇr;+ì0žÒ ñÍÆ f»G‹‡è”t«Ô™ÌçO€þ—‰l;íÉîñRN6xNßu]Œ$~32÷ìé^džs¥L[­"ŠbŸ_lŽô‰5ÈY# ÅÐL9S%ð¾Ãòo„®éÜ‘©µyl «ÍGtÌ=á,9Âü%qeÝŠ~EއËg¶¤‡ñ 5H cnA „^ fLG¢áœ™½rW &èT´¼»Iô²ÊDdúrmØÁð\iRy‘Ö4H}H¼UJ€Ü2³4Ó¿meñ¬2Ðçd‚\‡`‹cÜÜq6DÚ`2-hÎ8ú·ÒN±žqͶ)¯}°2ÌœC“Y’¶íø¸J¢^;±.ºÚµÌ.•ItÒ"EM'Æmbâ~êzÔ‹ ÞVð–Ž'Yè–^†+yh¡@x»¨!¤H‡~92VÅ û(D»~J¥~:ìê÷!;pöë™7Äò¦%p'7Ì£ †*Ü-äašu;¹L'Z@<—Ì’Ní÷‰3P*Ž“4N‘õ¢8²6²(ÜŸ¶\`øˆÊkЍ—S 57ÿsèÜp³ìL⪪¿¬´ÉSL>Þè@¡Îyu Oç RíUv°•nbî%xW»]ï*ýF"Ž–%ÅÀþH1Ê$jßÙº54 E\ ªN’‘Nzó%CŠ _¢e`”»1…Z'¼ÜEh>ÿ‘“L<]Œùz$^þþ?ÞÀ7ìßç7¤ÙaÊcJáS°±©÷+`*ƒXÒXà>T¯y ³"ìàÎ37~Bå7?D>…PåÔOÁÅ<ÐMGšžpÉwG€‚rïÁõõóJTà7öõ‘~õn_ÔkÝÀ8-ƒœþ4¾iK94²+N‚%¿Ë/&^tt¹4›¯,Ê5.óô¯¯tݲNŠp!ŒƒÚƒ\ÉlU¶üÁ™¼žá?o(þü9˜Ùò”5—õk7zµºG¨S1§Ï;þ“J—¸£…Q>©rµAžƒØ®GÖÖóèdÏÊŠ‡Mî¥ÊÞÍ1ÎÏÔgqéú{$óPžk øÄÁÈâ}°òùà¤"˜‹-RVp„såÑK÷®šâØ£µÃTDl††,hz`¥ºßµ“{šê‰Ÿ_gy]’« ³Õ±#Ý…+ N< éØ5¶’‰‚/ârq@­[‘7kêúÌD» ¹óóryµ¿ÎGF2öä–«v•)&Âà*jLŽÇn å×'*;ƒ©GãV×.‹-§†÷Onl pÏ^³ÕÖPI&qÃ}ÓûXpÈO¹råÅ-ÃàÌæú9HñíòSЯþ ^øjŽC¸-m"8 ¼ê9Úù¬ÓrCÏsàc[¶kˆ‡É²Ç@ø727µ*‰å‰ØÄ Qp§·­ÆÅd?vÄÕb–~!'½ql¬ÄøØÐ•ÏMB G5MI[« -v ‘ džW±°sÆÌVi"¸tžÇ‡A펲þ&ó~š;6”~­f E ®y«a\¢²B ŽàK jxý©…@ vË:‰>Sd,™‹º_S ‰Dî¼ÏF¹ºBª%àØY•:”Ž…¨,hëÔ–U;h%U “6õ?á„S?Z¤ºœ”ý‘Õ\?«EŸ€÷4Hñª­D‰iÑÝÃeaœÓ0p웿›JSÁ€Z°ØtO³*ÆŠßטn-WÂ.­ SRèiè‹õ_žp$YÍ<[%‹P&ÁSçʹ½r2 E@á#Â3=Z\LE¬¡5‡lÃ=›½„SçbcüB_|.A÷›@-וR¾,ƒ{0H½SO³®,±ñZUžÀx1†e4°œC:ñÞ ŒLº´w2~³¥jÐ÷¯uÍî–¨ ô™%@ …´ÑWÛNTJìTu"¡‡(~”]¼~1ΙèI—7&uÑ3ºåÜF®(ç5Ç.1³ ¯XÎ&ºÑü‡ŽT§- Dù€L]“”z„köÑ2\ú-æ&dñU{Ë’ Ö—¢a3°mlk+,ß`ÎwLÅï èn¤ä‡žÏáɰ>>Ç>5Õ?Z¬•='wBîÌ9UòõÈœÚ~MT­DßK¯Pûœ“Š[Qíð¢ ]@Y`Õ‰S#˧Å\ÏxÇ-ÛÈéØK É]ÀOÅdͰ‡wÿ× ÷%i?TèÄl×z[ŸÜ‘è:ÐÛ©€.> Cpj©/æžÂGNaûýÞÍ dç ©]Š¿]Ä"…͘ÎÂK©§4^ºø-Dað'ýŒ`œÜý·ilÛAë¹×FvÝ^\ˆ ÉS&Ð%eu¼U<´ Ä8+00*°¸‘ ‹ýöÔ¼ˆÚ>LÌÙ}ú ÀÙ¿ªqÈÑ‹âªÇíŽ1røëQÍZÅÕ{ç\/Ž +´¨½ JÎ\ß»ðœtQo ­@»MËH1 Ó=(¸¶ÐÐADé%Ä:|îH×w#Dî¼ò"jÊÏŽiΣ’ׄVïÖâ‡ÕubÛ;ÃÒ§çg«êr1Ĉ‹}§Ûzß>Ý \ÿrĤl±-U#—ˆ¼ÜUùôú—rx!(ñ^ç3öÅ·[èÞò=‹N ýs‡³AG„ÕV¦98‘}&õVN­òÜß Ð?ŒoüI‚•Q¿¿~öR5”õl»0—³qš]¬×@j²QüÂx“oZ ®š‰š¶+š3üò ’Ú „¤»ÅÉ oHÔ‹õéüŒ›gÄGqé«Ì»e¤Ù-ÑFɬ4u,ái970}Ä{f%tuÆ«.8ƒi0ß5 BÓ«íçèK>éð—uˆ›(ß (š¢Žžüìä´ zãëÚ[, þÅ‹gžRã?££p‹å¢µÈ‡•a|Úñ1@•Й ¶êÇÿå‰xÞÝ¢ñ~Y‚xÚ2YI¤ÁL\·`)2]§ô݃ôS¶Ü‘,yï÷Tö›0®7íBÞãïá47YŸ@e2Ø…bØîÿ¼p½G« úér$/ºOz Ð(øvE:kˆ[÷KBÈýäÜðæwð§+u FKÉ}å½îApçõkîð‚C@ê³J5†5¸'˜%qy”®v’P+ºÂ)Cˆõ;ÀÞ¼89 ˜k'æŠï<ˆ>…÷nÈ£ÚY£v}@]Ù‡Ëî"›’+–'=wº›ÍÆØV*Ã"Î×03æèmàÏ+UpÄo›¹=Ô—”r¤»]õjÊ/–6¶¡SB¤q»“¥Vt´<™¼.ß35$#4¶* ÕŽ‘a&a¹Ë<í%QŠ<÷i¿¦€½N[o z»T!@p†ë OôN" çÙ*›ücäÐçÕk¶ô@ä(Rÿ¾^ÌkjfÒ ¥®Y hZ:q’,z°ÑÁŠ'»n`D˸ÒŨg…7ŽõÌAgG‘Br%#á!2ð>]@iͪú\UûnŠõŽû A¸DŠ.0Æl™µRJökÀøÅ½ï+wÅã­æ¿ÁÚ¯Ÿ‘\óšíbÒ3Üã÷ï¯õ§°ÍÀÎ8}KÆuùHc™¼~vŸ¯RêÔ”ÈJòÊ€¦˜,["ÙÔ³›na•jßÁDr?™ºT á‰! J2ÞÏøÐLrÉèêœn!y²*Ò`pšfm QÝýž8N±×”ZOƒò n´$Y?°¬CËÊwb¢érp)€Çÿ˜óIÎ Üÿo4Gï'ʂւ·H¡îã1W*E‘½? wâò ÏœhÏâ¶§ºûÂAX. ãÈH²ËŠ·]c˜:Ñe˜+è0_÷çsc©ÎbO¼˜bl!ör?a5.fV¹bwçƒÔæ½ßXVÈ×»12¹çÂe¶ì^;ùgj\]×k±lÞ1#,òÝ?C{¼ºi©–’ï‚ÿŒßIÚµ©GÜ'`L=,¨DUùó uºq¹Ãm!´ œÓR{Šk]l9–é.mIá†Ö@âôVsx›äùe$e~À¿7÷’!*ÈhËW-&ÑËrz1mל­g>m(—×}^§r>T Ò?LÓÜ*[ž.ú $è%ÍÌ̵µˆÎKnÓì|Í”}7˜Ì£ 3é·¥Á€¦ÕuŒ­æx}^‰wš|-ìIxFnü5†Ç[~&—h[õ¯h½/Ö=×¥ /rrÛ5%EG¸£°âÈž`™,N•Ñyhîúd¿kJš, $-ö¥qÌ»·jXè „ÔŲ÷\¨J{z¬®µT*Ù\‰Äêl€‡øfßvFS‹Üð±:‘Šdà íÅ?"-‹¤ªuÙ!üiªè°~Ù*gµ¹¼0%Cé‡Õ“ÂãÇuS¾0 YÍvôAЂˆ7h Û®™o79Êé®ÜããxNÝϨnËÔ`ùyÏð4{»ÓmêøÛd]ÂwSkøñºt^´¢|§·SÆSš1)‘Vñ.åÉYE €EøôR Ÿ¥ZIl‚pþ$8Q·€ÿxt;rÉáI›ww:gˆÑ…Qá,F¿ªÁ…÷¶É‘g–³£QÛ¬ô¦šQ^¡÷egµ¦-ÙÖûÜ•tøÌÒƯ€4w¸Ç„—êu}°NíµóR+òäíÏ’;¦äªÃA=„µìºAÎeIå[Ü¡Úfzç_–&™ŽË]‚ÄÒ¿EÁjrˆGéRè ” Bˆ3oªÕþÝ]({wˆ,BåùV¹ÞïÕ^ÍØ5L ¤{ÀK"”IJÞÑ9KL·Lð.Ä´?üJ QÏ®ùrI,Vzu pJ²jî­zÓÙ†ý°Àã4Ù“‡ë´8tü‰¢%r ßà ïÿʧêÓ'¶Þ˜äPÚ­ÑQ]ze²Š÷|{&r%¨‘hò}d#÷’_´*zãsÂ\™1ê36S‹wB¼¶Ž#‹´¶*G…²?ô;íî÷q~!?5+†bÃꎸíù†äˆ¡fEGÏ祴¶Wúý ®íC]‰5QäA5+`Âÿ¾ß2òðòÞL<@é\°ØÖN#g*B7CݽӮÕéæ4ɺ¦œk3ÈÐÞ¿_¥m~mQçì:çÚ:Mß_¿îýøU í+qñ´n×OpºXnôGψé-™¿h=ÃÛJÓ- ý|E:ãZ Yý:‹ ~™£§ø—Œ¿8b5×SJMG)6ÛýÍ3„KŽ6 P‰úº•½­» UùÈN_(4§Ì=ô‡ápÝ}þŒGè\8=DOe)ŽºoÃvo‘jêy@Cïü·+X7g.‰™NêyëàÓFL´ŽšíÍÝ/ÙÏ|W,( HÜ[ƒ*¾ópܘí¶ê^CÅ©¨»üñ >N%”54 äÒòÏaÆçÀÁ ®¿#·ÊµcÎ%U[‚F*q¢ÐÅ9¯ÃÙ<”Œ7ðRÁ~Â>‡³´;N‡Jr=½Ü—`/IŠ“Øæ¥¯t&žH}øY¬žU†¯°&¦noø³©Ý¼Qyæ—º+F¼(ZÖw"è;wJ£f»Ñ‡­˜v1VÃ18ÚƒKÇ)¨”Ža|פ¸Ð÷ûHHМÓ7 tb¹i3V%·Ü€|䴡‰•5±5@§]ÖfáíÏuÙZ?ëG+zYjtUh!”ß~€†U-_G#A¾Á£â…kD\™3›Ÿâ¬Ü¿ñrü[úŠc~ž¯¬oê²Oôã&¢Rºæôu’~}Eò¨LÌ ª©"ß»`!)¦IFLAy×îKf¹mõ·‡ù¶·XâÝõ‡$7ôeàNúÌ­¥Hcètó¬%ÄÑX¢êùhzLEªûuRQ°â¢˜…Z¨=DòTÈ2:NV”¿SŒcÌÈË :è–câIaJ-´äì_˃¢)(\àµ)Tû!¡f-‚¶ —Ý9«í´Ó¨h ‹í'U)y ±Ög$ÿKUoé&ÆU÷¿ZR•bô±ßסafÏu`b(éj2 ­L%‰¼†Ä”å ßá+ÕëP¥¢°":cXþüÖÇ‘>ƒ¨¶gfº/.=ã'\'­ö^ ˆÐX*Íkz¢r²igñvÚqçÊQëõf/°%AÂmQ”{–i3(zðf¬@׊ £:}ú$J¿û—’Rè?!¤“÷œ3×P…#ÍVÀŸ9c2,d¼c¸ÌÍèN ´I{egW™ƒ¾D÷<žROD•l“ØYuäS=ÀúœÛ™Ú2äïœHüŸÄ‚¼—Dö؈œK] vm"Cµ ž£ðÒ æ¨o} KXãµ&ÂÝ6àËÆëƒd±Y Ã5Øü¤xE÷/ :äþÑñ6Më÷ï|°kúvJ~y¹×jA-‡' MT¨HÅïÔ$ÅS¥Î†ÒšÆòƳrßèß&P—ñ„ò¸Œ³Æ'òhF x;—ׂL‚´fÚÿ&0Ë&1@k‹‘ÉþŽšåL¢Él…x––E%E;*Ïæë7˜‡Ç+G!‰¹çÍ`3òå~œ n!‹˜4íwv ú Zo†ÒÂ&áÝ£\òÐï¼J¢BÖb¨iÌjŒ^K72©˜Z+ÆÞù¡þI0œõUv•¶iUËÄ™8ÿ`Z¶õ}Ì}W ÈJÅ -ì+ötl©òVr[§]'3%âMªðòÝš£õò‚w;\´µÛ&«æ‘$[ç£ÿįhr[AŸrŠ^¨pÉ“à@ô¼RÄTýC¬$ã§¹ X/*³XO¦`1꼌îÛ}ã ?£¤¬É ®£0üú‰¾øÐÕ!qr¾%¼³Ü ªÅ+š•别î^=¤5­&˜Ï]ÕÁœÍXH Í ÁÿR7µ¿•qmÕ³otµâˆG–.|>*Ý“ÉRœH#>­¼&h¯Bêü]ŒeßËd“àZ†ç¥Í¬¸9ß žg¢ø§Ë–kä—Ås¥Pj´”JòýwX4í¸—»­2z´)Ã%~²„ªáæ¶µ@µ®Ã½n½ïim%¦û%ôJ]tr%oJîæì|êÈݰ§Ùõ6¼iµšZÆP¯Wù'˜x]Dåyî\¹™Åh·ÛU;Ö1„ò.Yÿ¾f5³Wp¡ï°öS E]üTL§á‘6Ùóí|Xu"–ÏR2ÄYæšô8gztÐn*:œr£*…Uå/Q/¼J*B¼æT„ÖPÍ k‡Á‡^{ñQƒ?Î%ÿ¤töt—`]le¿ùHèsä¬+Ûi•^HcÂ/kE‚o°¥HLK¼èúaØBwï 7Л†œ K—»>wv ÿ¤ÙA°¼Lxñ‰6žØfEt”PdRfˆß°´@æ ¿|ú…\ ólQ{•ŸÑ‡¹ÆÆí úþ½§†³o>!”‡mÊú”á ÿ_ß%îçËŽ æûM¨|(ò%v:ë&º{ýŠRF juŸCyÁPæ;¾p”½W4$í5Y±oƒÒ háf3ÙZgáŽù9‘™µ€©zt»ö ñ>N÷ÓÿùíV×;ÐÅ¡X¤9£þfAòÞ‹Rï Ç v“þ©ÊIù5%Ò›z¤ 3ü!™Ãò‘9úc@€Hò›+c%qúà­ý™§ãùƒàs@¿ }nß•ÞÚ×Ô’ÜØ=‡Îc­À¥ >vå}8rà÷Žk:6EžxHL“³Ü¸1©”ÁÏN®}e㼫~Q/‰¥fòuÛ¾²1ÛB ¡—Ãó?Neïݮ𙛼·^jy%Óâ^˜ã¼Á ”‡ w˜K2h¥2÷ªè~j§þd7;¾ºéšƒÍ w=¸EÁ%_ÃÚˆggÓìI© áoA‚@LÄeÔî‹íîãoGßÜ'еôì ¸ÛFÜýT¢¾…©G`Ò1[oAÏá¨PÚÇÂ=0¶tb…/¬7ÑŽk<äüyþrU99Ò¨=êÇS‰H‰¨¤7¿t¿Ã¥ºk¸sZìUI/}CÅÆù.F’`G#¨‡#ý1² ûÔ,å°^p'í@sZc“ÓÍX3úÇy€Ï ÷¨Äqdc’U­®ÀvK®²P%·ÆSc Ìš8)lBó;¯Å„Lè¯ø§ËJìræš`Ìgð=²¯)v½ £’¨H×CÚª6ˆì½ûFÕ>•‡b±ýW@H8Pkejsÿÿ¾]Á1”ŸT‰äÇNí3i¤–Ð^ ’Vî’ÓBN•£…ù  •ý¿„°;Ég*HÒÒ­ðTÆhßçeÙì(Tw×ûix `”j¸«)î^Ë,'%‘ÌHí»^¿&×eâO\ô¿Cí廵\UÚñÄnM‚A䪯|Ïyo´¾çR™ÃâÜ07ÑáIt>ñ$»Í}“%\œš­Wèj”ÑŒö-N…ø ©·ùã®?¯}°&+麑u@¸Í4!d:Ë&øU°]¤fñj>€4aÂðc«÷P¼Eyh<ª @5Ê–)&LeF=¡\n]µ eèì¬Þ³íOÀѪKãí6!ä8Ý7ì…f½7yÉmI”#JØÁ4 ©êQ¢u k eîTÃ!ôÐ`÷õð{IÉRŠà¡Ô[UIýr°¡[ù±÷ ’EˆÛÙñs‚ˆX5§°¡0KÀg3‹8Õ™ÕÂ8rÔÎP—¸–5ÿ(ÖÒü–»Ø &¾¡–‹ŠYÂx©‹¤›YãXNTÚY˜Åç ñgÚâqvV–GÒxÑÂwfp?Él sžÅ!*wA.*x‹GÇE´°¢1?I¬ˆêFóÕOåXÒ²“HÁŸõ“‘Tª>Ð~$ÓÁYqó€UÈ—Ötœ³‹¯bT4·0a@zÀ^ {…ySü ÕÃ'\õ(üê;霩ô<“FxTÖÛÀû¯pÓƒeÀÇcDG*‡ntÀLêÚ°¥^wk«Êîþ·è4¾ä¼U™Ä ¼æ¸tm} œÛ«ÄcØâhFñ&R ÊÝúæQí õ#ƹP=Ñ¥¹ð¶Ûð†5’ýæg õ¯Gʇ ¶àNF¿¿!ëÕÍêKd%µìøŽYã†õøRƇ~E‚ìeYÂàt(s{6·{šÓ½m(ëBE<]Hgþ‡˜¨1Æå,WåÐ6Ûæ~rt¯vëë#Õã:…ýZÞ¡  +Ïஂj ‡Lέ**Œs1wQ4.T"XÓ™m«ºmø#[j"=äñ“¸b"O€™Àt™”ðÇ,Ç„¯ÄÓMdŸÚwË ¾QùçW½€5 É®¨f ·F"ÕÇ…‰P,ÒÝXp•D§e&ñ`? Z¬Ü¶.ïFÙ*,žv¸‡‚h'Æò-sv Üݾ¸'½.;[& Ò®¶ÿýÃož‹@A`É ·¼æ¥Õdy¸0›ŽaªÜŒŠ wnËc©±m0ÝD™ÿ®è|érE:7ч٠še¨ùÈŽÒ,ñœÀ´$Dœ¤çuw ×fi­BëÚ’ÏüPEN~ÝÅÄÚökgg[WnÒÉÝŸ‚XšÎñ°4ÒøHÐËúøN8·Ä-&pÐ¥ã‚ú­?/Ö¼yêÀtdO5„-®÷£a ÚõQ{xœV„Fi/² xÊžá)µ§“¤ôŽ3µ–ƒ*äëzóhÄdö‰Q'ÏÑDwaøªˆÐöˆ‚%ÛãB§½bîÔÿ1ÌÁ­³«”é¡UI€³Àwh=ÌíLUÕ{» ­¸¥çšJ¾CÇ”„RÄO4ñÄ3ysÆD¨çmÝõà)aCö­ájÞ—¼¬ÅÝîH"1©é^iÖ<þˆšî 6,`«õê…AãnË0Ep˜çÚÖÿÕy®·‘qK¯~a¿è·¨‹Õ¶íäÁÜ­Ì0VZú$Xó^DËor(º8LÁ·¦Lé™BW/E£ ,O‘›²fá®lxwsäá¬Ô=ÜLìEÊ-‚¡Ch?á0/ë ñ‹ø¹ð'!2áÏëT㊋Ãõc >ðƒÇqûŽýÙ£ [NùéX¸béjuölh™d¸\L`©æÔNÉ …$\Œ¬(Gˆ$—©pC%R(¸Â•)ê‰òT½ŒXA&ÚѲ¬¬õ(VHƒðÁ\A¨tžä®õûQI@ 3—Ý«Û!ùB°3u´¢ª¯•sLÜ" É~6|!`˜#V.ÓÇ9KeœH•*ÿJEPßy;OÛì{3.ßÊ·Ú[J¡F”y´I¥F!‘­3m·‚¿z,¿×Ô¸…â1QÞWE”WÖhÒ›1ç4³Næ¬(è×J-íÔ‹©dwkìÞØ¨i4¨`¨Ryžœeî4/%U¬ÌG ,äQ'MvÆú©C½Û\5…T™¥‰ôRÅô$( XcÇíuDpK`¬ƒ]X^E‰GÜ\"@Ñþ»O¿vIYnÓÃø×lÑFåµ™_@lÜ/ |ÔýÿY»¥­ G_…ÔÇX)åtvñ.t,‡P©j§f'ÝiNü ÐQY±Èa;ðú^{´‹¯°Gä§[A‚ÿ2º«‡}w˜¢ß¤Š@…Äz]¦õU-`)]\a€<'‡œhT”ˆeÛ)²,|Ý>œ6÷Jˆå?Ù®nJ×0%ÈU M×Ñ¡q¡øX3£y=̆Ü%³öí‡fŸMDþV6tj€†^C ºµ B¶¦{q4ª‹BöJ…µŒ1Ž` €è’³7xaÀ ͨ-•xjor4á÷œ3!çSñ£ E ŸÎe9§ä²­iUwFýèäæ ÜhÄ$J ¿'o„¢(j˜©´¦WÓÁ±ÿ¾»¦}§n ='¹u\¨.¤T'Ÿpžá‚Ñ+e=–rBV~þad07Œ—±–¾Ÿ^ÚB0£)²xÊIm ˆ”Ïoø¤ª“ëÐõLÚ,µ“]¬ÜyhñýM¢kbË ŸÝE¥PCåáz,Ä!èņAynÀ*–ŒµÏî¢Z¢@•ƒ›ÖÂ`Ù›\B¶\@‚M@„d³ ožèhb”Ψ©9¯W<ÿÊåüõ"7SñD˱¬þ’Sõãl´œµvŽnâ$9i#Æáɱ¬ÚÖLàßÁ̾/} nî"5±ßÑ>Àh‘Ä53ÈtJ‘&’ ŸY™É—Aóemà 1F ;”ÇõìE˜Óxm|)wÆÊœÙª€¡AÉ“~©'ÿÓXl§nÊ^S5ß"ËJûÁª¤Ê,·—º§Œ¤Ñ«‘ (‹™îªn&æf`S•ả ­"éÝÕªãj½£Gn[÷ê´×‚ä/kwŒœÓ46Ѳ·/è°àeXm Þ6ýóK*¡^Œå›ÙÞV†ƒÏËŽÓÏ¢‰ÍôRZF»{ ‘¦$‘ ˜!c<åÅI”—a£æÝ0Öïfôž .ñщ×\ž®ùÍ!åùÏc¹[9›%€ŒíÃö¼ÙPc”qgy E¨É ¡“eyµôO€¹ÓÂeGT°9 cÒ `ªÔCÏl7|mØK1=”Í"ÞTlVÎOÿµÄ×Ñιé•zÍ¥Fг'E!"R³ho¨tBʲ°ÒÁàùÍT­vœxÔç»Ã%T¶ô†¬ÁïôÈ£ÞÅÃY‚¶L,ØCÒ_H™7ZÒ:‰‘L¾¢9p ¿ÅZÃ1‹°?á°aÌ^kÏ´å©H„]İ:yÌÑ\£“¿ö`QU]£+h¾fÛ4bôEx.î¾åÏÛs®O˜dC[‚µžžÖ±äÛ¾¾ÒYßîÏ—òÅ} ^¶OÍ÷½O/9‚É—®¦³ÕÅ«œ¡J9(ö5ŒÎ Zí\"¼˜8Œ†1¶›xz•heñ^½¹7ß¾ºÇvz§ïY!F¾NÈ%©l†•éß$–-jŸ‡~& 6)•À>´M®"óá¯þÌìðV1š½ØŸãfêÕ¿ñxä;î„EÀó¤Ï­ÀË)¦g6¸F滢\¸í­í-à×–,, Úÿæ®&ö(ø#e•7eîÿyZ¿¶Âú¥âS6ݪžŽ­g7ú£´ù~m]«(F ·èVÅQE%uíGc T_ß»gcöľ{Øýha®ð³@Dµƒƒc½/ \t¤U–*‘Üußõ½F&\ˆü«àB8yPðŸ@Òò÷ÅÑ/%RÙ8Ü|›à_uåħ®Ðÿ¾SSÝ oÅ`è?îî¯1mS†c:éjV û¡"hFù TéãÁp Í1ho¯{¤„®ƒpW»?¾±¶É®çA*tÅì6oh+®QÊB_²tÑ|AÐÚ2u-XË7TÒ)`eoî6Sc(NGxW\FAõϱ†é,´ˆ•€y³Ýò)ôDŒ²@#ÁîŸ"níF1d€ð®-J^¤*=³…ãfŠ<ßÚ«8K×øZ:Ž VN‚m0ye‚•Q-ÜÛzÇíV f…Q 5ž!~D€_µ_Ì’l»Ò}4ÕÑ3“ζ¿4hajñDv\dÛÏ¢¾‘ù*×ÛGܒ̳)z©•“…½)À~pXIEÅóàHµ‚6|—¾Ü1»±ÒØÀ8À]ÒŽ9Öã^Ê€›3QÚ³T­=>ò¥ãÿÅØð÷¨zŽéÆùàqT‘TÜè}þbâyÌ¤Ú ع3¤ŸïÑ$ÁäxksÑ_«Ò‘UA¹šðn¢Š°ü:Ýḣp{Â…ömTJ#MãFÍÒ Úԙ׎à%‚y¨û¸ëPˆ|è) æòš³öЈKö:É‚¢‚̨‹º‚¢7óšÈÑì‚|»rUšòõæ@±ä:÷D‚XF‘‡Bz`åÿϵ 4ÔSÓ ƒ D·»Ûð¥ð 3¤ºd)ÉÓF Öܨa—>gÍÈ^Ñ£üÐÁ‹ÊD? …B?N¤N 1ÜÓcÏYcÒ«¤N‚),A”Ñ´ MߘõIFÅvžÞ¨`(è­ÉxU!«yrŒŸàQ\›¶ÛÜ¢`3(÷ áDZíÌ&y;¦ùŠVNo·­C N:ÿ&COLŽ=̇ñH,™éâïÄ ×5-¬‚PEÑËŽ-ŸðFwYÈØcUÄÒ[=—1ݺ¾Ñdµ J@Q(’j‚ýÆè!e„ÏË€[©#zÚ[í!¨Ÿf(I^ç»ìc1nsªñ1^0/dÒ*3îX|1<ûä }ÇÎ)]ø×ÍðREÄh“už-ÓUÌ¢—Rm òÛÈÌö«¨‚n§°EU…²mËÏYŠ}º¿‡žá‚c}´LÓ~ztH3<¾þKA=ж£ôßüGaÇ Ua„™¶^ñJºhƒš´eiqß?¼pF{ëR>ô ¡Ç{ð%„'„J­O ÞXa»3ÚŸ§/Ù£±üÒm%ç›(Øûôˆ—Õ+’D‹ì§"ô†óï\uÖßÐV ‡|uäfÿŸ ·ÎWj’‚±íTP¯,…ŒÀ’çÎ<ëõÇŽ=èM ¸áɩЄ•ú9–§up¼:Û´b‹ÿ®ÛG¢}•Û—]Þ_ëÙzªGšîÆg¤ÀØÔL÷·Iz9ID«p”ó9f#®'[`ó*çJ>Ô¬F_&jé.¨PôÞ…]Ä’1^=¹9øCc2H‘›«ñäÿßÍ xqŸY°þóò×™8Ž¯ë…Æø8=>Pó1~Ý D«Voy÷±Ï|œÕ"5 ÑÙ.VPŽfú²ui™µpuÇ ª´×xIḷµic˜2EÎ[–…?~Õ€{ÀäOµp­züŒ¨"š×”SB2¹| ÿµ×Ý[J÷FúëbÜžs÷+ÍS—¶ƒ1Ë¿¼U3é€ 9\ÜV4þ÷×½]cGoìØg™SAeàcÊTa·«@Ñ—,"f_è÷[Jn|ÒØh1̘âšíe©ÝsJUçÙC¤õ=÷ž.ïÓ‹£”Xõ‰T5©èú5ÛøŸ?~àžÅ…m “܇»“1„ˆ÷±+§€ÐtP{‚LÐ×ðüÓï]«©ž¿Ñ0¬‰²+ýO‚VÑ´ãáEßH¦¾W3”²ç ù/'OF9¦‘niEÚiGk¨žàA!;sžš ›5-è…°JG± úJ3`o%…÷¬fê9„åHJÕƒ®æ‹ÐØA[läP^W:!‰Œä87Zìô0Ñ«…¨«€»1Ô!üÃ,Å‘A|»YZ²*ÌBç§¶€zå¯?˜ÉK…«Èþ„‚õÍŸz Ú*Ž¡„±%^?Mͽ>*E¯ùèˆ×³ÔŸLRrr+ùϺeLîK Àɉ{D•»m8°L÷‰aÎeBý„ÂY bÄ~–wøåÐÜWÖO³3kD!íÎ/%0˜×6 yqGù¤*æ<¨ß¿B;Ìf0÷\§ 6 k»—IFó@FEcܨí”êÃ|IzP1Z¿ðÎÜl³·±Ã „Bd‡4dY™º”«~ªgyе@|´„4K† M»VÓbp‘ÓpŸªæÊ «W3õVÄYåkBÚø#ÍQ9²@|´JôÝÅŽ²I•%Sn6;N638èŒo ÏB?pÚ©íµü˜ÆÃajΫT_ ìÝ‹–}ý m$,±6Špu¿rá+‘©S’2vi:F2v¹¼ÒA¥$Ä&ãB~û¨Ù¨È}îê ©ô½'Go¬ë6¬àFýŠZþA#¶”M¥ç»çÄöë §MøítSmÒwøåŸe®¨T©ŽI-ýHPMdSEéWž*`ü[«)¿þtæMfï ë °*x½ÿLÚ6 L ­U*©+·]R§‡EÇ´}9œýÅlˆ>RcÔmAeOc O¶ˆtäÇ£pŽ„¨ÀB˜…WÞæ„®¢KíY¡¯`*÷éþË–ÒÒžqd*¯á[9ÆjÐ NpWövjkˇ/2«ÎëÓáEtªw[:s³º{éIþ¤'^c&ÂY¶*Ñh–r“J>â$´æ4¶´Ú>ø)iv‹$0’©‹Î­ vY¹&MÇè<© ô9„ô8MÝõçtxó5‘®uA–T‰ÀÎ ,x"Ž!H)0ÀJÊ™|³ÅÀ–~%àw2bæ*»5è Ôö;Ha^•$^úâþðuZ?¾Øƒ SzűÊ»„|‹¡›o|ý—„Q.M%‚…”´¶‰w-ªŽÂ¬yiã² ¯ŠÓl‘ñ¥çO©!ö¿î‚õؼʆ°3Œ õúa¹Ê¾éM<˜ÚÄUöK-!<_<â÷CsÕâ"GeíCAØý†Oˆa6š¾AÛ% v‚ÈþÃQ? Ej—l×Q²ŸNeÇ…=Ç媙S™&(J1mªÅodv{ľÚÌç|}ŒwO–NÏ›žA‚ÙK”nÖžCy+‰úЭyš`±(,"lê..­$C)ÒÔ§¥%«šLká³Ìù NæðK®œÞ<û 3O™>ö¦¨ñà&çDñŸøÝEŸ—çŸq!•2´HÌí´ ª¡)\‘¯çþÌ›‰ànÉf 'ŽðDÁ‚(õ˶}»6ǽÚSx"IIËk.߬f@O"B¯U8;1íqEµšŠ+‘àSeˆMÚ:#ɺŠ<š^9žZCP„Yµbr… ¯8ÑŒMضùØÖ” œ‘È/Øñ“{‹ãÔâ-ôSÒèÎBH»ZaÊÉãiÝIʪNwsÕO›ø-DG 7Ülµ¡™°¼©ª7CY.eiÑÔ½%cYDTZØÊ (¤“6îs|ƒHh¦Ì+k£¤NÁ!#»•<†™´·mpbì­óüjûm6JÎâ ‘Ô\¢¥ã<{¿È!IÄ7üB:½í×ä¼ ÷½Ê7ŸsWXàèE=¸™‘ÍÃB‹]ýºÉƒ!?œ5ÉÆµ±Ú…Àðÿ‰¿þ’iª$Z‹¤~7=*êùô’ƒ[;:Ù­Ik-© Qk•ÈÖ·XÒ…¸Éz;(½ ý’OOJlk~QëX)@ ›&ÐÔ=–#¿¡Šd¶ r`lï 1߈Çì³2zH; ¿Tñ +Óß6ªÞeÔ«¼ür£™,ûõM£ÚÆm´(ßôÇ’:#ï«6þ¤°a(³‚¬û°—l@Mä¡Ç»ñêÕª`îý‰ÒÌCQü>rA^‰e±xZÐâžå2öÐHyA”Øës¹ÎppJæ]|>~0üm¯¯8â¡%ö(çþ`TiMzÒÚ[t~T­MÕ{ü­Í­5ç•¢;ªQq¸É€;æ$*±´!¢ lÖ¡W,¤"ÖN 9ri‘€©µ,ô`§Ï™ÏÚaº8v}–œØõˆ‘Ü<Ö©ge½,ÏIòª¼ÌƘM]܇/…¤]BÄ5-SpiZ¤B Åæ Î[roÑýüdËv€«¯û9 IOÚˆRæR;¸á„¦%yb —Õpª^-áXc²"÷õˆ ËF+¾ÂµŽ]Ѷ†|!Ùe¾Ç™¸Ò~v”˜(&“¾MΗþXh(^íïê·JWÜYp…|œ¼‡(âVé£L¤Ø¡*ÖLDà¦ÊøJ.3‹g41š»oP¿¯IšÖ?ÏšLx‰H]}j8¥ÃRSNîy^9 ѶP!Ò™5üI¹7ÀaÕV»¤ßjyÃ7.‘•9åÂlB„‚º1ØóÄÊ÷Y÷q&’5ëŸGÂiœ±Ln ²Û¨Ê$mOŠM•´E*J¢íBælA_ñût»´4ÿñƒìØ+#°NÐÆk^Î>nņͱ"ÖûÜÞ$D# “"aÚ(ÊYºG²ÅíÕG'ñA–l”þ¨âݹǹU³§¸=‘ÚKÐ,Ô©o×4âšÒšTo OÏ ËÀåóRz?ÊÑxÈÒ¼OJ¾²% Nﺖ±£Ò‚yâ‹~‘èYáQ ÖÈ}RçL¯®i¥ÐOjE³ÚYÆ‚YÞJºAs6áŽÏÂŒ„´fð4¯¨TÜú@8(Šk§¢P:¡”Û®¿=îù¾“ïÍÃQD+HªŒ ›gê´÷X!áýUæWÑ£”øó6$(%OCõ˜eæîs¥N~ç¯ÿ?Up=9²b¹UUû+nŠKÍÜTé~Ÿ ]ÓPwö¨%ù$ü¥‚x»³ä“÷|ÇË:]’E:„¯¡ìôœ8J'K›,ãl ÄsÐA´¾€µa÷ ?ZA¦üÑ••ïâpˆ¬¥(;ñÓ‰òàq»¤²ã[·œéÍ;wlsHîM!¾!Ëà@&ÀD®R‹58PÃWJ Ø»«¡iÞHzûÚ—[…6ùE¾+^ØÙMÂP[bópP¿çç#Œ£Âž2DP“Å€ùO®rMë‮‰“ÉP.Ÿ@Gº®œ?ý xü8Õ7ü Ò8Q„™Ý<ÉåƒÂ’Ò¹ ‚ŽR`N誽ñ]±ÈÕ¦“Í‚œˆñ å7å #J³;æi+›³¹Ögv6G%î6 w¾r4sX¡ï‘åÿ·zÒUBÝ?é×¼Yn-ôz¤?2DDþ"jcÜÕòeÍ~øâ Y-Zz¢Q¨ ýÍú¸¤:ˆöˆ.ß“ =ò\Â2½±ySjA†AVãM¹y^×¼íî®jÍ%Ÿ½ïÔ´ôñ‡rjz$yt{"Y10õfÓß×PÜ¡œØ··û^ºÐ%f]‹?$¢$×A»ž„”'BÙØŽwrr…òÏþ+(Ž«Àƒú¢m[©ŠzŸp•©z€XÍÁÏQt)?Q¶ðÖf£e#Zá)n”… ?eôË”å:yª–Í]Šú7íÆÍªvÕôçt_ªf÷N|©ÔÇ’˜„Õ2á,’b[ˆ*á¶ ü³Úø©3zB¨¾8ÛÝíÁæúž°Lû ¨¢²ÙÛæ=-Y#H¦Et|U©9éGSˆz…==¾À¿‹¶Ä‰+”A^`÷’{;{ÜõkED-ÖÏÑ’Å’œA¶å?à{LÙï„ (}yä[TÕÿït)„áƒ@ªTì> zGŸ&¸ûÐg âeËã:dÊ›÷RÓ4€< Ó.§ëwL2ì.-‡>VÆ©iyòSÚW hU9qF‡{ÅZV*ùuÃqZ£Ÿ…Úh¾ø:swèŽV—2S:^¡“Ì·céÖ­×@ ¹ÏñMiŒAy5pÆÐ påîö09ž_IÄÞ¿"fmv¶Ö€?ôîc¡Ü HIˆ—ǯr`¼áÊÖ§£ë 猓†X„84‰ôWò¬\àÈ2óô¸ ó}Ý·VnÖ7wŽ4‘ëð‡ÚP<Õ˜û.Ñ,‚Øy®ŸF»ÕÔ¾}‹PÕ UÝùÄdÿ–‚aJ…ßÕe€Ÿ¥K }Ù¦Ô&*×ðÏaøziÞኛŒgñÌ*… æB dóŸ<ÎX”¨ì#É¥Wß_Õ*\ª38ÁxËcŠGÇ¥¦ÿ‚0g¿ØV¦¿ºõicÑr‘ª ,™~É{PyÎêäDt€jÄºŽŒZÄ”HíL$ƒ'âÍ";‘™­¦ÿ™øÛ„\6¨ _]3VÆÙr±9ÙtIÀ€‚˜§U€´S-¡À]Æ5“-H1 >»X°©ŸÝ1Ï+ò¯ÅÆúÓÀ1ú$ù½ªÄTR•eäëRø8ëÔ¦2ÿ³¥v;5bšÿ¸ª…x‹;§UªQ¦X¶ÎEÙE„œòúuD.uŸTB7“ŽƒPKö@€4°4›Ø.b:£fÑ('AÈi,VãòQ¾=X,2©·pÕÛ>©¿P¥'³}ÔBV#ó·‡q†òi7³àN)èÜíߢþP£¬Í ««sõõü¢Äf¹§†çÏö_K$Â9¨D¦öÖ¾A˜¼Ì\½¿<;s!ø4â0Ȫ;öâÄ¿ÿG#¼ *Ĺ=¾¾ÝIÍcžìewz[o”¸ÜY ŽK Ph½½_ XÔØ¼.M"ØÓfeÎÈxÑH®y°öyWµPWí=˜úUº¶ý âȺ2oQJòœéyßf¿q¥yÂîªj62Îh…ï=S ݵœ(ÌŽ‚UãgèØU]÷hÎ;7~7 j³*!²Ý)|rxZˆ­oExB$Ò’A°f0sØá÷ÁÝ+ù[÷ÇK‡C³ô†Už­{±;‡æH¿“€Y !ƒÝ)p¼áí0s?Ž[~ù%Z)¬õBmÛ’$…‹³€¬{ÿ¡Ü%‰¨?¯Zˤ˜]„[?cPFˆz¦#'þ 9éütw‚{Ô>¢ëñÜœÏ2ÿaP{òEWl;êó Êú>œ&ˆ+Ãô‘_T¯™eP]‰ÑV.§GƒsŸ x ãTù½ùm†-«¤½#=X›X<ŽéS m´ñ~ N ¨Q9|Kxp˜›n!*oØ~% ¶®Lùîì‡tst»!DÎ.zp°òÀ:iI?ÔvgZòñ^¾¤÷wõFyHŽŸÁþ.¼†ßèÊ-*Ê_thö9"Ž<Š€ð¡$™ÎVgüòOüÈx˜œß´ðͨæd(Q›°¬¸ìÅu®§R*"œu\x³$€1Þ> ^S‹Ø†øUUª. V“:•è:÷Ñl¤‡E*ÈD‡ìvJ.±ÌuOQ­Ç÷giæ~3c؈#iI£X'WKÖV#ÍO蜬.„ÊIÞñŨ÷iRùcD~ÜyØføÄ.Çó -õ.¼öæMäLá@;¼:)Ål¯©ÓÔ X a$¸/“£x‘ÄŸðlŒ8V?’º¥÷Pÿ_aöÀéÊÆi„’Þ‰¥8<ê’ÉÞñ¤ýxG¨0þÌájdTôèW€©±fÜüP­”ã2ËÅFËÀ£•È PPG3QÆ&;3ýpU”æT±š€ÛÝ»‰w]kô“;?¿;¯k(z2êí+[3ćï_FPɹ.íá_FÜ ?ÞF5xë7v—p=~×Àåv‡Vs³3éÌ×[Ë¥žiá«bóFîgýL9©>• *8©”@dÒÆK×Úó\»%»ÆŽm¦nЭ~0Ë•Â*‚áD–Ÿò_ñSõ×§¦`„q¼1íKNnX?݃ü¬o yþ,«;ögÀú¤‚rDE"=x%“`()1>ë7ïNøÉa)éd„ãc(!;Õõ[sgúUÛÎ7h2/7_ñ20÷¨À´¿Ž*˜>ºÅz¤ÎVh»áRáºõaUYv Ú¯»ñêCp:¬štòƒqRê1ÃÓøv.‰ˆz Ùè€ÓÀR¤‹NÞæg7—ïÞp IСŸ2ª;CɵŠ>ÄÞÓº()¹TØð³¾ÎÙiA'-À3/Ý꫾8 ø¾(|°ÒßUôè«p[TÝkÀžX1¦Lr˜•Ò½$јìÔuÎê!g&è»ÔøéFµ°—Ìœ‰ç”pðÞäQÛÙl™M¯°z!½H÷•‡ßÇ"¾{6 “¹‹BD4”k§yA}£Á{ûæ›KTz>úÆU.MK›Õ†<ËF¨í, `ˆyÞ¬‘…D´;A™²ÀÚ{1ñ> øGa.ryÃ4ö¬Dκ°ÖáAPj¹ƒ"þŸACiú/H,ïÖ;€É¶ê8<?”t9~ˆ¦Û–UÑŠ»h`W -äu"Mjš´‹ݲÕmtÚ¥7¦Báû¶>UýÍTa]êÂ.ô„úÛ˜bÈoâæÃ£gîÏä3qyl!öœ©Ð4‘{˜úEìyÚͲä£Ý—ðÅx(t:§hòäBÒ&Mã]èt¸VÈG>ÏòA¤j£Â&tºìH^¬ßð ~„æÈ3 Q œ‡áÜWÖŽ}NÛçžoYÇ] D+e³Q?ta ˜Ä<-P A¬ì¤BWøâK KlŽ Åa®Oc?…†µ,òÙC‰XÅ/}±[Ižiþ;ÜŽ˜<ÃO€µá'’T¢(ç(lçŽwùCaT„sp×Úê ™]Âðcw1)àv¿WnH ‚–H¢­ŒÓhÆpEä¦w7Â+[^¤ƒ‡Ù‘ã[¹iR×ʱloþ@¦ïñÚñ¨Aó¥÷[hÔAhxré­Já wVÞËûäørbÂJ¾åAª0–1×åBX.VYÑöÇñ^?²Êp®W‹, ŒeÿåB¤y@˜Ðo9õMÌûã gýÔ£"r8îÕ<þ*àŠ/𠉔|L÷•ÓädÕY‡ÄßÑNîçÉê¼4ÄôÇ{VÈ䆼5ãÊ´çúFÅ…Au¯@`¿‚½ãÉàfô«§áÚöÀ@5«†±(ž7ÿ=þO¤1#Šä‡Ô† RÑ{cÑ)b´x»Kuª* ¬ä®‰>+’gþð™’.¥Rd5•*zÎÏP³»;¸sOŸTikUkê~ìGä§}(à-Â?MšsôJª–Fgþ¥TŸÌšY#Ún‡/t+(¢ªˆ@·Ãm׌ê*’“èv\Yr¤¢á²0߯J¬y}Û…¼Å¥£‹äÐ' rY(šÔx—i#K®lºø5`vϧ\\³%j CÀ¬ QIÖÉ¥ôadB0\—”}WVÆ/ÅPᲨŽÅcEÉeØÜ ö*à6ÁŠ­y‚På  ~`>-׸‰Ì)a3‘IÚ-tòWG5Ï'úÿ`XaWxû’¨ÍÜ„È<¾¿ÀÔ2–,WøûŽ…ëq¥Ìs$/¡Q¿Ãyv7õᬎÁC[6Ù‹ñ¿4É`ÆÎe Q§¢Dít‰½·öQKâSrðž?7ŒùZF,N„iowyªbmD,çôµ*I±O¡v+Ÿø–gré6ðÆ»°²OxFú V+µz™Z¸ÚHÉíÕéÃLQîÿz-JÉY2á € ƒé¸?ÈŸ¢ ùeÛ•¤ë^±ª!Þ^·\ Àaœœ8ùBÍRZ½@êÇ!2-G×}u%®ÌšÙÔ9¯ÀB_Fb.©óOáúåŒBƒÖ-ñúÊ!'ªb~‘õ?ä}÷'Þ幉áÔ¨›§©Î2Y£¨m–f ü%L¾1¿@ü°QUg¥JýÊlµuÄž‰:m€ºÍÈ£B×ÌÀ"Å[ËG-X–™vNè:ˆb,±Çtêu³Må]aŽ}"Õ Ý2‹Yùª›h>¿GA1|T(í6§‘uôÐïéÁ ª@?Ö#ô;NŒŠž]+Cò@Èìä yÆMöý¨ðQºÍ×Ö“+s÷J4†™<Ú48ù Ha@î7–uÀr‘CV1î´à<µÚ¶ïàT\ô}BQ¤þé䲉{ÆÒ2­¶…Å^ߌ*ŒGJ8¸Ç¿4ûws`D”H”jÍá~ö ¤wÚõ¾ÏÜ© Ÿü¹=¡a¿Ý@ë÷`^º Pÿɸ¤Œû‰_¥.ÝØb!Öëëš=€¸¡¸ Í×pV¹öÝuó¤~úk}—íöÇœ‘ƒó}ü€^V‰ò{SÕHwg²vªz! ®#¢ÄÈžlÍÔŸõü…{.‹Š™vÂ8Em ½5° ”e}ø‰¾am”\á@Ihç€(·'¶ÛeGõ_L^ —ÃþȈ.ßïU^˜çj;î¾ Ûͤ ,5¼Œzkx¯ËhÕ'÷#ÉGõk›JE¼Î\<©ÙPärš$(fâ&¦n=qÙ®sðøt)tÊÒæƶ{ß®ÄÏyž«Êì:À¡n§;QV­ <-‰ ¬#Ð>ÅäSO4@Ç-=µÚ³ïö&G-˜’7š9è”± â.¸)n šŒ‚>I™ö¿ <Ù%ÇR©Š¡¢á’f2šILw%¯¶¸]#ü8±¾\¬« µÔn8ÝÿA¸«¿ŽŽÌ,±MHc-¢åõ÷HáJˆw¸åòâb¹:zó>:‹;ÍÛ«~íëyá‚^'|t´ËË‹@¨/3:Òñˆ5úŽä›¯n"èQß …}ÓÊ,Í«æúxtpÝH½àOs Z7b+GæŸ9 B¨âHË^÷òN;K å<¬¿INqI[N•äkjÁ€/ÛϨÛѣ킉J]Âcp £«puXo?4Ij¿@D©¡Å>\½»[¦;«¦!ª«0Žó°(z2«.XOì©£à :|Œ"\QxŒ=#"@êÝcÈû GÿÈ.Ž*ö¬Ro =îw&‚Óbv8­iÔ²@¹ÿa;rÀ‰Ñ"Æù¹âDíÁþ¾µ±Åä´¤6&ƒ6;üÿ×H­3œC-1tKCYÑÚÁrŸ«¢° ‰‘LÝ©ïÈ”D ‹O<énÄÞüÄÅzðßgÄu S#¥×=g*qjx}Üh7¦¯E_nµ$ˆ‹˜îŽHü”C‰<Æüöê!Lôb¾ACú 9ÁÛh{Q†ìFx¾Óݘú#×–Ñ—éÊ"‡ÔIN‡oŠæ˜y.7”¯[9_¼Pç‡`CÑñNa¦ù˜a~·QÁsŸ_N£]Õ=ºª‘mì†RXT ]õ †.íîb`Qû®cßm”fnúôìå"Ì€fëì‘sGÑ™2âiô™×1n˜,(qoúa¹9ø¤x™ÕzÃØEÿÛ!»ò¯¹˜°Ôဴ¢*"™ü¥±W¯]ÚÍòÉÝ>X*ìk¼†™†“¹üúHÿŠÐÑfÌ¥ cÔxÑÝ{ýíß/Xjð$”¦î韶jùó·Æ©á»¥*òúY`D÷©Ô°Ë3zÖ¬[øÍ»i9u6¹w1l‘'òmîCx¡|É1XwñMÞ­]ÞáèµËá8-•)ˆ î=ùýÜj?œ`V˜Ž_ÝTEŸi28q…Hqï!•q¡üC¤+ñN‹ŠÖïE‹YÖºcJºlîô¼Ù@/GÔs›Ýò)H©ÕçuOb'V\ü’¾½bU[¾àIU’:žk =3nƒEûÝ@¸çɤ=¸:‰^íÞbë`ûjÂ?PUƒššqw]ŠEg5ñO‡` ñ‡¥<2<†ÍäU5avûE„´ A&?¡P²Þ§D»C—6³© L0HSÓ:ÌÁÀðƒ`ÚŠ¢Æ§/Çœ« é*Œ¿³rS‹ÉÙ+XEè•§Ü@`A«7óÔ‚rTºÈ`ÖíèÅ‘-®/”:D0&ŸÉù‰@$Ç<×Èö¿}üñË.À—/b³[7tzŠâÇ¢ÇÃE•¸ñßQ;—;âñí‚/Ô½}[½Ú`—%{;¤•ù€ÄͲà ೕ¼¬Þ/ÿ¼dÚ]~Ñs‹h®H>Pïɧp×9ˆ„Ÿ--nÇsD"§Ð½A)ˆäò¨M%E¢ÈJ²‚R!Óã=]Z-§é²u¹÷5q(iÅŠÎ5àü®©©ºÃ'„ÈÏö °‘Öƒjæ1^IC鯮 àQfÅÌ,TÃdÍù(-·ºþ’{H3ÄŠ€E¦­þGùá‹ÄùvW}î«Ê„(0î¿}M ¿í°r² ĽÄAM¥Wôëe±ÜŒ“O›ÂQjœb•rMʹ:œû uΦ#~"]±ËªÆyâÆðÅ ]í3õ Ðù-]Ÿ¢0•ÎlQWÅióåüÔóú[›)LtÏ•ÝíbÏT¦ûÉpe$}N#Ñã›þÆf<'gJüᄅ䂞ö¶¸ãª¹ü› Ì„Iµ "ð¤Ñ@WŸ©3Œg]­TèTÏ5”RÀ}ìòƒÙOËFÚ UÛ$» 6NÿiJN†þ¶„\Õ”“¼Þ‹¼a£¢ ¸ð—VÙØ–æàÝ&´¼£HzáÅw2 %íËD‘ΉÌú¯ªËˆw¢–6W`¶|o¾¦£­E  DsèDíMßi4ÛŸÈ=7öx¹÷¢¾òEø#lV«6gy\yì…Ö‹š4éwž)ˆžgß &²-BÄ#ÁBZgˆhT>–ßðêuÃfkÈZ[pHõ­ÐŽû¶t¯mˆŠŽøê§Ô?” CóPj®`ÊÉÉ• Åí†;fS ˜®¾Bæ<º7únÚ«'øW›ºR c]BJà—¨Œƒ =B½k}‰öôc³bå!SsùCìïfm†ÒÓ¯^ÚŸyjU"`n?­‰SñfÁÐh‹zÃw “C¤‰ HíN¨Ñ-Åâÿ›máRSß§b6Ș„²³†6Oë1€Z‘¹]-ªéÑe8ÝË”ëÁ#ö:Þ|Hå&êìý‚!`Þ‡#[u;\ §œÐš¿–¨³wºeó~ËÉf T¦_¾hl;éúEs¿††Z]™ûiA¡òsd6Ã×cQºàk§E¿òt(±;SQV|›%IHØ©i'Ú8™;”XÎ_Q‰ eµÙï†QŠ #¿J¡?ƒ»?èŠL=h Ö]džYÆÉ畞wi‘¸äá± [VÄ2]2ëW½±:üzBB"¹p¨”ÇÓ;«ö;YïSRlêbõ…o²:׿R å$~¼ÐøLDí>´hÚ#CX朵­Œ Sò¬CXÊ,*<Ų… ÷4UÖÓ”K¶Aæ™PS¤ JQ4%¾ Öß~Óvéÿ‘c(,º¾±K÷䤚]“Èi¹õ|†ªÐtc:¥3õsO+˜°Ï÷¬Ôrk±Ë#2û¥›=ë?<œfx8 ¯7—fµ˜KLÓ×u¶.¾ÿ nb‘pƒã\¯Õoëz‰eFs<ÚGé——ï¶äƒ2ÒL—fù-MJÄïÏd»Í”ÂlÖµBÿÜ3vG‚fg¶øŽ`O˜ IÒ†£[^Ä~`\¨Õ4HƤ6±ƒºÓ.8Ï(œ]ÊᢋÃÊú É {ß?†%ö·VØ\¤´(e¤¯y æ>¹\r¾Yˆ˜èúº¼„^»¡´MNÔÿÔ`a/Œ+$› fV²ÏÑ WFSCÜ¦ß Í£öÞVjÖø=ßîå#ì ÄQ8»€·1]‰K'׫ó%– YÑ…àR,®ð ¢Omâœ0“¯ù€(õøx;7ýíDÖQnû­ÕÖµÕP+þj]Šº½PQJ„Q¯ƒÃ8bB˜ ÁÜ Ð>V\}%rn7¬Ÿ]¸‘o™D¿¡ y¢cº‰#c}ü¿k’Ù¯œ¡×x™×”³8\­•XÎëÄo—é¶Îjñ½Cɇ0Ë€Ô‰7Ð×6†( ÁlyLD5´ü9"‘æ™ëáªTSsu¶û²0·z ù+úlÛ‹6Û?Hä…SŒbŒ]œÕV1z ðæÂƒàrIæÖÔ5ñÃ"–ï ÁðX Ë+›Z[ ÚêÕÓö˜ÏìdØ %a&ÁØÄH*‹ìŽ ž÷&<2߀àsÄýœt yŸ.†õÉ7ëúH·¶º”¯õ%y aÃ…vhVu¼j½žšŒ¡|˜Ï…älµ¦·Îå-gì$œÂh€,ÿÆ9¿:ï#®9¯]ÃçcÐ~ÃK>÷Np}½å¶Ü Á©Ûì¢û¦È|ß'Ž¥X@I^,‹éÍ:⡤'^ãÍÎ(B{'ÌHîèìU´²†ôqëÊ¥ácÆYgÿÔûß{5„cÐ °ìè5–Âê/<»ØGmnïóØ ãÏKcb¾B3Âsx‘Ï¥%±ÎbòúK/Ë¥MR·uyÝVÝÝmû-ËkGþþ„Ó¡ŸêÖ)¿uª \ƒ4½wððMëdCÚ™èM%I]¾Ògòx›GQ'æÅpY5ž°Š M?Î屿¯Ù f†GÌRþ„/¹Õ¥Ž>PäÍz.¿ÉÝôÊK )ª¯È4F'ɼtÄ›ÒGtë ÆÚp³ó¾á4ò˜RƒsÊ‹–1,]RZfè¦DÐA”ߎ“#þ’Úă<ðàŒqgš¬e¤!+0^—æh£+9rDU[±FSÁƒ„U ´À^É4;âŽb„^ËI®jýP¥aœÑõwŸæ®*,B”&¯Fþ.n’Ràí\a3éäJ¼–'p¤å˜èÔ0œ“Ì,Pgÿ®wþš^F=žZ3*VBôUЩŸI¢hê|u(^ø!_æšfäâã**§SŽãúãÔÖÃJtg{É"¹÷wö+…‚^ Ⱦ¼—>Jè^ý5ÕÔ(7!ˆ' xÙǬîuÛ])ˆƒ(p·îOSfÞ #~óå&Ü3â¤újC2Wyî‚S×mÑÄû+Žr3JYVĈ¬± È9›A¶&conþÙ¥kÚd¯£gzHÑ4dÂà4!Ùkõó·ÒËõ²‡Z!Fw°&²¨Æ@±©U*G•$H×I$`üúµ¢*~›üWzÚþä/¸Àê×TI:§¿®–A3*ÿšÙOŸ Z”ý\¶O¼'J½XÞVobrU $Sí’¬Ž1}m(õ¤CÒ£¦Pø¡€ÒìwI¬WúAB½ÑÖ.¹š,J.¤H­]ìÊØ{TîH;@ÎvÎ,À#› Pȯ)à¡­Á†=˜D²8R8?3:)§ˆq‘”—Èx×Ýþ]"f|QÿöÂ’k=!:<íö©úÑNÒ“nö)/€Žðç<¢aG™‡êJ¿÷·z^)«¬ÀïtÚÔ»¬çÍúù4!Pi€ÂuºÌa²’Ý€áÖ@¡‡ç: h/Õ½_nS7ks¹ñþòG¬4”Ø(™P¸Xp©ÂàŒ©&2ÃU:þÇq£ÿ-ä)Iá­e ºÀ|‹–"‡ãÓ’¦/¢6½þØØÿå&iJ­¦ŠðíS_,ážÊ¼/ÆjËäOß÷9p†±‡g%¾©ž‹ÐÍ€UÛJŠ{äQÁ¥Á²b›L”ŽõhÇ£µíp«@ð§S·ZðBHi›§eL6j£¢Q!ØYx©Õ╺×ÈBÆIAëP²ºÀâ‰F”> \"s&ױÓŸ¤$[ç•›w ¹5]âå¶û_fâs»œÉ'ø5éZ­)Øg Ó^žkèñê oÞò¿3æ”Ôt}RZÿù—ì6| UÂk¾GXù˜$&žC·•ûøƒ±»2"Ƥ‹–Q2^Jbt¾GÚ»ÉøWQÜ’9è,¼^Ê"5ŒŽ¹Úv¹Ëù(”&ŒIÍäö{b™ËFúñ¨ä/Õ„ºtÄwga3%ì•Ëæ¤;ê_ù||!•épPH“êÈxªì ÂèlÎÄBÛbúľ¿5Ø­‘qh”¨M¦­m&FãcÑCÿÎ6 >(*„U›¯ÈA¦è1ú_AʸÎöI°6_UŠ"oFüˆ£‰Íà²5#è„hl}MŸëL=f¼A!§9ˆç<élÂjšºóÈ`ØòeÑ:DóÚ›^SãHúQ¶B™ü¿ÑnÏÔÅDfÿ®Ðþž%¡–˜Î>#X*ü[ƒZè5;àzÁ1â¼{zަ³fS‚²ÄÂÊŠ «­ä:zRId7X·ý 긩­ŽŠßÂåêëæÒžÓsNß ’á”ÏNBßê(¯î§þ¼¾Ád\jQ0;¯±vtÙ5ùõSx|e?ú=ᨀ_8Õ}µá±lå±8\O<Ÿ­|²F êÙÞµI05¯ñv`¹3 ,‰9¶ŽÔh+漉xñX¢KSœ©ÏÆ2MRE'@m‘[À“/z†âýd“†Êln'Å ·¦8bÖÍü>ØÆ2Šujû†\&O§KXnH@·¿Zm4ÊHÌt$µîs¾¬é*:M—¿ºåÜ`d;ÏNð^&< ñZÃve¾4(†öµ¶4cë-»µ²ì\¤ò'ùÕË$½Î, ³Ô5‚s‘‘mCoùY…Õd»B‰Ý È >Åp*™%ÆŒ†´—,‹e3½—&K{V;ë¼Ö,ÌZñ3íT‡-äÕ,µY+5£Æåï¼ÎȞ׈„á¼Ä7ƒQ²vû8‘6«¬bQ\\=7U>ñ-Á–!ÜNlÄõoã,ßV}¡€«¹"MJ§ìÚ*P5˜%ò[!PîDœ5´EIë>h0ÕQÅQáP|å³–‹wö Ó’9=äWagßas.ŸzBFF¿„‡”‡«ß­@ê¥b¶Û¤21dt½¿ÓŸ±CÔ> ‰ócHüz©mêI¯AmŠlç^¤“•f~ʼ+CT:H‹ -…8eØi‡½ùš&Ø´î)¤»¸­ Ô¢{4oµùèåñ€ðÕtÙŠdqYT£ZtšCê+ÍM­“ekÙÎ'åîÕ»ÃiÀ`»´;@8¬þ®Cz5LÃsf²qX…Ýá¾]ÏhŽZþác&M¬Ìþ–f°pòñkGw.ÏuU8ð/Ç|ÓøŸ°Ùà¦T·£öÎ`,Mâ’†ð…âÏ%lØøë$ô`' l¸˜,FÊ^XVjÏPNíhþ°%[mX³6‡U¬ìô‡ÕMµ ¡¿7-Ó¶gßb$é¶Òì³´älýSBãÿ!ˆ›Æ –Ê_ŸLëÛ:ÚyÁf$‚OGŸ_ÿ˜›ÏŒÒ%O÷[ͽԯû–Τ–Œ8a @Tg?§¯ÚÚ÷y®Xæ†C CžyÔ]V5+pN_ånÑxŽÛv¸L—Rð,ÁÔ PÀ²ç;ÕA8± ËW ì½ÞÕÍ÷½ØHWn‡†Š‘Åð±ÃkýÜè6mís,FÉÚÚD×”ÃÄ¥÷„ÊPœpŠ$+Š9ÖIS7ž¡õ´EjE 8¾5ˆš°RÑH#9*î#yÿ5d¨j/P¯ô böeóÀÏö™/¸P@æ` ]r'ðX’óD%xÈ!îæŽuÀ&oáX¡†4²&¯"J€ú¡ã¢Ÿö­(8ÌÌîN^5" éõ<ܨŸAßc&SÅÆKîÒ žÑH— »×5°aY¶ ±b™q@»j©œÐc¹J}å ŠŒîšÅìË Ó™'ÿ/ö!‘–8Ô ^9ÞívaÖ98ú°Û+,ßËQ|~˜6š{ÓãÌÌêû•M’¢" Éè%Ë8ɵ¥)‚; …ºÂ`Xd°"¾[¸Ú¦1.ïàE“ôèÐ(M»¤,ß·Á‰ò€ÿH·˜‘îôüõšA;|ú£~÷¡Tßx€ŽJ¸Í£?Ån8’'º•$i­-{¬2ƒBFt‚þ1+šþŠé¶õU¾ãj>­ÕþzRJUo=z³!ØÅtß2> ¦Žã¾’½)UHn(œ>'þqÅ Pä·ÙEÅUXQ¯â%êÁ°êTô äS ´¾-á¼›6à·„D38PW+8iü¡¿Úþ· T#ÖØX½¬1€(þŸ03ÑÜ­“¹#rGÖX)«¯¸xÇïT˶Ê8Rjÿôf$4×qOإЀ Íöš[¦“€yôèF%œ}}$áIâÅT$"<̲…EËŒ[QθþÚÃtéJx6So4¥SRí@]œ1¬/‚ÿ+›ˆYhÕ4Éy/EÄŽ”-(ÏðbFYrFwe0÷#’É)Ìݽcì$ÕYC{„D0 -t.ÀoAŒr­•è:SJm5?èsˆ%h|:°(Íû%X×PáF„öáD§VŒG4ûíàËþ‘2—¦W2‚¯Ô[ÕÒUo›G³%)«áÞæ&œö’|”%&,¥¯.²PI;œò}ÌehÕäɇËç÷ñ¿¯Š¤#´V ;=¢œ!\Çù«Ùí4†n®©á癌A&Ë;D÷¨\7d «ÿ›ð–©Ê‰™ïì/ÞS5„µô›´ÛXò9.z»Îµk5èÐå˜WÂA7{•f‹|nSˆvƒ»:i“¨£à‡Gñ·_U>eäHÈŠ9B/ý­giPqJ Jaõé˜z2×Ì=FC\óò¨DXó f •y/yÑÊcx߆J0Ž/‹5Ê…˜[U±›û}À[õ§·Qgç†e7óøö¿ÎÉ[”kJ±°°äZϺoN$ÿ½Æ9Y•3zÍ„ü¦¡d…~¯ÿAÐ8¥‚ã!¡Ö [>sâ¥X‚ý‡?ÚÐùÒÔu_£†>RïjVøÑ#—ã½í»õLŠ2Žbà;å0(^9ŠzÅ_nI0™Ì÷§yÊâu¼†€^"Ü1&ɉÌ °lÌîŶdi̹*¢q¤š%–h±zÛ0Åʆ5ϸƒ/†!æÁ^õÕŸ ÷P˜ûÀ§ç–Ë\³÷Fýذ¨¹*ÁEé0:ÏoÉ “%ÿ]‹í¦$F1sØ—9æ(¹Ý­›Œ¶jÁ -âA¥d•ÐÁ¥ëÄ8ˆ»Ð‡½lß8áÞ“c #ÍW¯¤+pÒàs“^f_D«³è¶ àe áÒA]zX]·ËL!™ùùìC¹,>“ÜßisÒˆÁeb¢Z©ºëy¬‰—L#=j¾æ{G)§F§4ˆE¤)SÍ…ŽÕ?8Rˆíƒì+TÂô=N.PH]’“Vt)ÔºRñôÌÍ€º‹YµÆ)®V$êþª Fì§iL½ÿ‡l;›S‘Öì8Ýl<óÏëÚñíûf™ÓëÂUn­y8ÑO{{Z5ÜŽ(+Lžh°žœ…‰ƒv`DL‰äwº{Ðͳž©úÞ£:™EŠf 0í·7½b{hß”E£MNI“ºž$ÎßÖ•\ì¥ÉÇš4 ³–üéÿØK/IÈÕõ_A8`{È2x.&žf-çœgPo¯qïs("VÁ‰Jú]êÞQ¿B"òÐñôü§á(×d^”‡ÕÏeìf- B"Æ•‹õ…%NÌÀ.ûDˆ¿Èš]s R•·Ø;ÙÅJÏðÅBÑ=ÙÍiW‹ü_Š ©8«4fôI½8Å ±N‰’Y‡’¬Cõ2ÔkŒC“ÛäG+S9À+bmIÀ°º“¾¬csS˜ lŽZBAÐg7ÄîbWZGןâV•ÒOÎé·‚œÕEþqÓÚæüä½x7å—õ„‘5Ö›~QâÖ¨?Ó¨æÛ%Ò¥nK×֫‘ÐR™~íÿ Ö!ä¶1SXɉ½å—ÿ_+!A‰2‡ø"Ö®D ë“àæ¯QU/áúJ°¨žõbúU*Œún\ûé]·å ¾ˆ=¤ä`àƒCó>ø×Yü¶Q±ƒW´”sdOñÕ›K{ä” Å‡VvÊîJ0ðY¼YYni5•̈›&'³9,^²g†<·SïwºšÜKä{þˆ¯ñfžŽí~ Å®³Ú?ýŠØØ¸Abk€ [‚)-ŠVÕéú9N±hlDå#@t»@DÄżDˆˆ¿*Æ×­c3ê¼RÉ™1,³áoäÿ/È…†bÌÖã]¨°+Ò.w` ý×té¢N·/r1ñ¹³ –ä¤zñ[J® ”oƒX¼«^?õfÓaPè-FŠ(¼‡šžuoã ŠûË*½ì´«¡Lª##¥ÚlW§ìl¯±þß #^P³'ö,øŽw6/lÊâ›5î[{²™ ºöÿ«^³ÿSwÍ£ûÙ¯y…ƒtdÍ|A8ܺ;gÊ9“Ã…¹ðTXUä÷<Åö?F÷‚5Pck¤»A½ ©¼ïyðÏ¿¤FàžøÆ¹­qŒ¥¹zx΢\–ˆBÉK6ë¡óÚÞHrãýuBÖäwî“CÎ_€®YËå¢öm¢s‰0‹Rd“¥#©Il|’B¡Ögl³ yy¯ÖÎ.K7³ãbx&¾Ÿ•˜ÔpVOl>P/¢|³l (×IQrê*H:J ª¯À!ü‰Þ¾×é’*X‡«×ÈŠ¯ ã æE}ç½Ý®\DI­=¼› ¦Å§,.õ‚8¨Y[3õpþ6ñÉ£­ÃŠÆB‹ìÑeRèr»ÒÜî*’?ˆßŠlÙ’Þuþ<+B¨/LÓS6Þx%†8XxÎ÷JøELué+J¨xo@°AD— ™÷Uñº ¸’k¾ƒärˆ Ó6êp Ðn›ÉFQª“±ïöj/|¢@¿>ƒ³%c˜ËìÇOˆ‚ä >ÀS^Ò:‚á”d*ÝóõùË·_‚ ¯»¡œ¤Õ{|Û„€¾.‡žƒçO»>ù}dMü¥­O4%4 ðˆ"-óŠb‚q„£õƒ³*ËHã (W•eæ¿‚Sét5ö ÀÉ4Å£ÿì¥[%E]YÁŒôf®zF~µy›òH‹h46‚gb_Ë£JŽX+(ýÿ%aTÂôòÐöÑ:XàHdmkFY´a>ƒGaYèå—TkÑ÷/Ðß±q9 6¨8ž%8ƒ‘ºçUg Ѧ"_wJõã""ë–›ÎX޼`“LŽ&'ÓB±÷×€ùµÜez—S‡ .àŽ•=;L_qʜХí7Çbl…–é¤Úõ¡¨^T_‰ÃiO?²ŠR$Êo“8›vÖ†ñ<7‡÷_ˆõ ˜—HWR Ø€g6Ð4Áˆ@24ñÎÀ¡ùÜ 4mˆ@þ š(”L½÷^yìk&òÍmO|ð/³np…¼5­ ÷ÏG¯8RL±>Q¨¾Í+N´éª:¿¡ça²«»± qJFÿß?þék®–,¸ý‚Np>ÙO»®ÏwÍõrö#«öõöTÌÏ¿²ñ ‰]\ði§Š:¿R=@Sø¤öÚ.ê±^4䋯€‚Æüº}¥é„‹3¼YÖµ œµ<5jE¨T3ˆÄ%‡^Å6Ù\éŸ×¢y¨gA ¥Až‹•Ióaq`wÊñŠ,ÐAùN=î)2ñ­ ÕSY·³ŸGqñU!ÞXÃÑC¯¢J’Ó`7–í_§³DBù‚1ÑÆL+PîÒvý˲=yúĬׯtì^e'ª5.8³[ýd~d\¾ ÅÓëÇm5Ð( ÉB W隆ïÉ„^½W5¸ö•{DÃ?|©P.óž$sÝ|[õ’¾i‰¸œ"D©å9±ç8³âÒü@ÜM‘%m‹îÐ4?þ bB£GÈj àÄßâÂp7]½ ¦íd P_%ôuà¤ÛÀÙ„ hòæWÁ­Š­z& ×MûÛ2²ÆÌ©¤“au]ûÀ™5¼SY$Ïv<)Ûèñi»çz&ûñPJÎ|>ûÀãm±Í%j·ô '.,+2F¦m•Ä  •$ó€Vd…ÝáO» »¼HuFð»)]ì5×—°¦®í„e»ò9¤oïãòâ…ããƒÁmo—KnN€Û&•=`ŸŠàýÜ’¤ò§êwDX[Q'÷Ñ×VH}ô×R‰Ü?¸"¡n€cÕ½k-rÛ÷‹ô£OÑ}3øf-ÙpJ¾4|@]aGNiÅò%RäÆë«Je7´o¢ï­µT…¾¤5œ‹à²¦–»”n‰¥«>ȹµ„æì„ÏA’ï‚ïΣWÉ9:Òp[›ëÈ”ä#i÷Í·Iá¡tîL·tTΆº±¶1‰œTs!ÉóÿYÑ35ÕAw&…iÞÖu¼Û’ÂÚÝõK2æ+>¡/Åe¦pw‰Y¬´Ä£ko놱tÓÿ°²a{*„ê7º[M®k§6ÀDg™ñ5½Us°†Ö] —é<”`冼Œ_¸cPy8°-îÅÞÿ7d£H?RwvDÓò ™¨€%ý`€7; Æ‹E§¾©ðsçQ½ô|i žv}¶y¨õIДÜ‚ ï„#ô~Ò‡]“¢ÉwÃñÈf¶³üòn‘à”VóvßvöôÅom–Ê…,{t’U \E:„¹úÛ¿@';ÿŽaó ¶I¾Œ‹ãu÷9ÆÊ¼Éÿ9Ï«™—çu§î]RvŸjšG,Q¯ƒÖh'ó I’¢7hØT}fŠœßâ¢; ÊA§œ*Ø ¨cËÅ×}³ý¡6«ú0`>ûùŸ„²µ]08ççö¶‘5 < gfMI¿àÎHs#&«ÎD»,*WÔ"d4žr½G¾m¬èò ­¬ia8"žÏú¼fÂëXÌ $ÛCûózN‹¡CJ5à*öµ‘MI?d2…ÍÍ8“høÕ¶JÀô¹–­¨‡‘Wªãê`USÊï¶Óö`ÆOqˆUmfñ…¢‘dª±­üþq“Lì{6¯˜ªšxw§ŽàâgÑ­›_†Ø¶¾ç¢@ü*=e -°˜IHrDÒ*(˜z‚ݪ Ð`ȨtP‘R´`*m ÜDV„ŸåäùíˆáÝøå­…K_Çuu­•\•½=iô¢Òêknõ‡ëí>RçWÇò#$¯¸cS±êLQ”@òÌd£z’½æ¨‹$L¸ìxÆ`¤Cà'àëiأœœ6æ@…2úGLùüZÔ˜ø3]ô K­c1@^îj^@Ö½~#3{b75¼10r ýѨlJ^äƒr‚xÄŽZÌÃ3ûá@ݾ (k+Û$‘à4 ÀRÂë±@¸[ñüMÃU‚Ré58Vßà¡Cš ÈùRs1Ê5PŽ= E=(]7¢_”›œžÑ¾ø(žZ¡£º\§ËdR…“ެ±çð^ÓÑŒž†z¶èºÏu|˜»q‡‰yÞ8b’yw ÎCtß$‡+!˜jÓ[BÀÌ‚ý€\¿"ºÏYhvîRT¨»m®ë²¿ù‘ý|:%¸U¹^Ú«o%£²›ß+ÃàôGÙkï`M÷zE›s¶šœU¨|Ö8QŠz¼Äu» 6\Lï§BÑ719z¡9& ám‰³»z{‹ÜnšÀ-ln”>Á±§ÛjÅ×ÅýËò¿y,ù­Î‰Ñ0Ü\ èb[±:ô^¥;}h8îÈ9è)Œø<õ¢Žº6ÖVdìn5f÷ÒÈÒ•õrÊ¥/ËÊ›`^Bôé9=wX8™+cº9Aˆ1,uæO›ð!~n1YEÒ{¬ i>`V: ↎"¦É½ýŽˆÄ%[%ƒîÂAz󜽶r„^ù¾$'Yçï<™ Üí‰SŠŒÏ¥ ¾»ëg WmÓIVnY×`ûÿêÖaHð]7â3ýà*N…òΰà=ÎöEN_¿“rN ~çi ªÅµô§c4{µ ˆy.³æéH·Zˆ5ÛÏ„6:,+DËØ™oêu2L‰sÑð䣔.*ä; ×™vq'¶eSÖü¾ç%ÏKƒG_¸äCI ¸HW¤ Ó™..èœ^®±n•E/†°L>#:³É¢-’ IÛGšÐ4† wÈÁ'žóû@s¶v%'„¿¤ÆÑÌrÓÝ«R˜Õ¥º÷è2û6±8uÒA(nµd•úb•9ø0•õ³.õ›‚ðŘü׺èrØ3f/éå•ã¢:AËtZòõy ü<°þì8[]ÎÐ9c ‹íðy #\ðO=òßɦ!±£#QI˜EøˆÜ¤E‡šõ‡Ýrûkµ*X:(„4P-3ÿA‹•XMé²õº)ðt¬‘õfå㔪v•¡aÐìkýàDæÝ"×£À¾}¢ž¾­0"™Ös7œ£ÂåÅs¸ø Þ_YË»Ž ^ßþG—ÇcÔÿ|à~á~€Ê£îx@À8gܵ…üjËüÂHœÑ¦ì¬¨/Á`<%N@˜Ѻ\V$ºV¹ÖmÿÄ=–ýÕ¬môjœz²/Ý^“Ä¥õ˜ãJ>`˜•w3>,÷¯a)úï'Áù—iHFuÖ*ü؆¦ï_¤ÚçÔö½¥ã] >«I£w¢ ¶ÝØâ“s§P1 ©à•ö³ù%»MC:g Öªˆ7—ÁÛéýFʵOšµ¹â 몓4h¿Žå)wþ6ëŇþW­«Œø§¹Veö_ì?>¥’@-"£Ô ܵÐlZ0†Xr6 7Á'~¤Ã2ÁlžÜÆ I Jš‰C‘ZwS÷$R«¹Ä”°áuâ{™öóJ#*‚j½¡]‚Ôý Ø‹¥E¥Ù¤ã©Q˜~¿ÿHÌRØçûñíäkÌq÷ó”à(—1‰ý`Ùô/=† Æ“Úʧ-h@AÛåRM±ÒïúTï ýì⋱!­àJ XÛ %qÄÛɽñ¿Þ³(#“b»Ž×àb¸Lé002stô}bÔt ý#³ñû®ìažÑ„Fi9Ò¼ÍÏãÚ]Z!R$eŒ´XuS·4JLÊxß•VyóÃ1}ŽÄ‚iÕá©‘~ F½mr„º]ìCãé±HÏpŒr*µœçB–—gŽ{B¶ÚþÊ ŠùTŽõÈzEšmk³ðA ÑÚ®Fšq·¤ÊÎSçu­Ê‡‡èŒî?WƒKÔj]Á!]ß÷fŠœìyûºd÷”÷{ÂV{ª£ï¼"xf³È›ystŒÃYxøD¥îÍÙ[Ô¯ ´Õq¥phlB¤w[_˜LLußM0žÓ¿»2¶"A’‹³Ùxá îÆªr xjÇ/jÜ^ñ¢4¶âým²»] € Ä1—κè¯w ¿­NAHŠå¨(>½.X»KÄ]ºå0ÐT8¶õ­Ãuh§‘<ïÛ“^­0rŸØô²9åÞÌ´¾ÉBí¿ÌÃLFpO[1¾ìÄUX½.-õTæÚ†Çy´}žyîlA§"ñÈq Tpð+˜¶¡©bäV‚~zŽœ%'_žù°ÓB <ñùkyŒã/GÀv¡—:¥2í‘´Kf'ÕìÛ”äˆÌ åBG½™±Wiçܼ‘ºe^¼vä'8·ºõ÷¡žÿûxàÝV{QÉJÌð ©Öª_Žç:ÃýÜPÆ}’Wbœv{šå‚¡»îŒ K¤ÕƒÜl:=NÁ³ ާ!ìÞa®ÊõÞÞ|à/3j"ã׬kƒ*AÆz]>÷g?_¸‚ÐD‹9¸P~Îê†Îtê¬È¬>xâ²?Ù,ÒëÙE0ð®í•”­H̨¾w#:šÁœ¯ZEÎ^–Ų©bèÜ93š+—\Ŷ"&"Ø»CöN+,OýómÄ–lm.=^’ðÒ÷wž5@L—¶2ßögûø™2”Êk º„ ¬™ß=uA:AtÇþÂdÖÌX5[i&f¤~Gðº<ÿ]¼Žâôú€YÁÏ)-Jb¬ úKP(XP:ñ⤌4“þ-°e‰°ÀE°¾Z,VòôdNoº’cºì`v ׃1‡T Þ £ìv#“êwðR»—‹pŒz-¬]b²´¼nÚç~TƒfÃDF;õÚÏ«pdé7õŽFG“"C…o7'D½™ïÅð¬]Ø•ÏÔ{3Ž-òºi¨M&ü¦Ú ßi¹µÚuÒøcÒ«‚7ñ€5"òH5p{]‚×tä¹V#pòÆ"¤/˜>2Á[¯Ÿ-YÏéÿáÒDôÆÙ”=ûZ6ï½Çƒ`%Ö:‹zýºÃE_.ÉZl¼­ÖL}A2,˜GžÿQÔ½pÀn®ÐÞÿ¢yI(.ÜÅóìû·}báMó¤kMѮ׺tÊxAÞ´Û’ÜôñÂêTs+½Š{p¬†P§ñ€.ö©Þ—è¼¢sÒm——.×RãéÊ}?ÁôИÞõ j©M yÞeð,>šÂÞªÛ| ÓŸ“¼.².d;ðúŠäXÇ;b·pšµŠòUµÃÿÜ_EÄß @ µæT«k®WÔ'¿Æ¦¦]ÊÂbé——0Mf g.r¿‹ì_ÏÐt¥ÑéIcMÝ3™¨ i>4”ÞVáÐÌÝ!ÆÆ¢ôÖì·ãcnCŠÍNkqf²sB"˜‚L\Tt#úÿ/ø§<+Ì¡éo!ÖeÓw÷'Ê/¸“0zÛ!m¶˜$·#$-á\M{„væLqôÄeŸIf Ð5…¹"Ë.·þ” z#¨^ ª§¢i›M'Ø¢øõ›¥ö϶;~Òùªï¶§h ÎX§‡âRˆ©Ì¼úˆd#÷vÞl ±xXÿÍ»ŠRÍT½Ú˜Î+¾%„š+K;kpDCQ*ËÈåp>ZJ•K«°ÊFX„RK× æ}oÉâ½~ßq(fxН&ØBÎÜžë°£c•‹‘@¾AçKx“&_ªWþSXÜ“ ‰}…zã£7ðMˆJ¾Žñc-Ï»eä»'‘²•}^ÚÐJMCrAM&Íh<Ø›‰>ðʉ\-6ÿ‡¡Ï²éñ¦(ÍYC F+>D¿+]]çoQQeü.»û²?&,m!]Ç>ßxûÅEå|iÝüwÙ‰m8$Ôt”‚ý½ë@¿);¾ÜŒz¯¬Ëë4Òš§ö4¹)ð øÿÎa  #ß`[.\žx¯ƒ–䯲gÇgšË {Ê%zï½¥äŸ<:ð)ÆÅõ>-·yÏ€Ç3º û¹ê:/ã«ûG‚²Q ¡$­þ û¨,F ¿Ä0ÂÏ¿äÃßÀpú³ 3˜!'ÈÏt¯°–„œŠQ‹l TE…Ž÷è³¶óœìŽw^ù„-ËV¯˜*²pÈ–DªU´†¼ØakDúl4)„"É”ïl0ÁWJÞ¼C…’1ÿ_¨J®úÓBY§¡ÒK´M„JŸ6j¼§B¦'”{SÝD1±gðzÀïÇ^ØTT17_îòåIѬ†/ÕèÁŽØoÉ–9¸aÒµ¢µ÷Pb‰ÊØ9rœâËQ]óÄ”©tGjQ^?àq¦¨-ZQo«Üÿbe TÜžh”^‡¤ÏÀäÒ…Ò;ÙX1&M+NE§³Oƒ wøH0j×Û+^opøJÈ,á k˜~- —'ËÐÚΗj¹Næ±3À›x|€òuÚ6`\õ•_Ç£2ã C¯œœ#ĉÅÁ_wðvÆ¢÷¹’Ié8T@lÜòê¦êhº½õ¯·Í”W¼OÞÀ%4¥þ¼@ÑÈò S¬w“àxsø¢Æ}¿kÀf6}•?DëÎ'Ò%ƒD­eʆ\¬P^^2¶nDŽ18v¶^\ÎXÝìÑ}çht c²gc‘GëÚi'E® w\LÄÀ´Di ¥[‡‘=ƒIRTÅ'ÖÒB8¥Ê¨<Þ¬{TI{oŸW஼Çî-ðÎÌÿÇý´m䦿ÔìXé¢Ï5Ÿ—b­ÆS\Rþ“éÿã"X‡›Yj²“6àîÿ)sAÓ9ðûïrÒœu þÊBÅ9=cžvP«h’%¼â,ˆRkšõ¹pÊ«ƒ1Ø›ˆƒE¼^ƒ“¶qç Ø•õm”^…„§©Vï[ÎÄ6}KÛ7‘§A·»[/3$À+@·[º¤É_Hû7iÆä+‡GGn@[h=/ªÜ|Jü¹eOGÈ ÿîaÒ1ç,6iP»»û^ qi¹kÛÉìNŠÐ 6´û°¸IÌgRws=/ïjnéÈ;ä ¹[QmÑ SÿD1³¾Œh®‚;¡!ÛÆÂ$p¾®ZõD¨ =»ÃÄDpNvDøÆ°‰%d‹.ÁºäçÔ•fåm”3mLpâ€Z çœ2ÆH8ZðkåŠG‹’™³¥Ç<èNóò‘íãS\¸×i0Œ"RÆ89̬;Éè¢N‡91‡ãU~@¢O±ÆÊU»p^ñ­ã? c@3‹vT³sïXC熓!üΊYiÄ›\Ú’öN eÍ2ÙD„‘îïxäô€nôÖÜ_x雇æ@ÏÄkiu­ \G #=#¢ O…èà0—cÄËS¦Ëo8 Cßdäö“gDj W éŠjÝ ðÊîÈ+Þ¢Ñ0ª$n äú.»DYÕÿß×y„,¨¼tXÝ®L(ÿeV†Â^ è,æD³öD\tâWú‘Ÿ^q#å¼~Z¹aèg°kƒA‰TïšYêÆVmW+N—µÆu Ici)V,n'7õ¹¼ëïŸæ-œôúPšBÑ’H+‡‡W³ø†úžïzV=æ «½v¹©ü ©ŸÆf,2CKlNA /Zn¹QÒQ8GÐ:d¤S·H¡M*/É®V©X_g%ìú«&锸òùD¯ÿ2دí^)/@r‹ˆÙ7ªœÜH_Ÿp1„ô15^¥"Ætƒ ÏqØÒtw(mÀT(÷èD>ÇäGùz»u5$§š3«?ãm¿ãrGwg |ª PU$æ,иˆACê°Þ¡7Ô: pûec> æ –´§ܽ$½Øú×nÒ¬õàλZÙ¡­K˜™y‡û±SFù0S1MSÏK¦©ük>ìN]â“Ð miýU¹Ž0EÂti´l9Ä [õ=Á*örôiþs4£œñ”CÁ$?¯k­ÜPEÑOžÇ$&ž¬”g“Ú,ÿ ç62 _µ'€'}O§v€ÈË£JOcð|ÆÛK¤®”BS.mU‹ ’™ßˆåGŸ‚ŒÛƒ ê· ìM¥æmâÔ¹> ÚUsS".c)!Ù%®æúö×òçøø‰å>51Rršs|y7ï…rW¼pê¼f¨ÝÖôcm÷Da+.tKÊ]7m,èy“'B¶oê¥¤Ñ ]·ÃìØ‹[\̘ŠÖG·qšÿ/ÜU·Ý6UñžmGÒÏײ½ôýVJg˜Óik[­_z>† ¹ÙÐÝÄó/'˜.Ïóy;Áô‰J°Êrdêq“Òªÿ©4¬-æËÿÈjT±&©z^™M×ý…CÌL7brèhI½´5œ¹ºÆ,Sÿ=X ÒÊÂ)ý¬Ï‹«Ñ^}¢8…—üòPŠõøÑ‰µå¨dAç0ÜéLðÝ•5uGÖÖ­Wö/«Nêæ\\/ûŸÏÕøPÞòa1JZªÑ´~«$û|±ÃÜ€Æÿ-lª3H¿y(ݽ’XÆ”úšOë;áâ%bÙFÓ¿q;ŽÌ2ºÌ*Ê—‡ab"RõÏ eŒïý–³›~ª| æ‘ÿáp©q¶ÞÓº·4ç3­Åµ¯—Õ•$¨ ¯Ž×™±’1‘wyd$FÚ0ü}Õ¥f’h0-+-u ?L‰ŠoW; bì"|L‚Ð…Ó[á7¶ã¤È³ùh±+/M°¬e;³á;ËÙ™LGÝ™rz{µ‹ú¬Ê~ÞÅf«XÞæ´ÊR™Ëlæ³DWóúz¬xÚd•úùub3‚»o÷$;xÃTæôÏá+¸ót Ž3F YÔ¡‹®æ'.¹aí«ùóPtGWÚ$5)-ÅLº>·&&ì&€{]©ž$‹ÇXy} 5p‚rˆö–‹BùŒ”Š®à,¢‘fëíoAÌ+'LÈËè¾pêÍï]í€n¾ôý·”¡©ïEæ»<ÄÕÖ¿3Ëj]Éz«rÚªs¨’"ÚïînûéæoLmZrƒ œ½¯|‡«°u=º“jµQŒlR½„5žÉƒ§ÞÅã•Ûì݃wˆ ‡Ê ¨Oi„©ÚM“ËT:¡ó !òÒSÆ¡l{'üm˜èá’­žñC "%Ò¸ y6G/º¯ð4‹ÑmŠÖˆŒô—+a¨Ú F Eõßmè÷ aîCz"x‡ÑÂKð^ : yÎÐh!¶¥?‚uÈ…éõ‰ÿæ"½þPGŒØ©$ ©pâµÈˆ R y­›Sš¡öp™Ëró0!åm†ï*îeÊÅ©~< âB)Àr¤Q];ÙA5,£9'Ö:{eªC)”ï1R €ôú>hÊœ¥HªÓdèÓƒõ›þ¼ˆçc2í÷Üíº»>ð-ý}ÚѾ~ô”u$UNê‡U óêj ÿH4ÒJÇs?ü¿4îgŠÊ£¨þ=”<+5$!¶0z˜š èË~Bg®ÍÄæõùÍpVŒZ¨¤è™äÇÎ홉Lj¯à)4 j=cvGaјDYŽÕÌñ­,ô¦vûýÀï[äf˨d|. Z-…óÓÈÁbB„ŠÌp=g‘€$0_!@§k嬊\àã.&a0Ž¥xÍËþ×ͯê¼oj#ké'½­ –CVÁtLjswxÓÙ½ò<¸8ÅÖO’>ŃyV“ˆ4ªm•§ŸÄL}ü »ËzB¢.h—ΓvÑéEáèªG<ÁS zƒM˜ç5bF@»5 :”ƒÐG¨|¢dm½ë»Ÿçúƒ»¾µOzÿŸ6W[©Ÿ÷S&õžâmNOd ([k¯#–ôÇsUY=ö‡²tï€òqôVšòïL\^ˆÔv§>ÄDJºØé«?• œò׊Î1 2˜Œò*~Áeç$Ý£ò]@;(¡¶fŒ5$2EŒe~¦ËÒæé¯[œŽápý³#@NAÌOèðˆzîò0ÌýÿÜý_ö—·  èTOQs\—nÄ—½Ü[Ò ÷VÇ~)ge ÁiU‡FI KÑO¥N´àËuèé¢âVóÛHD0Œy˜ ïàOƱKs¤:ámXlfƒR ‚(k¥$ìì!,ݓҴ…kÔ2ªlß` Çþ¯{™žŒ»Š®?Ëß•1€¯iÐÞ[†`â:±p2g­ÈœÕ„é£fðc¬ßÕýD庳·rTìû"*³ÿ!‡ä<ºo·1~åÚ¨ÙõÛƒ•|ÖE¦Úk][Þï²Æ!MÐYŠñ ¤†*±7N„BÊÔg¾„»ç¹ÛÊõvs0ý?b£Íò2` }úÙ˜ êïüI§4~l#¾'½âé¡LÕWˆË ‹H‘“ â»4l¬ ,§ÉÒ43¦ô ."ÔäH›ëçoãÙ~É^É’d¶ù8Š6ÍÅÄ×Û6O‰é7«Á‹àŒå»,IsÜLÊ6mŒlÀz-Ó ¹—Õ˜r—³0p=*-þ3ﮆ u -/v.C©E#¢d’´@öUtóYÎM7÷Á’Å’;3ÓCZðòóö!­Íõ?œëŽ{3.pÿñ6AÈ÷X5+¤UÒg‡Ý޾äè¿i&1ÇÇ0äÊ`‚¹3¾0‚Ã@„8\ÑlzKq#íûfî_ ÂÆb&T+˜´7Æ’^|¶\ôÆYÚ·Äí\1-¼Õ¼zõˆÐIÕ&Uå}9dÓ»q‰léÔb ˜•”4ã€åg,“GOåÅ ƒDÜ›­N×¥–^˾`)gpL5)¶Þs ™@Ð3ïÍ.V2ÍiHñÇÓ¶$¢Hxmiå¹&=ö{zÖÃOK?HäÒod»­KWåãä±¾>­õ)àG5Gß xºÊ®®<ˆJ+G®ýQtÒ¥ôU0¨É ·Æmʜ˄­t¶Óü>o yMÃ?¿µÏÉ4ÀV–ÜwÜ*¦þ:µKbî!¦U‚¨©XZú,¯”³¸‡êLqio“d#q%‹Ý†, ò;›GwÚ…¥„Ë&¸Iù\ôaó2¼ËÊ]ü°Tƒ³Âˆ¬Âó”"c¨Ô•nÑU“µ û;iKÿÒÆ=À¬‚R¨žþG¥sØúß|{1̘¬´~šQ|ÐLø¨e’pA’'O©ØÔšÿòí¨';¨n0Q3m¥üpp]aBð˜e“§»Õ$¤ ?Z1çCK¸žÃÔ[ü<¾AàSûF¾Ð®5švϸ̲-狈AZÇ’IºŸ›Å¾,0AÚáŸkFT_SH!à¿p:jÄŸMòÒJJ®ØLqøw™¼Ã~Ùþ­ï5—«¶×1u|ÀÄ4Ú5ãŸc0¡e‰Ã!b}ñÑ(œg‚5Òͽ澕öJ%­|àmQ¿¹ŽzêªÔâ¬æ1¿n@‚°@›×ŒI\ˆÓ¶.1··"hı¿Uäÿ.·&¬Ó©‘H°ÐÜQb”›Œ—Èa­Qp=›Ña?‹¦‘{1›Â‘(Å´nòÏžãd\R¥Ô÷$”ÁÁ…!.ç!þEyiÙ©ºì´ ‡€QB>›”Ï ·Õù¬[©'LÖ(@/È>ÑÔ;²î“ØqçN^̉^lÙ»Š'õPç»>J ±ÙÅÖ´‘@º#†hó£É˜ó›Íݶ3 ƒ)ýR±ñ¶§ã’­>ªMŽc¿:‰Seÿ¯Tò—l¦?À}³v>}+yÒ—KУ€ª²]´¾ÐÍ'V@åuœ–j"âC|é!1½Ú ®Ú‡mˆaüU2Y!¡Kæî§·wRúckŠbQBŒÓsòìÁÇ  Ž&/Íܦ2а`!Ÿô•­F«•Û.3Õ¦—åÒ\µðüùˆÖ,šÅ>AW5¿ ÿÞâ>Ê"R‹=fßó|wí¡iE¼iGuúh í;Y1+J#«sôy! ` V§O¹ö·?dï¥ò£°Ce¥w¡Ùߟÿæ¤i.*¿}£‡k© ³‰bë8à=Åàn3”xH–‹ÖIΛ0dÍÕø„w^Ý@ö³ÒºÉ²_µÛZ×’@ϺK-Àaõ9'Yê,àûÚ³Øì™28Ø5òd@õ B0U8³ë‹Lœ´jÜz ï‚€|'{œÚëe¸t<ÊS*a“gBlªúÞWVðÂ.oº|¨&æcíg0„‚ÉWp; ýC"± #Ré Dy:„ž¹Ô“~Oûªÿ2Ñp_õØ*‡9 \»^ .€Â™Ì<–ÿÉ® OK‘ž•€9Ôb„€§ 'žªÝ (½^¼Öo¨nÉ„6e`EÜ]îm›Lìk ¦ì”ig:FLF¼ÿTQ8;e¶-4‰ˆ{Ýw“–µfEñé9"f)˜ØQ®s¼Où“"å/m«öß°ü¿á¢Å;a¸M;…¥ÐA–üŠPz‡VËŽ-³Ê„¢Ézþá_jDà9$R{ËŠ9TÇFÖðä&i@CU«‹WÓ«…¨žÿÑã„ýŽƒ.j„mk¯ ™Ã€<ù¼Ä¡¶Û‹;?cö»‡yR­äŒÙ¾ÞðI|ÂðØYËN°u*XƒY!S<†„€F”0㮹Ée´ â* ('bŒúVûí;ç¤Àxé9½ŸyÑ¥Û²tr¸µÙLéÎÜïa­JÁߢ7&³6 ªpë ë±wy(²—‘ëN § Yݰ·ûÔšï%\¿QÀóZà¢B ¹n +Qø-Túz¢Æùj¸¬UýGH)î‚åÛÃ` õúåî‘YµàžÎ–xÞu¥Iê\$þ¥6eHA{]Äs¯sÔ©;8‰¹þ'-yxŽ3q ivЂ$õe}õÏ+¤¼áyžS:™ Å,ï‘Bo¿·~!JC¢Cϵ­Vi•Þœ÷ÄÔ#_£­éllóÚ£¯m8Äû§ÝvO£‚%Ü|A¾¨è`2Nƒ/Rî]qo!Ä~о€#»”Ùi978 Xr,pàË÷ªùµÊº )ŠRâFϦ=ßÎEæ‘ëÔ´ïo³«p2œ(l<òLíMu‘äüTŽË;xdgp(ÍsÉIöã4å(Ö.±ï#ÍéM»qâ‰ýAšQW›î/fÀí½)£(Yñåʲ’dì=jÐ> {ʃþ ”\¤ŠK÷l‰·GÝÐkÐ75aÑ#«¯&ѧ…«y*•ìê=Æõãj2¡t’¦ÃÉùt×9ôƒ ­ø9¸7SÃÅ€ºiuÎåeSWªiÁŽ«PÝ%ä•m)½À´¿Ž>q4ÔT>ep×õžáææƒµ; ¹¨Ý<¿WÇÈá£^¹W\¡ Å_øäU²g?áQP o¥çùõl /å\$Íãà ŸÐUñ˜íuÚ¼¼¢mUŒ¾ºïogÙÛáu©ÆÔ•(Ï£š¢L¶×—ÅèªêÚn~ÇsùÅí +r+¼DŸV’æý.ë6sdŽÃI™äiþÇÖö6æ¿”lxÁ4|áÏEßBjðÞºj±žÏ5ØÆ‘t-:´•À”|5(°¯WœY‡PäuñiÁ£nË3Ò¾RIoO”¼Žÿë8Ò'Ò8‹VZMCôÐ}l¨˜2O+äNB½Ù0­t6?.©SÊH§\^!°°éÈíÏÊ«mîw±gón{(žÜ8ô}ƒbP0;zfb‚^JFK;k¯j1b~ì.“.a{€m¯%ç¦Î±~‰Æû°’½À$B“ôni‚ú›i~©EýcA IZu¯—P3?éd³²çÆê‰˜Ô«}Q_X“mq«g0¶™ë?=õô—De6¹QVËd°5Æ¿ 1«¬åñV„ våg¡«¨¹K;•j)‚€j¥µø•à°e¦qÏas\‘úAv†2Oi©‹Ôï+±£Î Þºó^Y,ühË?@¹ ÔßÂíC¨ë›ÍÍ-+´XDÓ‡„_ìšlž&ô•W?t5¶Æ.“ÚÁXÿÛA¡7õÚñøúL&¡¤ Ëdn&¥Çjn°{U•"†:cs+|?²3dÍ•@ÁFÌ} 3¡7å¾ Þb뛜/‚mÄ”$%3ÅaÏsc“ÅL£0o´—O×f…Òkúˆ\¯A®ã´#ߘºNÇdm?%¨£7ÅWä­& bFîͼð¾Ó@¿®* àd Q¥ƒÐtz_5Dß5DÎá¨ä^ >ÕµrqqÞ)ç^ÑànK‡Œ¥¯¼,îø!8V†y)ä‚Á?æÓüì¦|ÁdPà½ÜY–ײ~òŸ”x>Ea£ðÕ=Ê×)]h>*÷>(‡õÅÄ—€+\iþŒ¢ôëì”Î÷ëÔäLstC&‡jÝÙÃ^ÒçBºLØ ?)¹25*`ªIñ¦5€Ö;üÝ,NoÖü@nëØö ó–fŸ-ƒ¹áÉW:!È¿÷ú„Í{]ñ»VÇ £*¢} +üLÉ×D‘×E,QÁXTétÿakŽ´ý³r¹>ð›x};"Šü#£‹H౮푕HÁ5Ï;åF÷7»Úó£Ûr{ŠîÑ:,ãDVìÎpÖS®¿{qêÁPt&?µŒ˜X0êîƒ.e`šfQ7Mÿ¸ŠÏÒúk´:ÊâG»Ø&åKoj¶ÝÿJQõÜ©b½>:Çû•†+T žù9‘˜O¸i6 „ÖI‰µY€Ù¥6c¦9R¹Ì¸&­«›Üqêà½;Xv|ÚÑàî É¥ðaõr´w&\QT®¶ô”ö_±BœE1§ö¨„y¨:¢ Ǽ†Éõ öðÚRýÿ·æ g\î­’÷7V©g§`]Àï…eƒ?„Å £¡ó6väg$DБ† 1 `cNF处ÎðÉÓàc®.y“{6Ê@ìNLqû$Ì‹ Î%PA‰˜lQ•çÈqÚ`ô Ž4½bîD‡EtoM>0èò¬<´Tt´V¨ä½b$LF˜¶Á†0%aôjWv·–å2ÇÜÎÐXÍùQ—Fl-kZÜâ»d‡µßÿn•a'˜û!:ù;4dXCBÆ—óéŽõ#Kqw·ì6̧*tÉŸÀ¾So¼q³*ÄøP5êÇ ÄœÊÈUúIѾï'™¸m!óÞ_;¤uh) Ñœ°j;b¢…tMÚÓE¬X«}›¿Úÿ^†ïH[¥º>xö¸]íRa } °>Ô–³•z4¤íI?ð„e=KäêYŠÓîi¥8(´ðl;ñÎõ«iF¿.VÖFzú2T‚ÿ÷“ej‰^$ËBcã‚ÍæÖ|Uú~ в ßàvh¼öäVü¤‹Ââ­nCHAOt#…Jæü’e UÞGšúÔ ƒdˆrŸÜIß-ŸÄm+û;hÚYÎÑ( —Ç¿ÿëüré»íÂKsCCÁJ™—‘ÐR5.Ñ”—Gt‡j„·¹3›…æVkrSZ7ŠøƒCtxÚ¡‘&Lƒá/7.²E˳šùV颂‰½¦9›Ò9¼ù¬NÝʦêjñÉV¨`ÆFq•re}Gg×h—Ÿîס̫¯UA2³‚B7ê .±MÿoᨻÈ@‘ç`8ÖãÚÜÿçPÚª+÷»uı£4}ÈCnGѹx ¤ˆBI+†çÙÝ„ŽbK °TÛ¾S(ò•.p{Ü`ðJG]GØÇëjd¯®:6<­—“móÖ4}Œñ†(IZh6®C'.¸óK´Ãù°¦1é"É =@¿Dm¨4éÂóU÷wjAAˆd_CºÓŸ¼4S&\êøÛz\5÷—Úŵó*\Ä)V¼[‹¿¿‰ j)¤ß9{(c·_ý§Q•÷G߯SyºW\þU ,XœÈæ+І#üÁ5é ½™x+B7Œ¢Å[üîÐŽ¼¬¶SÅg‡‡Ü)ÒE^ãyÁì¢p}ÓèÀâlBæÄŒŽ;žf|T–3ôþð+Ö~þüc¡  :•ñ_Ñ99ŠL¬ƒGÁ5˜hŽn&çc¢ŒX襹ÎM׸—d4 ˜b¯6ÈöpSVSºœâq$¦F±Ñ¾Š²P'Z„0¿«¢©­'mMY*]qdƧ° b°Œ'¬¼xÉ‘)Фµm …FT›+Òã»o³›lÜ~¿µyÉX×ÀBäýY+±³îDùÓ†€L‚*¾í­j¦êuºï2ãÃ<Ú„sÙÁB¡¶ç+ÓÇZ¾Àf²Ö‰¨Ä°§¡Ã/:¹ÞŒë} µ•$efÛ4Kw'û5Òaù:«¬'Þ#t®áöÍ´ž(Dô_üž–F_­á©!Ø›?ςܗÞãF/Xy{!æÞBy¡SfŸäxÏê˜5Õ¨ZÞ6 kNº›¸éÿŠý"‡îi‡ÆÅY:iN±t­@ñP(+9Ø£¼ýùt¨†Fy¯§a~ñóG­9â‰Úž©ž-è 虢)LÄ/NÁ%1íViᔕíaÝ0og¾y@zóo4Úì«÷uU½¾öEC?]Ä(”ÃÌõM!Á{dûݸ¢Âwe{Q¿¨{òAWçÎyÕÀ4‡gÏ‚©¤;ìß/:B),Eý·ÌïÙílÉE¤Ëom¯MÞË밫Є? ömž,@ÚÍǽf:$6õ :‘»'´k´ØAiÊÊ|~`™W©½`(LxÚ]Æ!Z§aðúõL1^¸¨óÿ%sOy0gmƒk_Ñ›ílÇßtT…u‚ s]%‰övЊDëG¬g6WïÜètT!yC{““—…%û¹:Û2G³¶ýà’L­x’„Îoƒ~‰Í9ÎÚ¯D­¤³6“ADؾÑP£ç›j–ã¤^ ôNyZáµa+Ð[å.ÖYyí¹»DëXQsÕf qfÇm³ù4×ÏÝ.œ#¬&ø­Žp¥/s±â•ã(Z»íûÖ,g¥@@ Öý–˜–ÈÕÄlp“dnS$âÉßò‡ïʼ²ö.¬`Á¶,å@:V ßz0e´L}(6jÈ!†ä™tÛ©ÊÑ$ž>݇iÅ•ºÇÐ_ÖC1¹hyßá`!YŸ"‹á7ŽŸp€ÕøÆhÌ'©¦tH'ó|ÃŒeåwÑÜîß* yé Q§*ÃD1»±‚BÞ5MÊõ xæè l¨“{R#–­XŠÞµglßõvú6@|ä ¾ÙB?í§~‡d3ô–ÿp ‰ý{G¸HÅ3l€¥ìdOí³ô©êªC¦îüÝ'v QÒÞ- / <Ô‘G‰H³ŸÕ2u§VÂT‰:IqÊe¿õf-Ja¯‘¿u+«w*UfD÷îöXÚ•D”Å A΃Ʒ¶²…šçéuO«©5C~þL{+6¹’QàÈ*äùȃÜL×+^*…F"·>n§“;®çtB4£i2m Þ4¨Ç.20þ ýu/)ÎÓfg“ ȶšÏã0¼¥XH¸c—ùÝIPÖß+D†âj¨ÿµ„Eë±K¼Êh?=Ï*Æ@%ì¡AQÒx—zžnª6e„Qßs†:Ô{HÆtëÌÛy¸*}ÀŠÑ_ṤÅÔµ ¬ŽÚÄ¿` ¢uûJ–¹^0SóŠ>”DÏ|ÆfµïÜÌ>| µø ^¸Ô 7qm‡¡[>QRÙË€Dg%¹Ž¤ixYiÔn$ð^£¯ÛIwGE(`VvF¸SðÓF ø)ÇyNJ6 ¶»ë‘ß³ÑÄï±0Xij9“\ûF`ͳ…Äs¿zº[[ƃþ¦¡|m²>”7ÈíÆ€ßÇDSÄÿ*kîÒ»}è³Fê-êäC]ðƒ¼âEígä»ò–ãáb¥]f}?œÒ†ýÄ&$´º÷dãÃ7Œ5©Ÿ1L¬G³²áû9I•”²#ÌêÅ÷[£Ù‰(ƒÒ„;)9{æàhBÔ‹ußuåHe¯iNvÒ(ßR!œçó2g©ÑÃQSïsÓÛ0?Ë”—«ú6èÛé]äì©Y,éiIÐÜUï…ŠÝ7¯v¥³¹‹ÞØ>Lb—$Sæ…U›J¡Ó~G6WçЪ<ÍAìÌ솽;d¢èX1Hp/¥2{‹¡ÒN}ö`©á0»‹æÝ‡Ðκ±Èè|4Ãê97ˆ“íwRÜT55vJ#z½µ0€myÖ’Þ.S·{mvÚ"y3ZÅ¿˜nêÝžã¡uk5;ìৈʵö;Ç­XÄBJ°8f®ÔÜq½ôµŠyÇ]ai3£Õ¼¢t>J¸ÛTñ2©F°â ’÷ØB9@< ¯ã yö€øUÚ^‘°#ƒ “Hx=x1ï°QÊ…4£úˆ"/¸]™“lIÞ ×È8?)¹²î×DˆÖ ~vôòÛŠKœ•̾/œ×ÞÞ•¾ªœ Å’®óªÉï½_œCª1y‹×Ó£¥`H’ôL³·6èø÷’±nžÓíAŽð…9Í=Ùæ$ºÝvDƒZÉ]]÷Ö{“ëp­Ž†àëZÁÔ&?QèEƒä$ÐDKg7G¨³S§€¦øTŸ¤–&A¤|±ÃãÄ¢AÒDº’«æº¾ mÆHÁùÕøŽÂ=‰Ðèm+'Ì} Ò¾”…;Ìþó=vUî”Û…Y¾?ÇŒSžpøN SNz]i0 (‰¤¨+ XˆŠ³ìuv›ùa(4Ïmsÿ ˆî›´ª™ÈXb7¿²×œI{WWÍÈîªÕ@à+á@NëÜ {𔸉Ð;_WVS[9*dùa~Ð…j}zx(U­ñær…CõygïÅmDüÆØxÃçLpC7!Äéòd<ÙnGS… OB£Ù„à2½SCÚ°¤‘ÈÖÏØ¿RGà­3Zmɦ™bµƒ î–µ|› ¥ôÌœâ†Óû+$øçuä%Q´î{9¸ €[d’:Îh\Õv¿W¥õ8³ð<8·Ýý憸÷’qøäé – m6R=J!~@6­L„"ì8­C!b![¦_à>–¢ž¸¨ÄÛ›ê7åÁZJÿ 4Vr=ÖË‹çÅ7*V‘©+_Ù{ü‰ú^¼ÜÆäïEhNÔüv1Ô)*”É㻨YãhŒ¯oɈ#o­—wKTbm¤6Ñ Ô*†m³irŽf¸î£´2j\ó’…W£×X;âØ@Ø5ƒR¨6ka>@ë„ üÎÔ<ða–>òàü U‹iÞÖ  %ÆŠ§ê G ˜0Û'ˆé”âoí—Î.w|S,±œ¢‹y/Wñ”3¡Me•Ž‹dƒÓe¡ ˜ŒTÚq]á8¶v’o—“ƱƒnNšMá¦`àù» ]¹ô¶r ï¾iÔ @,Ô6}Üär*‡é‘K}õAÞúR'ŽÎ¶ràÌ1¯ÆÃ Þ÷X˜Û J]ñihŽÅ!)ƒ­=ÊfÍ+?Ô£QëFað%qk-ÊŠõ,æÒi—œ~yBõƒ²ËgÅ,²PÆÔ‹ mUGl" ò`›þ{SÎLˆŒ•¤èòø´ºË¥ïLÁçcGª•'‰ÔAª“Ånײz™³îºÆªc‰?©Ù€R,ÝØã047ìšûÄ…ŽÓÝ’ãã)³K4Gä• ã‚˜‰j¢ ”€X%p܈ýJÂôk$ÍݎƾHbÞô'¶˜¸:õ êvwxVO<<¤¦ ’—áän0‹¿^ò<Ê„ùÖ¦÷su‚îÄw'I™c~ž&­=g¿Ó뾄 Ùç:1ì~°Däkr6n«õM©ñfJd3Ž !þçðqmÎÜ-†ÕÄ–´ÕŒü»{*UÚºúÁPÝÞýOUU²ÁöåÝ®g“\Rá)ø†Y…9Äþ&€òTB¼)½â*þî°¡NOH;Ý™Ô!”º/¹‘÷k5ÐÜ1RjArå1`ó­f^Ùž ~P¤?X²Ö¨ u©múþ¨Lê×vÌj4Ewé‡Ýu¨Ú0¡Ð¹.ÑѨ³à1˜³íþL³äeÚm’$ ŒîØU~Çc©Ò´ðuŒÝ˜G×¥b?ÁÉm2‚$:nœ…? tY¸ßröÖÊÝäÙ*‹f˜JK†x¸Ìô²ôfP0ü+G ,»=N @×aÐ[ô¹¦„üå_u“®e)”"^d» ÖÃâ‡Ù4Ý0@Þý©*û¦ç”ƒßdþ<¹²e÷ÍÛ/]êv}YgÏ“·@[ç ï0œ].ç†ÛØêJBSZêÞšÄ*³^w<ÈCDb&9þ>èóƒE¬Ñ€¦ÓUý~¹k0^„í˜÷_:l¥ÓA]vPF4¸Ü*Ç¥»Sù£ 2¨xßú"O­z"¶”vt€¸Ñ.}1m®Š¥|P;.O\éNþàÚ0­‘Ⱥ™2<÷eGÂM`~@¶,QØkg&uæðs ½É·±†×ïÜKdVÄK¯B‹FÛƒ×ÈÑÊp,»g+8¿wkRuThF+. 4Ú2?Ân"a:]M0÷±kW¤Íp ÓW¶{s0ÎǶ³7pW*©"zÅ+ lm%Q\XDý]$ó¤ ›á¹OÛeX «X_5aü™|]ü'¥«LÆÚµßFóÕu1l¢‰üÔG@ôÑnëñîíHŠjâ IŒ¶HëZ9KŸ+û»©‚tìµgž¼|Ñx¶ñyí—šèé¤c©{N§«j,Dfxl£ú2ºÇ€‹HgcUªŸ3lnj_03õ©.¹ßî¤çé„"ã=d&-¯A½éKCà£u¤,Yp.òÄ4EÅì{`½çÃBõ*Ã¥„Jç_Vpȸ ëݲþ=(½ia| T¾^×öƒÑIM߼ܗj³TB»šZºÑ$i–«NVË ÉYnæíÐ+²ßš|œÕ°{ÛzÓE`r‘si á”Ù=ÆŠa)E¢d¨©ÐßÕC]Û—ô)W¼«}k@)C£ôU‘5æïû ¥éÃP˜`ËW'6:Å–Ê—’%L½J"Ë—žok›Ð5žx.…/QÚ±ï²ÂñÎ]iÕGW+e¨¸´SŠ÷ú@H– "ÉRuãŸ>‡%ûèå­Ù@¶ÔÑsqÙ›œoX²Y!šøOjâÝð,I/µõ‚ç9ñÑ£ u,½\@‘¿§¾ù6Ý¡­‡¬ú§ß|Û4C–~Œã C)“M¦®C‡ÏlUtEíï§>ÙNödŞ»êsQ#§àeͶß7%žÞ)}Ý×-õMåúRåfѯ2IÞã¤îù ^°V3¸^:F6“ÕâÖÀSSvçȽï5þ2áÎ2Tðõ wÂ$[¶Ú¥Xè“øšÙ‚–Ã(Ó|l¨”:Ĉ¼¤Û)Û®‚È“7§Ãý@ ,BH™tA{cÖ›Ëçîqså¡}|‚æÙøçj—©ññ˜›ôH$›¢­ Z–˜»t×DÉ«ÊÚÖ&œœs°]A"ŒG\ûJ¨¡Ebýȉև]Psñ‡”KR§ùÅ, 2·óí/`é²}mù®;›Jé§nú³ë’cv QÛº/¯´~”CªÃ<Ô¤»Œ†)Åk„'ª”¦àvíÖ¡et3njÁÒ>é½£Í,’fÄè ;•™ûú<‹Ö à)ihÂï¨Æ!Àû ý9ŸØáLÍÙM\dÖ±¢VE¼„g2.ÜUãîãCÜ"dÒõBÀ#øÈ,¯¯mÁ”âb$v–ð<­U"OÛËÒÉÜSõº«#À3Ljˢ8.êsîa©g#Eî'IÌ¡6c+4ª¥ü—Nž¸5¥YŠÚ˜º\‡u}^­«]qä·[‹q(âw©sìl¯þòi¢‹ˆ‘³<ÈÅßa‹•ÀIÍ—×F—‹l:ÀËžö¥Ùp- «HM¤¬$½ÅWÍ^W¢BÞÇò2cpæõÕ¬x*¹%]M ˜çùà×ÓKÑŠ¢QOJ—X*ñpÁ.þ€„,?¹ÇO@ÝÌ…û>ܦ0^„ÛZÕDÔ—* P!lÉQ¸Éž? ù„%&†ë½åÚ“ÈQO©IIªá®Óç€ËÏ­tWvœ‹/QÕM½ãî´ŽuHkJuäC‹Í˜\D„»\£_þ{:|A¤+fuj"šzZ ¦·¥NïkŠÈÁˆåÃÐÁÕ[Ö‡©€:§J`À6s³|y°š‚<<Š£"¿¢é·wÒ½\ß\UÓ·?˜·:Pîl½Éäõ@\sö5ÖÐÊX»GÔ%œ9b ¶þzmN&¢s?B¾Š+ ‹EsÉ,ÉÝ1†qóÓÕÇÇWÝZÇ5dçÑ \gJªymãh†ªP•[B+õ™[oŽ­2qQQEjï*ÓÑo£ •ØùÌÏ{*UÕ)'+À`¹ŸcB¡"Øìßéµ½òn˜ì¥¡õ^£×íÎc­âÔ£¾WäZÿÀMŸfX;²­X¯i]³ÜS'K5¼@êÜ™;ó»—ì£÷uc$ämÆô¡<å&d3ÉÞöôm8©Î½™;”«æ0¬¨{±Näl—~¯Q*v–òi¡}jx‰òM8ËŸ XoOS$ûøö´öÁí0dF0<Žìp¹¢û¯âÑEž6ŽV?DIxL 3Tã¯×ӜחŸWþT[ô ¶µ¹!Ùå {àWð-Þ$ôr r}bsb#ØÃÄBÊ ¼1Ò“‡9œîÈw˜*9JÌÇ>UŠMDº0’LC÷È?,m?õpü°1Á#"ËÓŒù€S¯¾ÂçÚŽ«;dg­\?°ÊǾ|Çyý¾Ú/·Œ­ûÞ{Á<S ï Æ;ÅŠ¤GT^¸Ÿà'˜×âi$ù9 cR%`Ù~éa0¦öë|·[­ºŠsh`˜nÆ#Ú5ø!&¸C4[” &.¸î¹T‚ËN´7CT( i’X±Ñr)áÜ{BÊdw?€b3 S•’€fXŒK…µ#Q0Õvƒ~ñ1Óð°P‰Tó˜8íŠ8åç®È§OÇþBà>³ÎZò#°9DùÑ“©ëc4þï²BþÍë,ûbà…+Šã3©+ŒÕO31‹"¨ûäv¤ ,á"g5KØ`uM(üH$AÔ9²Õ> ½o¡ÕVäUÝÅÇšðñ½EŸ¯Z ¬ƒ<Óç.7¯}•† -¡ü®ŽÜÅ"%]uœ[xËЦê›ÜÀ„å(¥3·ŸéÎ[ †DŒ§˜ÆÊ[^øŽë޲vÒèE$ÖDhêm%ðbÎMGÁá\×4»ÐCÿgÚCWzä‚N¿Ë.¥  UeQW¯ Ú»¼R 9³}Ÿ®¢ÌÞ‹Ÿi–[Ò/ ¶:=ÈÇQ…¬vó$.U“&m˜tãÀ™dŸx¡…ð}ÃÙÁʲüß(”UqN>7 ¯I;ýñ›mMÙQÇn¹›¦qdJ?ú|ó¯Aìãí®¹ €eÒ2HVÁ;ÆfjàÞP¢ëƒ€àÏ–eÃ^¿¼ÀuÐW§ ÝUç¹¥LÚ¥õ½$c®tJ¡/)ÁÂÒAq,:€Ü† KårU†üùt$ÐsÓ¯äF`‹1¹äóhÕbzPàÕ_"‰›è»ÑÜ–ê~èAP• 8åéwâZ!p¸¼ÐÁ ª¥áØ8¯³Z%°Ã"gg-4Õáñ9ßÁ æÒ?°q¦ ¨æR-0PêÌášv+ÿ$|­½,m·E£ôÐ]3•}ûG䬿›Šä‚W¸¸6†\ÓÛøHP¢°]*!³3]Ó™yb!cg¨è̃Mi¿~ÐkL`/£?êÀ"Œ—gA¤!ÄH HAS«”ŠÍqÀ«›ÕFoŠ&U~Ÿ˜KêQN¾rèë_cN«<–9”_ýÏcáßG¨Æ¿D`öÛgx¾-¹ ®ôj­ÊËÈÑÞ›£éÔ¢¨ëpõÌ?ìö×kÏÜ«›½6ßR߆ dáð•‹t6¤)y*ñÑ_æÓ{úFÎ3ÕÄeˆGóùáCñ«M5ÉSªQÿ”ü 4^G‹[E„Ê{ÀP£@íàúÅï¥q&,Úã`«’¬¿Ò8 9A`¨ï 2 ãhP@Б(¼ãEKÕƒØí²Èlq€]ÛÕ„»aèŠg>Í5õ‰÷i_/x;Yì»  ´E׫]õɽ))a‚0[ªÄÕFDé;Èý,íà {]`íÿ•Î|Æ ¦2þ O‹Åä¥{¾PbUn­ä€¨kŠ. Ÿ÷9Ù|Mj3°\.ÅôW0bfW,'Jºží¸óÄäë_*³éGÏô@ÆØ·™€Ýëi‹°;ë †JfíãOíeúˆœ_—6Ëv@±;ÚœÆÕ¿rûÜ´ÿZ‡|£és¢ ò[!+†eÜMf0¶ëH nÊo4¬nªH*LjÑv>f[Þ¼€j?ø¾hXLޫ߱AS)ïÐtY‰qÒrà°Ë.áW{J’ƒò$ãÐÊqí ‘ÿûJ;Œ½µå(ÈÙ]tßxmIÿh5 ’ Írý¡ž¹—Ã̽o²®µ(QÕ£êªû°H¸zü|«›¾@}R—‹jÄa6çy ”S¼*j†Á˜Ñߨ…&qR(ëµôáU@ôÝÒ`{àÓ—›‚ã[x˜_¬Ì•- ¹5Œþ!Â{«‰®KÍ5V[Æ[æâ[¼Cõ)‹ À†{®W¼¼@é8Ãó}šÃ© µ¬ÉYžxf1^ì ýì/ncz0‚È[.Ö¼ýb3–Ïs0ÙreøsÉ*d'lÖ65u‹Ágƒåyï JêÂE¼‡TuaâK^³#â ¿p¾ZChHƒÉUj¸™7,ù|W-¨j4Ø&ÖÔ H®(¹Óæ:¦Í6¥ÄG.x@ý; ¡a»cXŽ˜’Ô ¥@VEq•“O/ }N’qûŽ} ìÍ9[ÏöS›vì?Û±6:Ví6nÔŠ“IäÝŠxŶƒè6_= O/ã× ˆ%ft‰ŽÿR©WIšè>oÒ|½¾k’e°Ës#øjÓ†÷¦\¿©=ÐU»¨/–4¨‡ö‹Æ†Ÿl½Ò k¾kÙî¾B,0Œà#…O¼{¿‚rc=p²j0.æ¶BXþFÚs«Œ8GV •¥b=*Aä~åC”§„”ð‚Ç7¹ÆÅ…\_rgwãŠk_Ž2LÒFœ7µd®ÒV…¹€ TºpèÙíw3Ó•kõ£­bÂbÏ º›þr{gY K»…ÞcEÕØj’‘Az¹ûÉ8cIŽáÛ'ì’oTU¿j] »lIhá |¤°WçÓ`ôdl˜kÜ_°Ç­©MiòW–£~ñÆ/æ]fy ™Ð¢ ͇®NÊÓlEg…BèØãdÚ•Ožè2ÔºØ9D¦÷ØÁ‹\6ò©„u^g/ÑÂÞÌgdq>g»Œy»Ý°¹Ì½Óc¸ÍaŒñ^Õ{cåC`Gçû[®EÐbÒíì™Ù3Q¬1×:ÁwÐåa†Çô%u;QR N"9³¸¬TÈ4Q™nŠHŸ¨kl™ PaFˆÔšÖï€ìÒgœÛ¬xHQuù™Íÿ¸W/0dޏô•H… l¾Óï¹pÈ¥ŽB9Ë …^Ë$àãŠoJÉê]%Zžá€ôøäöFAµ´¯û±|%3 *Q1=5Vç4ú pàv âJW:QßE4Œ^F\ñ‹Ë Êm´¶n¿håWâêrè v³£r¿%¦ÌÍ»9%Ä.áby}Àw²gKÊ"eôr@{$Ê ÂÛÒÚïäпh.@·K­lKi2ˆHòÕ졤›oYè›0oÅÄ~lz[S€S‹8ª¶™¯WÉÐd•pSKHoµM•ˆTwøH¨\Œ-!™]L†ß°~Mô^ Ç×ý^è$ÎA(­ö$% i¬Èz öGçW]ñç­æ°¼ðcA—ÕcD¼û!? Léf#½lñ'rsdàEþ™(Žš;¤¡çvɼX1·'Iï ÷׆ø˜Î±X·½¶©­Éœ~.6$^Ãa¾ë¦^CþÚI늅ysÅÑŸµKÝÍyä.,eñ }`FT30;a|Öø ô¼#Ú;~[/½¨¾ISlK @Æ•D¯­‹ Ø]ë±!â÷W—ÐÚð€¬=ñšè¿†ü»`/;Æ–a5ýËað^áÜ6à±q‡ø \>®Ü¥|º\<º¶½dUª,;Dµt”¸½…œ²Jbu_|Êcóô0Ìë»ó“CòZÔ¶Æ 9£÷¹C4O†1.ufb”·|[i*¹w§3_8؃ù·ÄøžJf÷%àëØéˆ«š®Ï2Óu£æ„œ2äða–Û“pÿ¡]£l© 쾚ïl¢#È+¢s…Ї áü½VR®„;åóÔW·ôˆç¯ÝÜÒ›ßzÎßuí–tä}É-·þ ýæÕ†…øUÿßRÎQ¹Âr ‚q*K{Ùmãê•Í5ì÷f<T¨…¦®rØDbcœRù‡€PË÷:Uöm0߬ò&ÿš€«ÝAÌ.RK¬FL¤Åšò‘**N¡øÈ ¼L‹ÖÀ» 1óéÎ:!`‰*¬SúÕãAïÇÔiš˜„œUùÜÔA¨¬”ä OF¾MÑ4ÿ°>GÖT}e@áêagF)"bží6U:ô#P»¦p¤·G²× ~ÕCùx~‰ UGÛbòã ñ.‘öŠèlu¨GDç?p¶i¶€‚Xgre©Â¤•ÏÑáX[K`Ñœ¡ŸáÐëÏS5bíiSÇ<½œÄt¶öAŠ‡Æ¶éÖ,Ó´VZê¡‹#š!±1K8¦f/^æ9 ëSZñ¼ÈMÉÊ3âÔû±¢á-H]SOŠ'D{_Ÿìå'÷Í<ÙJÅñ7cvY™Ðîc<Í•yMUD}1ª‡Iȸu D F«ø ïIŸZ(ÿÄî«À)­o–¤;ùKúîÛ‰b¦J.Cáj^ @µ_ø%#¶'aH„ž…V»½DËžYõ™*ÈEͲ¼;3½,6·ÙÑz7÷zy8¥ Ÿé-êÑjY^‘‘nIì­Œ{ñVP‰[­–'“qò±ùt;“ŠÊ!¶H‘o§l\™¿¬©Rj‡“s;Œ±:áúïçS2ØPû)e9ç`1ÝêhQêÙ{ƒ”\>\)Ù·óš{Tv@ÁsGË.9Á_ÜøÈ¸ìæ# x?30dé«¿26—lÀ!èRÂÑÁ©]mýWFàvÑNuÒÓ“&Ù´¸F†]ÞoÕ‘PV/nðbµßçÁ6—´¨NËjÔcá™ËnÒ©í×ËíØ»a¤æƒÇñ”ÀÞ⯣iCƒuªüú†U pJ~÷B'ÖX¿³9EÑáÿ,‘ö7T¯tñθîz„‹Œ“>Oš±Ö‘MŸöÄq”¯àJrE«¢ÎS¦À¸co´EáÒ~cÜîn¯¡›(£ÿqþF$ƒ-CúxlªKQ%‚º0#µMÄ圻| C-í]Sà^.ƒSöÎÿ ñs”¡>Ü>Øî„“R3”ÅÇ<¡\BŽHsýK¬"o›’:ÀS[LÂ-¹;3^`?¯õºôA ÈÐ9‹Žûâ‰Ý•yVï ¬UÖ iÿM$­åMÈ2†ç÷ì.©ÎFkÝ‘uèÕõJR™zD h–4³\´Ä@2|Ó\°Zç~9‡×B…LìNG„ÔÁ°c@)]Á”KÏ‚n–ÿ„´È8’¶Þ«EßÀ¿lá"ˆd×=®‹¸5Êþí#§³úN ¾Ípb,œlèr\3Bù‘¼5gLE±˜‡ÿG’×8Ôâ.K¸—À>yºyõËü/°»XÞÿa¤¯bóŸh)Ïõ½iûsÆŽ6ò³±²0±Ô6ÖÜ©ecÚe^'Z»*ýÓÐØãðÓF!Õ+*"b2IáUÖ'j^n WFÁº± b€’ÍYv" !£Ñkƶò"Q¡âE”<^}hã#ïÓUÊ48CjYB)"•(,±üÚè·£­<³œÌZmÜÇqpƒÂhôÖvéÛÜ3ÁFˆò1y“–%(¯I¾$Ð*|¤±ª<ÁHû‡çÈ~äâ'#Ÿè›ÒÜhÜŸI1íx°ñ Sì ß5¸6±ÅŒš óf&6Ò2蟡1Dvÿº:¸“QG¯M;ÿ—c[«ž¤nõ•*¾C‹Slðÿ%„t€ßóoC|潇ô9J€äÖ'1jÚîÄ`¨«røéíl¾$§òЫñ™›†[a4œP$ý£ûŽ]ºnrƒèü ä‹–rÎÍ‘#¡U‘O?Öz¤fŠFÞDrWØlI;7¢=fÑ’åRäl¸ãÆÓ›Lõtß,8ÊltЈn\‡f¬(˜[³&‰S „óóWø  âÍÁLé7BiÀ7´Á—ÄKYÿ‘úÕÚ¨u§€*)6y¨*óv³ÛÜ©û[õÄ8çñÆuTó]§”+›çVI{<›zå¼ÿý{Ýníax Lŧøã§‹{$!(pº 'ÿ<²«ëkHg=j³F ´Y9!K«4[ÖÒÍÓʳsv$JzÀú=øa`¡“îwÌÊ“²Ù„úœðzTé ~á'ï[‡zV`•gù½{²§85yú±OúÌüÀâ`ÝÎ'7|2üŸõ*]€YçÔÏÈ€°Ö4QH/ÂJŽq=–* &ô ûß)n™þo][z• YÖüÃl‡Û4»g¶_Q7ÙBŽí17žšú‚ºÃjâýЭ­™^–ûÉ Å¬»!>»Xe¢Ìæ”-Ù.Ç:øÇÕT¤³)ÇÎWîyÑË&×ÊÞÌFœñiS¥ Ûù© ð8/ÃBË8âóØíÐÜYC3†Ñ·á®_Âð‹Œ‡AÖ{Ñð+I4§my°•¯C¶‰X½á=W qŠ@ P¿ùÅÙDÀšK]ŠÐu‹Iwqi›NWt6±^1ï}€Fc÷h¹õÉ‚žÿÕ´yá >IÔ‡ï̼²²: 9ÚÆž~5×ôºw EÙój9ÒQ¶ËvÈŠÓtáw°ù׆ZiζÀtçˆsGÐÖAÄ?óR?8&­¥#zÞŒ_îȯlF9A•Ñ•¦(iÞ-ý ¬MtA#‹.Õ ßr›–ƒìs?€lX|-}²ª>n4Õ¢¢>ŒýÒ*cÚÁ°J×zh0Î×ÙÚ‡»ÙèÒx']&ÓT¢>’ƒþÃÖ4ºD¬ZÐâ½ÅÊ¿i}ê®eÖ}.ļl;‘XÃ+E÷«¡¸%„…RÑA=Q‰Y¢?TŸåá´œ@–ÕõF8Žy‰Ñÿßc”z¥ W @Œœ,ÚZK‰S³]u#êi’tiÜöØáW‚ Jã(…Ükæ}^ﲟiûþÎDpÎû7Ð 8D¾>Ô$ïðdÏrJT¶· íp­¬gxî¡ò,„¥å›Æ¦C¢ŸPã·nfXÕ½Œ£UN¦Œ¿¬ÐÊ‚¸ã8žç”[¬q²#>â™ÄÈÿ³¾·{ÔƒÞ*‰ÞNi£ WìGDŒ¹š–»äs]6@…H@ZLä ”EÝ Oú¢q­Íݪ˜ÔBGfI ¯É´tÔI˜WïPºp8òZ!Yªù¬S^ἃåÑCWðBÆ-Ë:øð Çq̃Ýÿþ6ÍOã¶9~z¤Bÿ<8ZZKY €€À½^¥ö§“kÑbHãʧ´šG[ì— îD i!©3uóD7RÄgÛ??úBq!Þ\JÿIZ“,Rú¦,;"­¢e¼a·p/žDã&µJB:G-#a5à\ÞGzž'ô/UUèü" Õ>ËÊEà ºÌhî¥nåç5òÏB¼Y¹U·xÕVÄÛ{'€xu¶$„ öµ0`áïV!’FÂÊ¿³úr‚Aé øþnp‚(#X똉[<<ºµ¾©‘lgiEnI‰²û×QÉ3žHP¶y´qAjøèIC¥,N* йC…þÓtšŽxåGúr©ÄO]"–*Ž×‰úÿÒ7€)ˆ¢ Œ÷ŠPÒ«‡¢¿ŽÂ…÷W¬nžUf†£}„×¹Ý4^pÒÓØ>}J+Ù ['VçFdáÚ¦îbvë#Ž>¹Xl7í@‰åǯ—ÚÛjªøíTÏšWJz`fêt³¢UÏé¶ýÂê¿I2[ì3pÄq¦\ÄÈ §Rèš'QN'qW"5¸ÎN!"™SxjT)$DKõl=A¼½¢½YI¿Ç÷ýÍNºä3Aîž¼¥³èjº¬î'ªªî§"c)Žø>2|ù±úâRYÂs`#ûÝÈ–½#x‡צÿrZÍ“e‡Ÿ7BÀ£uâ;O…âå3ùXíÙÎðV˜ä÷âÀ5îfXQá¹³$ӾΚá&‰/+Q‚nD¸ ð&þÒƒ+áALÜA .’H8³ïY¡Ë‰DÂ;P)>oÎJݘœ‡zÂd‰dÑ7Ø|7§xàëVÒCö`jˆ8u€ƒ#sœ Uµø,[¼8•f·ÂFÙápÍ7¢›w½ÆÀä1z£aÍ=L²î¬õ ü³ÂåemÙîTØÙÂþ6N!ýÌ8ùûã4W§ u¤ù¾ø¶W{ž?"v·{ܦ ´™‘_3ðLùW*ý•$ZÓW:]œÑ¯}&ú°(÷¨!Þb2©ž‹9ÔYtWË¢(”Ïh“—¿²+Ï™)‰Ø¯¯òQ)©ùÎËGR)‚.½"M¬‘”ꤠÆ_Ül-7a‡_¸Òј qf7Ø?áŒÊ¸HÁ^!“×S¶¢½‘ƒJæ)ç’~@dœëAɵŸ˜'¹Šp/¶{\E6 œ'-Í }¬*QWö¶;'µ;„D(÷w-„‹I ya…­‘èGBgÔ‹6Ú~:pü“Óù7ý«8YyJÆû–âƒí—AY#Ga¸¡È…o SÄM\9vTH‹ ý»Å¢CY^)Pâ­ÿV…Qìck}ühf#ë”_Xôjcn¹‹0Þ„£íÐì €2²ÏÑ"’£$çÔr?Pc/‘ßõ!BÏâtšµ¸Îøi§Ha‘£©®”ÂDq#s=ýfEÃ…o4ÌC&5<öc6ÓÂÄñÃïåŸÇäUE ¥ ÊÀÛ¿+ŒÓË´‚Í[§ëÊ,Õ¬ž ¤¬âëIÎÇ©À£Õ…ùOÎezY½&DΙ #žÔµ,µ c›åT¢ÿ°:¹¼ly‰h A¾&Ò°ÿäxç7»Û(†Ž ê/þLs¸.0;îª^È4²¢P›éŸÊ[xaÆ>áøJ¬úo×uCÙœ.R[å1À/ðJPÅ œ§Šw‡ÝAxhäŠY½¦GêÌ‚ »@Sñ›P u!ÒqNä=çáŸ5M35»FTNúç9zVlÃôŒ"*œl :‰qJ³ön&ã#ÖAÔ1Çöì€ì³<©jØ„'FÏ=E•Ç—ql>Š’Û»@Ù ]€táž6„Ì~¿ ò“Á” DõýSm;eQ­<ê/¸JZ2â4âÍɯ^h9ÃR¾Î/K9x1?«m›äZO°!Ñ\&aºUøiŠžZá¦å¬&/$–!2àQº}Û½<^{2Ví[¿zg‘³ªh`U•!ÈXÎoÆ@ŸÙÕþÑÌHZ' 㺣m߇ÈÎsñÎ?‡ûù2OðD çÑùx|iéÀŸûã{¨³Ý›¥ávÖV-¬C™+‹Zíh‰‹mV”&rq£m’âË–g/Xîï0éÂVœî¡µñkˆåå_®âG~6éÎÊMMÙéiü 'Ë”µÃç8c]<š´ µS9ž»%ÑÔ=ÚTZs+fÜñŠ‘>²ªé¤¼Dœá/Â*Èc“Y²A?:ßS‹ÛÍj¯Ôid÷Iô |çË:'¤Â`átá|h’i[1g¶RqÂ2ñÆ{ÊØ;'­ƒKXçá¢>«EÚņíïÿœü‚ˆÌ) N¤¤»ØˆSs°, ÎU²êº¸X´48g&J×,›%UÀ˜:ë5 A L~~*¾e^:z«TIÁìHïAg¾.¤­™žLÖ2ŽÐrlaµß Rœ8H n€Ü$P©rÓzÆ;ë7F/¯ú Öá››y0ŽÓÍpÓò—[ $ŒßÑ‘©4è> ó©8á›ûìvB{Ï…?’ÙTæ'Ðí„&c϶J*cXÈo€ÿ¶©UÁ{°–×kÚ–`Ù0ÄJ«tęǻó±ÁmdÑ*˜ÕÊ´hk-Ñ÷¼÷ý—qœ½ÊKÁÏ1du«yz|ÍNJž¨õˆˆ÷§ ›|ý5™Éªgš²_H¥qrÄ™sv1¤ôBó¡¿Z>Z+wà+fv¹çjän@>KûÁñBVìØ›ßb?&c‰ß(ªÃ‰‘ÝÔt?J;Ž®¤[óŽïÑ·Ó™‹›…B玹þü¹ÒVꎧkVº*HIYHðÃÀ¹¥ ÑxÎeŽøÀÞ‡¯ã:Z·5Ÿ‰óyÕ{Mâö¤J˃I¥á¸¬×ôbÈÂ÷td¾’OPN»Ø¢ »ÛÒµ0®à)Û—w¿ÁÂQ ¡Ê\÷V œtl•Yâê–'üõÌ#üË4õ{ÿ+‘¨ÇÀ|¯uü$aF|`ô)Ýc£ÊY)Ï*““këÊ+ìSXõJAhfÒZ¤K•V*!·x+x’nË#(¯=Söd!=èQ¦ óùœ—Ra ˆ„!~9Ùm ]ò£¾²÷YšäøÞ67úžökk×5©Tö:›žéž÷,ŽR*&Hv7‡™¬=×6›1L{Š~üÈ#;þàá2qó:H‹‘»#“†ç3δi¶$ZFA£±LOéx+àûºãŠÿZ¼ä€ì]` ù;QSÇn‚©¦‹KMNö5ÇÔ7{nô0¾ªòÛ×ZÊ“ÊYí¹n8Ý…3Ñp¦u›o°WVØ·†·i[ÂØug`ÈS=ÇZ½7Œ˜Aʨdï5ù²æ8Z–v¡n‰²_âá\»ò~«eèä¿Ël2IïB[·. _¯Q,D”n™ˆúǺ2£zokn8Iˆ›5²?}Ž®RŽ‘Ç‹½1YL ª‹ò¿aúKìQ!nÇÕÐMNãbtžãjôêîuÅ µ­(ÐÕüjbæiO „+Í_3s œß« Ý›«Fçs|nd‚t{tæ,.Ùt‚Žþ5 5ú»¦ ü“îÃüól 8:ƒDüSk½Dì¿,æÊi'Z#Œó¼‰Ö9Ý  D>11í}¦IN;–Š¢—(Ì4,ÖRÈîC’ jïþ¤-0ªN+T÷F áÐñY…Ö®ƒýöêÖ¾¯ú2¥ÿ^ò–«.3~£Î1Sù‘(»oôÏ|WL2Þ(ÈÈ1SðÝâftmeOuÄCNø#ìÝ­xÔaø=•3“ƒ-'YnKŸ}h–HÞŽ^Ûçñ>¡5L²É¹Øó?UØ0ʰBÌHªÐ ÷ò§¨±‘¢sy…ô»¿Ýj‘ä>N¼ãùŠêà-\duZ8€¨¾¥Zž©ÂCõì~¯^ þU6ðÌ™ljy£ó:"ço‰­É §y¤ø¸ÅNIÜܳÍÖî‰à9÷ òø‚±á{™†KlD³T_Æv²ä„—óïM,‡Cj•2¹Aá©Ð¿Î Þ QaK‘TCµéh<ÁѯÄz¯ôí‚}¯]àŸLýäX´Ú´D†À埭o‚Bï^œÉTáüÈÊrz £›^5f<÷¶ãdTHmŸßI:êiÒbì»F6:’£GÌìÛn·y‹ ™¸³ÁG<Ü[ÄDÑ'APôŸ@‚™A ØU"Õ|37ÂÓS“D Á»ÄND¥ÀL§3O¢ cÙ¬ã¼õ0XÃDÇûµo G4\ « aXñ•6¸äÈœÌiŽ_ºt;Ó¶Ô_W Œóµ5ø…í½åSó¶å•Df|ÙíDóøK#°åšÈò—øw9ÅÛÿ`=²m(Í06gËÓ9æY~«Eò¬NˆTiûSËmQ»õA=ñv½µzKÅ+ÃðÓâú´ å/1ýlÏÜ8QÄL9(Ý47lÉHÓ†Ú!1øã›*I\?¤ú. 2Kž ‹ær»zçJwiÑi´áS(WUÃù&ë?iCwôˆùåK áÒ_¼ï¬ý­—Òþs€ÌC±ŽP0…“Ak'€g-"r£äÌ•‡µ”ÿôº $îòÈ¥T‰J¸ùd ´ûæ–êÖ±fÓÎOÉ~Kbîwâ»ìý%¨e ˆ’nf(¶]^çU¯´EKÇ`¨%Ø5Î/¸¢K ýu^ÝKýU–Xäb>¤Ÿ7¨×ûá·àÏô1óíweýÞCA¡õ‹§$ÉéN)ú`Aäa±ÕžQ„PIoªñÒ*W¿úÛ>Rþ⇀ï·©IxgŸäñQÛÒÖ]3‘¯²AÕ˰ß^e³ü±ÞvßYq¼/f33ø†ms¨Ðû+(i*¯\ÍèŽ÷>uš&#%‰£JF¶ºã?GìA}q‚dGZÍçÎÕì^XcýÅÉàúà|ºeÓ,Oë±bqyྚºÈ#-u X*†ä!wcå[®Ÿ¯Òºrjíîѳg5@ uR`+¯™T¤;¾Ïæ ñ­Mû’„¯#³17…ÏÌ‚#ňËpos÷qϪÓ'Äßúwþ¤Uc‘h.4¶÷HÞÕŠša˜ÖF“Ëtò‚]¿¨~ah|Ù2k%n;$ôZO™Ò¿×뗕׃ÐNõ]‰Ù[IÔ„u!.уÍäÿP UØèQ(§\/fœÙTI¼Åö·™xÄãxõ´a™!¿V/€•ä"ŸY.Èë‹Á FH]õ¶¹W´¡b4œ¹9¶YÊåC2^šÎ«ëõ%6šæg ‡O_ØŠVæð™[ sn}ˆˆÑû¶|ƒ¹6ß0p˜³Z‹é®´’Kà ê=)èË8dƒ)ï]O\cÄÏôûô{1®°­xÿøf‚÷Ô·¸„üm#«‹æ±Ú†[m³ø»éòUêèIÁ¥ÇÛÏdбiÉû‰CÚ{Pp¹ÜØšàƒo¸"½bA÷T\œ{þ¡ÈtuM‹),¾¯3¡C%TüÞÃÚë‹_‚ù€ÒöŸsqÚ¿ò$ú"Ç0‘ÔRG±À•æÅ¢t}½m§_:¦Å`%ÑÆ?ãý*{¼ÞºéŒï?Ïhòö³UÁ=È/TÝSï4÷мŸ¸Ð¾:â Ô,.He_GY¤Šl…Ù´Ÿ±ÈÝÑŠS%}ãî½^d¹î ‘V`.9m·’³…VîÉG±2>–k5¤MÓ¸2ïw’;ï’ì\ÙN‘g]ÍW·à 2Keø½›±r±ÅÇ÷ÿ÷æFF·Fàšç‹£é­0dcÑh›£'^“‰ ÏMì¡Ë4•í©k ð‚ZeQßúa£¤j¦'‰~7 ÖÞˆ$vÏõMŠi+~J1†jÉ(oÏäWY5£¤ŽtŠôô~é‹×ì[ìœûÙêNðWÊ•7ÞVɨ §ÿyŠu'sèEH©ãFk¼ÏFìqLЉ5ª¢Ž­™žôÔêx5ˆ†‡Em)ä(k]£=%¤ì%_¼Îë ¯·`\•jæòEmbÖ‹¯uŒ`# ]…ð€Ãèìnÿö=uÄòÚ¦ ®äv.`¿>tƒ7•£ð"<&M Êáì²’ÙÚÂ$ÕQcÄ#= B†Ì»”þsêÓ¼¢š“¨OźÞ 1#†ÉWŒÆ–¼‹¬]i2úM£bbKkæßø¢ô1Üc?ßn“Ë‘4ȧ +&Ѝ]É@à2y ùîª @îC1ìõ4õ‡¬£R?î÷Qr…’‘n ´n10Þ©õEÒUSRúÏk¦×oŽ^ i'ænǨŸ+^ˆì‡ïœäØiŸx?×Ày;‡&5§ ^?t ûÞ‰Œœ°YÌ&?›æÛ]6OÒ¡evøSíN ò5xJⱕð·÷Ã2i5eÿHôYwŒ¾¶s.Î5ÔåÆˆK÷’'ÌQĸñÎôäÑ¿+2Ù¤âžÀØê`ƒò‚¯ìX‚ 4bâëÒÐõƒ>¿^£qïÔyäL´üÅŸƒCþ x Áa³­åO· ö&i'©Ÿ‹ÀåŸì.b1ŸÈ– TqúÄ+hŠyHv2.”XG}½¹;xrèÞÖ.»G,[É>¦žr›2ôYÉó?%­A降á5²HZZ.¼b<¯¶;kßK ù«öóÓÝÿ Ô €VØîÅP‚þ¯ÞúItö 5@ê§·ZË8¯fe›Á©›ú×F×¥­ 5‘÷ÍnÖ±lRºCK¦ÀÑ”¤’oëœUÅq·@A‡:z{™kœtüpº¶:\XvQÜ’4œÀkÒ˜×àâ%qö ±YðL}±8>†”•š¬,ƒ`>xlè5Ñö/é䯠~Beà1ê“ÕŒˆ®å1W–èdÔCû‚æòÉp"š}ˆëc5NÖ~ô"&‘JMH“9[=ñ[±*yŽ1ô"Æ–Þz¬¯¯«Ü±Ž"Ôì¤.ï»}‚T!drh» Ë—**ãÃÑ_1øº,s£Ì¨(ŸÝof/mòØï{­AþˬÎV° õ’FÃm/ÇNð€î™Ž×eWAÅ~Le¤5^¡–ßø_P¸¼ê— ãzOüYçUžMr°¼*Ö/gØ>n¸£e¥qb5À‚¹ö]eþ–eE§aáì­iA„•3âí'•´”»ø’Ì·…TIom£¶¶ú•o“p¤ŠÌ Þ9á|Îø ½®òˆ2«£·ÊÖžÑúä:÷m&D7@`|˜‘¨[’¾ å*vnüæK†; ÑVz¯ =_ûMýåß<%¸ä÷:Úxz‹¿à21MÛ6ñbr‘¡òvÀîìŽ'|mÔ‡8(ªw¹eh—ˆ2­Ò{Q§yŸhϧ2UÍ®ë”Z˜F`i«Î Óû¶Ú»ë#•Üw ØX$ü:a5‘¢†9çÔêX/àŽo…¹ÆòC|eŸ(©mÍŸÊ!OÖ衃w8?f[1ò¼­~…a‹™?~‚å£D‘5Þdó6"c§ V, ¸J˜.lÔS "”÷\IäñfÖ(y:‰”T†g* ýøûD¥Û4G¢aò¤xCzP嬾Ì0ä#½ÖaïSþµáÜRöW@™Ð¢Qn,Ú·ýÕpƒ­j-xÂÄ#™•ƒíM%ý¸ØËÒÞ…Åéqiʳ‰ÈEñ½çµî…÷P]y„q&ÎLx}»~î?˜/П!:~0ŒßÆM¦X(‚F³"à’ÏM|áóê~)ÇZÒSÄùÔÞW Û$ÇPEGð5P›§ÿI´Ê…½ÕùÚÕ´Vä“¶%wUc õTœ‰Ÿg«á7µ"@™Äß Fr¿3É‚(Еp¸öJ>=(æÿ<ôÈÁ˼^Pú•J’?úC°òï3!}¿=^nÝR;=¯e‘åŸ0»ÉÀ ¤K†Z+¯÷ã"ãäñaÂË(Ï:ƒËCò•ÈV«R¿–¢wÖuÇ’!8¯ !¯ô*‹Z둌ñšivÞ+Êöà©i6¸ŸçZª\Ÿ*P—ÛMRI %RÁ8‡w*Z±!•a|êgò‘Úÿ—‰ñôLoöNÏ6°/zQ žá¢ ›¹»”Û»¢QVWø«ÇÍAO+ZÄA›=Èݧ)Ûý"ã3Eýû Ýs ű.†\탼xAÂè癦ÕçºF¡ì nºÑEpfq1+ñØZ“Î}µ íѪ$¦‚ ØÏGõˆò¶,ÜhlH¾7³é$ƒpø¬yÅ~Ö÷‡Â“º6ºÙ7ëdi¾Y1l¿-v¸ß@Ïl5…¬5G¾¨Y` :\…£Øú $þ13’Ê9~)šîf0IÔ(ÛUb\3½f=ÓA¨T˲/ÎÁ—г ƒmWVjƒ•F£´s\C†tœJN:… žœ3c3H:c´ˆ1Ä‹éÙôãæ$ØD R¦?)³ I%eûÜ+½¨¸\zcåÄÜoDOG~~•3Éo%™Ð½ï ´‹ÍÕ¡z¬¹¯”qÛ5“d®™lRÈkj1ô0WädÈzƒ*hvõ6I8ù*ýÝømÀÉž:“ª‹ÖŠ›XÞ0Y8¡´µéÄ‘ÖýÎWŠã>.Ä z*Þ”¾¢çãH颹±ËDÌ|Ï¿Ô;ùuIóÐþ9‚AÞòoß’ºmI» A‹ÇâÝGæß…^Hh¨–n­Ä”h¥8Ä5‚±#¥¢kþËG#DÕtˆˆwžÙ¤»"㱈ð„9Cнq]äÓN>}À²“ÔÒn7µƒÜß¶ÏGýÈNœ©€ÖgCx ÄòžÆ,ûqø%´ bo†ë†A6Qª­æ!óZ% ñ,}N[ö£ŠãjÔåó‹0É¿wרÎà?.‰ögƒîŒ”ÉBͤeפ;§RQ—8Ë›‡V¶2 M‰SìðsLjĹujY¿OôügÓ„Ók_(ÛTB/T³b¥.g+ÛŠPœÐÕÐÏ dPeªÈ´8T½[U°©ìJÔ&MîPŒ¦ïŽÈýY?¢´hÌ©DŸø½™–üû–Ú¤x¿`ÏãDXk Ô†&`Œíäg„É›ÔB¤‡‘A-êG•¾_”eé|P´ÆÊiþ!Åô-\Þb­¦J/¾@mSR¾Ôú‘*ŠÚ  YÂË_&¸v¢Ã÷ضpð;¶˜]®.I×`éÚ…w–ÍõëžÔˆÅ5dä;1 ¨ü6NÆØ7`Ìšr•AРFçñWøÆ=Ôr¿ªü 4úÉaˆà>=¨vÏÎÀ5@#¸fº=³ta,ªú×ß;ÀrOˤ]LóÄ‚µ)>F@¿r¶^Â3pðB#+mC‚NSR Á±àº{¿ž¢pWÌlîÖ`󵿓Æ*FÀ«ëÓ “Ìq˜wª¯h{™ð³¨ê­ r„?§ÜÒµÅÏ)g\”i‡je1xp]Ùɳú² ‡˜9ÿºùr)K[#ý§I{ˆmØÒ2'æ…æ.Ö~ç‡iÃ¡Š• ÉŸçoö(.þøD_‚á3¶á±n1âè~7¹ï_ë¸l>È…JP„X—Θ0îÇ–dãß½Aâu§†;µpâ¼³€O̙Ǵ÷ø.’Ü]N A#µæö_ý*<ç"rm+È­å0ì ±Æ™iøjžqöÔnQ1ÚAµcé|)B*)ùýÔéÑ霸½·žú?ÎTª䯪ìWÞ"ãIŽò¼Êì#Ê/r*O‡Ç 2á‘Ô ·•Sld=탣ìÍIž$ÙBÉÒX¡ªNý­8¨–ð¬oÀr!pyqJÂ+Õ,ï ‰L+‘_Üì—Ûó¿I7Ìæ¨«“3ÚŸ!ÿ%ž §×«ËxQ¹ÝÇö|õüØÉb5³a+4bM¿éÍùÄѾ®ˆl,p˽~µúöÕž|¬Aôx{TTházî|D¡eN[…¿ÿ«¥JX§Û16³ã©¼ŸLFhúö”â¯Mi[.%ÇïÍ™=Ú™ˆ9•½ÔCY=oŠÿ44ä~G50˜!ë±MåFî_0úºÄð»±’Dµáìž~ªóŽ›xè0XÎ?§šÝ4T’ÜíaÁ£^d2¡«{ý'¡³!Ýž&” ½°Šp.˜³ˆ°Ü“ˆbºÊpn‡9’1ð+ÃÀ³ÿ+Ÿ°/É”>Ìö7¾»¿ÓÁO¨ ÔN²°5.ï9S5mÁ¨òÇt£w +mÿn#yüXå’û¤=ZˆÍ#ªëE8C‹ø»B=•z=÷`T$LX4¦ ·ÉJùÊoX]·ùŠBˆ°ëîš’mʘz…}íÿü@¿}|>=ßÝtpö³£Oþö8Opý­ÝÙMý´åè1™¢6ÒUU3‘~þ]Ã*â?fÙTØðH-V ‰õËS}‘½kö•9%¥ª•5òU,ÂèµF1ãþÎäþÙ YŠç± œù{m·e¥òp)м>½Ù™Âk@ª:FrdOÜ”‚œÀÑÈGZÒÉ0Òï¾Í0€ATÆˡإ–‰t[œ¬Ö·Fe ÒqfÒ 6 Ÿ Ào:ó:Ör’ðÌõïß­’yt®â™Äfkk|1)¼à/z‰ÜØáÌpCÁQ*©¯Œ´3ÌýÏ›,d‡x†#ZÛ6õ¤A‡¼-Ý^dH˜?²œµ1 ` è1–,m¦ýP Õ'Ê~¯Çäûåã;.)Ôæ9Nª|hn½ÐLCèMÙf¹ÎH&¸”öœMZé²`“ð¶,^~[ÞþÂqõ¡'n—ýO‡j#u‰éCT¦„Æ^ÜßI Cغ¥ŸäõfFWñ°#¾ÄM©)Š$T¬¹Èk¬Y^5g°|&P?ï ò 8½ÌÞÞ­}A_YÆõ÷³!@é[7nØÃçºèK^–R7gŸæ€/8kñûr)ßÕƒÕUÀ«}°ß€8Šà3²3&qÕGnØ%"Á·Áñ H:ûGèäˆä/|@᫚êÕÁiTû6kX»`νú q•î<·Èí«ø™ðZq +Ér£u«(+ûMrí€=³Ø{ÁxWù®Ùï÷p×óAÏq…Í<ç;R%ŸÜ=3?}Îw(àuFÃÏwUɹ¿/&ÐÀ”ë6~ÿl&ùøâ1ñ¥O»@øzq¬ÿX„¶o+èÍÀQRûÇ–¼úuód€À0s–H¥o ó¸¥÷€p[YgÀ’ò¢°ê1à ¿µÓåFÏ»ß-ÚrÀpeÅG€fþ§ç'KHw˜§ë ‡™‹DM¹ŒVKò+Yç–àtöĬ&ì¤Q³GYãÒ f°  cw+~;&úòP3ÈI# ëã‹õ‡„ÕˆüäE­ca–”êK™ýrù"…naè·Z‡$ÑÙàÚ3pñÜ•¿NµXíõµ•† 1Šü%I\î¯*…y*Ù+ˆ3»m¢ÀþX¢¼ nÎ ¢è¿K‰ ¦hä’®ÿwxg‡Žü÷tt(š§ P‚mS÷&:|È4èæžq£ÖÿñÚ茉Ǘ<Ðo¶jW_5X• > ÎÄ«ª264‚kßn‹¡ëÅïDíÂ|z°XòÅZÛ%ß n,h·ðÄQ±NË(‹ µ¥ì­O«~Å ÒfÍ„hò byØ[aþŒãMšU”W1ù­DãÒ RÓ0Ôt¡MF«Á¾sß¶y´¤×©¬±Àç¼õÿ»ïü´(öÌâü©v%nð9ƆcmsþáÛš'}ðYpdt'L{âYP™]h§zûE•†]jÅ ±ä"!­büèpA6×Ùê§ëÚ½“£˜Þ؇,6Zš èhè2­ÛîàÂቑܒ«¼›¿QòÁ @•/°öOˆ$ ±#ÒnIׯóbTÛõú$¬t7°5;âÿÖ‚nSx7…n‡Óѱý´ÇˆÃ?Ϙ·Â6ë?#!³x]ì_.ǧ€ÊÃßÇ­ªvÃŽ£ƒ!§¤<éØ`º?cWG€ÎbäsX.‘°žFëx$…¦O–½•ãþ`¸´/C]° X´ùÈšyà,®·bC+&¡þ]Ê þž7ÉÎp.K›ç:H­vìƒs—±ÂÃeÛÀ|$Á‘î™ír]Ú3ª²ŠvIҘݶ’ãBˆsѽÞaÊuÝJ€3E/ ÂGÒPî#%¸ I3Œ´ÍòA¹ÈØÝøuCæfè3@ñF[£Kì»6»’z6º¥ÒyÄ §v™ÉÚ»JØúæY‚r¬‘´³§Mº×zÙÝ [(„ËîTônc&ÿ…ö÷˜#?D¼@ׇ¨­]®ÀìƒÎàáUú @tL œFU¥ADM*^:ÞœCFX4g¬:'FJAU›,¥ !ø2"K¸ª¹ÜÅÎR‹–ï D³Ð"îô§å:ÅZýa)ã&sòpÞ^µ¹­ 1©Û•ì)£pDÏyVéFÎß uyµ­`FÓáÄ Ý|Nà9(&íW¾<ƒ"ÝÝ•Bä&ÉÛæRÛ¯=ì©s×Ýx–©É‘S§€1ÈŸ šG"T±ì9U\aЬ–³.Χš¼*ZˆC"å Ìš‰^‹Ö{E ;)Æm»ø—ųÈ”÷@«ª÷b«Eõ¾«B‚Öyª†+9Ûm¥ÝkùµiD‹N“íaMI¥™%¼yz(XÁûäùÖYÄ<†©Â¼(Ê“b2åÒKíIj°gÐÆ9SÅI— ØH{QÍF}%Ó» ÈyøÛµ7´‹ói¨ÿKÎÿÀù!ŽVfîž.Nfî¨îVž.îVAvÖ¨ÿW¶zôendstream endobj 7 0 obj<>endobj 8 0 obj[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602]endobj 9 0 obj<>endobj 10 0 obj<>endobj 11 0 obj<>endobj 12 0 obj<>endobj 13 0 obj<>endobj 14 0 obj<>endobj 15 0 obj<>stream x=»wPÛY¶ï뙞nc2B9'„’È9ç(2!$Ê™$’!rÎÁ6œÛngw·ÝNØÆ¡Ýî0=gæLMsëÕ{õnÝWï¿í¹U¯jÕ.ý~BðÓg×Úk¯½ F04$‚ EQC± †R}p_a}B‰t@0"ƒÅc°$$œ„Á‡ùc†CÂD |_!¿Ä!8Rh„Á!(dâì„ „ƒƒ°¾Œ/„ÂÀÑX -Œ“ÇJ¡#(x2…€%Ô03 OcÀ 5‰ ÅB( ƒEÃã0h ÁbŒ*3ŠAbÇÓSsãRrb©Q¤ø¬˜¬¢äJn1_\WX‘“ÂLÉK.­+ã4ÕV¶‹øÍ‰5¬âÊäzA‰ÌÈíoéÝ”Y¯Èm÷e¦#ñÀ»¶_D}¿·öþÒÚ÷³¨ÿ§¶Á7ÒײÁc…éµÜô®­ïg¡á­¸÷HÞ÷½ºïÆë?>¢©$ñobP Ž¡CaÔ `‚/ !@pAPL(–„Ãá‰h G¦ãñ0:Ã"aY¸´O(Á†õEùÁQÁPT(š€A`‘~_ÄéPbP0Î/ë‡ #qŸˆ…Ñ"âãRãRY‘у†c0!$ ,œ¡E È4†JGbPt0Š@‡¢1p,˜8$ƒIƒ&B)‘ø¨$zd"-€¢B≉™Q` þ: Aˆ$Ñâ"br2Ó*+Òjë*j¢9µ±M¼ŽrÙH“aWlº©´©‡~U ý‡Òö©é©ùw‰éƒÔôNö Ú+ÙÀ+Iÿkqÿ‡–ž7’¾Šþ47Þüí# ƒã`ME¡iH §†BÉ!~(()8èó „Ùø‡øÁ±è?ûÆàü0Ht1„g Ä  òé âáN@yž…ð!8 1(6$ Á L&3***"‚ŽÃ"‚‚}`<Š%C©LM?>‚ †á p,$„ÂÂpx$ ‚û¡¨,Acˆ‘ð`j¨1ĤÜv Ï@gÁÐà0R(2 žÄʬ.«’‰+Ò<0¹¶)µ^Q*µ7×%–JÛµãg… €úMnýCfù]nù 3ÿ$7½• ËßJõ½ôTƒt¦›oÿãc0"@Ã1h*IÁÀHˆP"JBD&³£3ch±4æÑz*yЀQ#ÃrIÑIÌô4t8žÈ$¡}d™I„á°á“™‘Æ@E à”ð.‚4Px…Fþ t‚†ŸDB‰tš„ŠL`Åg¥ Ã<4Šƒ„b‚ÁL!°0, ùCÁ`„aBL+€ŠÈ,˜0¹¾ÈS¤h\R~,=„¥C ‘B ‡’C‘t ;;>¯±²¬­)_ÀMoà–HôÜ·Ø´)1_’Y¾WØÖŸÛÞ‹&ˆÌoæ7JË[•å­Òò“Üò+ð\…é•ÚüPo¾õîï!ˆ`8ˆ¡È8(‚AcÑAx #9.&;…•Mˆ$À) Ì© ÌI,Kd§%  ë“‹*È1ldö̆ÂÒñ –NE†“‘ -‰™GŒ¥â™8\ „J,FG‚HE¢#±”Pà€p|àL ÇÓÓróókêé‰I: †øÃý>©Ž „ú„ á§?…8\˜Aàäh:£A}P§ðQ¸¤Â8F2D\ 1‘j0< BŒ!DçÆ&s2ÓªóÓkË*äêÆn{ëÀ¢ w§µÿºÒq¤wÿ¢qüÂ0ñàk‰éLa9Všß(ÌïÖ_€Ÿ*Í/5–Gí–›?ýçG&‰‡¢ˆH8 p Ñ~(lï‹D¡ÂÃñ,:–A@Ò``!ðE~B€ÄfUqšûåƒÅ1"3+¾¸(*7“ŽÀ£ÂÀSˆL$™$ÐCáä@8)†!³؈H Øœj!G¨‹Ï¯&ÇÆ†’1!x uÄ¿¹C° øÀ|NC¿Dù üü‘þ¨p4-‘AM¤ã£‰p8%!,­"-±(ƒÇDÀlÀ1?½ %#ÒèÌ¬ÈØ‚ØÄò¬b‘ NoäǸ³|ÞÒþH?òN3ü^j}#µ¼“š_Kͯd¦—ÒÁÿŽcÇJÛ¯@u€˜Ö ˆÝÄàøÓ¼?  „B ±þ(’?šr †‡‡1q,€†gS´âi ¨a·¶Ù6yNÔamPh`aÔ/ AþXL ‘ÌHÍ)áËk%Ý¢ÎJIOiK{ §‘™šAb1àðn0õD6öiEƇ èdXd(%šUÛ¤uÏ–53*(q±(Àf`d( „? ð l `ˆ òEø ÀÒ—Ÿš\žƒ‹ GEQȉ©•Ù¹u…á) x8ŒC0B:R4Ї#š ÅE!(‰”䚢™¤¡ÝÔÐ>Æ7î(‡îj\/dÖ#¹ýXf{-·½’Y_J-/€n`ÅTÚ>ŒJË‘Æò½Þ|ýÝ?>‰'¡ø¯ƒ1¾hðHÁæb #àÔ8•B¤!à þh? KdæfW¨eO_Õ¨l‡Pi§P˜@R8‚‘ÀÊ®®›T¦µžÑƒ¾ñËÂιøbqZI3)Nª ²0¤(°¸@‚pÁ$Ž¥Æ‡R3sëz{F¿˜¼'ëߨ“÷Fç•ã“#ÒÓi‰q€*œ‚q„q(!#üq¡~X(1Ž•UWY.jÏL¦g¥0óÒ õ\8µ*ЋÊ#'©IFj8#-ŒƒF3 ˜ˆP| †šÎLk¨¬Vé;\m;£ß¼¯ÔN@é™Äúü:Û ` ¾©í¯•ö·JûÏ@uJËsõÞr ƒQ¾€‡ù ÂÁ·ø*4ð4%Gâ¢ók5"cy³&*£ÎФý(_X8™]hš-ªokÖüqÔ 2ã$’†.®– ëí‡]îo;·ÌÓO #÷³«MÉùÍñ™Åa1102*„ˆ …~’+ ¥ÐðìÌ¢F£Þ¶ß5ü­|ðšÊz»Ó}‹§I¯ief—År‹ËÃ’’áÔP*–IŠÀEG„ÐÁT2;?·B&«×ês›šcJÊ’*«ëµÚ¶ÞJ…$½–“ÈÉcç'§VäæÔæ%–$†'‡á£°ÀCñÑhF63º4£Z­)wV+Çz'¿3NéG_¥i\¯€©‡UŽWÊ¡WJë+™åXn}ûIr4Ö{=®Û?ÿëc á³ÏCN| ûK0|âçT ž[+·OÌîÞó®]é,QiEÈ0’†‹ A3Ôøü*atfG(M)¯Í­—¶t׫F:ÝW&~èŸxÚï=r,~0M½.LeËâ3Êɬ8BÂùŸFù ÄGfU*µæý.ÇmùÀMÝУ÷‘Üz«cäOï*nîN]*T¦”×€ž–Ša3)I ŒŒt\l6&1³ž/tjÝ3âW™¬˜Ü>Þ;³ªtŒÕë:ËerŽL\­h«Uˆªåü2AuzEvd:“K $‘(i‘B~¹¤½N=ªs^íýÈLãzþoh/€ÞTÃ@c/–£O¬¬ÇRËs™é¡Æz§×} ƒPC¨ÁDÈçÐ@8‰ŒHDÐS›TC3;÷Ö.z`]¼«rì‹Öõ#‡ƒKwzf¿Q ï´šÓçÅÖi¾ÑÕfr‹úm¥"y\1‡‘™WœÄÌa§T” eµŠ!™él×èýnø»¯º&^wz;Æ_ý›PÚsÀM<Ôq¤zÜå~`òÞþí|ô'°‘)Ñ…uÕ²¾~ïYYÿLykßØê  1×ü…nÛ,_Þ“YXM‰ˆÅ’ÂðT*R^ d|B^~~½ «F\ÐdPZvû&ï¯Mœ{ß7}§µ£¥±Fa-®•Ò£R‚áÐ@d@úô)è—>°@!Ü=Í9û°oäGƒûåà̯ÝoÕ#Oº§_uŽuŽ>5Œ=ê¿o¿Ñ5z¾Ý½ÝáZít¯¼ÛÝã;bÓ|S×´ÖuÞºúÈ´øÐ¹þj`ú‘qüAßìÃÁÅ'}ó?tLÞÕOÜ\ý¡{æjçÄ…ÞÙC­{­VkÎæÊ3šŠ9 yiUeÙu‚*‰Ec?°Ì=é}h˜xÑ5ñªÓûò±±@ijçpOùÐ €Nç|Ü=rpüæ/ÿý‘_ÏÙ»Ýû#›ß®?PYÖë”NžÖ-ê+ç·ÇfU#âÄp$Žˆ'“ht –ú¡ ÈÓ€ˆÄĘܒŒ*Q‰°¯A;¡>°.?po?”ÙVs„íéM’˜ÒʸŒB<%<ÅÀ `¿ùõi¨ †Ò¬rY½³o±Þ‰w=3oÛ'÷̫ϴÃGÚáõÃ`êïZ¾æÙýβpżxűvghí¾yámõÙÐÆqÿÜsëÒ[ÛÂ;óüÛ¹×Æ™£®ég]ÓO»çžçì]zdÝ|âÜ}:0ÿMKÿ\™Ô\ܪ©Qð+ÄUY5yÜV­õÃÝ믻!5.&žÆCN‚²?<0*--¯†2OAÇG2$ê_Òž1NŸã÷ e ©ü*vq•ÍB‚l $íè“0Â×<ؼ—ŽL+”ô:nŒ,}^Ù7ýv`ñu×Ì£¾ÅW†ÉÓ7Íýaš{?¼ú(væàÍÄÞ“:í·}Bç4ÕÔ3P®–Vè…YÍ¥i1$: ÷|ÿì¶`8Š‘\Â×ÙϘçž'ž:–²-¿íšþδˆ½·-ýslóŸãÛ¿Oïþ4sæhdõöàø9ûü¥ž±³–Ùkží'Ε§ƒÓ-³Göù7æ©wö…ßK¿½SoŒÓoŒ³þ‹Žé§Ó?‚Yè_z:¼õÚ¹õªoêŒ-Ý=|¢FªÔZ'Ú‡¶T¦3öù§Ö¹ç}O{&ŸõN=ÿd“/€õL¼®Ú=yÜ?ûÆ2ÿ¾ðصpçoÿçÇ©¥û=öíNób‡mªNªaçfؤD6:œ‘ÏÊL&FE @E‚N¤°¨d&Nþx2èÀ„A°ÒÒ4ÖzY{£r Icív.÷OlòôýQ¹L\¥i©Ê†Pá°Ó~´PP<ƒÂH0x$…¥æ¥ÕìçuÍ>]y7±þÁµqlY9?óÙ½¬¼ô,¿r滑ÉmóðÄòÖþøüF¿cRÑåÒôÌXG/N-ÿ8¿vä]<š\ýyj÷o#«?yw~Ûþɺòܵûzhó…û̽çfÿÜ#ߺÇØ^y·~wÌ?äÕæ‰¶îQ­mÕ4yųþhbû…cþ‘{ù9@g™yl}âX|9¼øÚ>÷Ò4ý¬Çûƒeþ©síÙèúÃÑ¥›ü‹9ªˆèB<-ŽCŽ¥£"1p&…fæDgÖ󪓊òñ¬ˆPd°vØ{ÂI`Ï*bÁP"–Íû LN}r͵pÎ1s¶­k¨R¤m3šš;º¹é0ls>mülFžJ¥HZzxËi×LÝ9r¾žÜý0ºôÚ¾ðÈ2ÿƒ}ñÙÔÎ;ËøU]ïŒgzóàâµýýs+k‹ãS“Ž‘qã [Ý9¬n7¬ŒŽ^ž™à]z¼zþ×ùsïfϽ>sìÝ}9wø~dû¹{ë™çÌ«™ó?»×_𦙼†f_Lmý4¹ýÔ²üttùȳz<¾öxŸÈoþG÷Æ‘w÷húÌã©»ÿúŸ ÔÔ`D¸? ‹ QTR…”H¡$‡Ç¥6w(Ú ])Åe”Ø„”¢Ò,N+%ó‡AdP¢ DÃQa8‚‘œ%é49fw¦·¯´Û'ۺ̓s­Ý†".â‹G„X ŠÌ«kJINdERÒØ pTÚÜ:vîÞÈÁë¹ÿœ¿ò÷…³o&Wu;EÝs’Îq§wkëÌÅÝÕµÅÍUçØ°Õéìè5·*ºêø:®À T9 }óýCÛö‰K®Ù+û/VŽ=ëgϽ™ßÿifïýâ…߯·'¶Žç÷~^ØûÉ»q4³{¼yõç…óG+woü¶uíÃÆ•k—>Ì;oMnh/<«/½ë€Ø«Ñå—ÎŧÃ+ÏǶ_L{5söÉôæ@ † Ç™„p‰I£Æ†‘ã©é̤òŒ\n… £¯ëέV´(®)³gAÜÞ›^Xt2ÐÏ ²‹S¡A¾px¢1™)¹Ò.óúá­Ù3—´f§°½;«º6' @7„Ÿ^ʱ8Ü'..’ͦRi”‚ò×Üåѵ=ûïF·ŽfgöºÍKý#«Ó+ç×Ï\XßÞÙÚÃÊÒòôòÚ¬gj¬ßjÕt÷Èu½RuDnI ÙêZ>·¸}g}ÿÉúÁ«ó7ÿcçê{7þ¹uõï‹ûïÏÝüçêÁÛ½›¿}óÿïþ±wûoÛßü²wûï÷þ¹~ùç…ýO›ß{={æ5ÙÄæ‹‰ÍW“[€Þ±wãåèêóÑ­—Þ3ÇÓ{Çÿ?18 £PD ”µ¬°ä°äÒô:… ¥«³D á´ê;‹ÞõëÀ¦·om_ý¾Çî`§$œ ö§°˜FÄWA!Ah¼?POh”jÏ\˜Ú<Çi£baaa~‡x“„¼&—ö´”]YÎL»Tt(™™Ë™ñ^œ™ºÕgßWª§ìÊ—ÖyfûÂÂÆöÚÎÎÆîæÔ´glܾ¾>}ùòîÅË€ÞâäŒÇé² ;L6»¡oP×iеëgfç½S‹&Û¸uxeeóÞ…ë¿Î­?Y9÷fýüOnýãÂí?JŒ Ë™+Ï®}ÿ;ÐØò…÷ëW~]»ü‹wëÙèÚàËóûïÀ8µûjrçåÔîñô™×3g߀qb÷¤ÓûïföÆÏlÝý¯ÿõ…GâÈP¸E˸ܨ¤Ò¤ôª|®FÞÚ=P¯î“ÌŒoÞ_:|1¶~ß³ñ`ûê3›wV¨‡âð1ié¼69-*Þ† ÁCñä¬ÒŠAרàèxvJ¦bq~(T‰`E6¸ƽsÆÉ©¤‚z*ÍÄbY”¨øÔ>ÛÖ1ßÙ1ÙÕá\žÚœ¾}íÂ̤kÄiÚX›Z_u¬¯N¿üîÆ7ç®]Ù=Ø_÷§§ÝãŽé™±Å¥©Õ¥Éé g¿ÑÐcèïê²è;‡]cg§¾_½¿´õãþÕwó÷Oü ù'|eznëÖìîÓѵ§ã›GÀl³l³÷½[Gs{oGVÿo ÇÖŸz6žÛúä’ž—£›?Ž®Ý[úæ?ÿ¯0”ß§r(!…I-IdgGÓÓã y…Ùcž=œÜýLø,€Ö”±ÕÛmí}B•*«´¼Iª›[kV"Šñ… –Þ¢T9&½`É-œ Bh‘ù"ùÀÖyç¹Ë–á©ºÚÆ¤¬xF*OŒ`ªÚºD}ƒý®¡‰±ù 3Ë#ÞQýÁªkÅk²¤.KçÊŒ{gmêüîâæâعõ‰ýÍ©­åѹ Ëäøàâ¼kgsêpwÁmîV‰š,=Ý=½-B à61½5·|a{ÿîöùÓË—Nœ9ñ%RÓéöÌ_]iÕûì`}¿3à½åXøÁ¹ôȺ°¹¾÷Íôê^~EÁâCqØ‘`iw³oÈÎLLò‡ú3•™QÙ7±;søÃÈòEïøš±»'¿<#6ŸMÉ¢ã¢(ªVåH—uÂ8h7*Ü‚Ns¹E_¶h[Uµ-åi¼²Ìúâ¬ÆŠƒºMÒP¦T¤ }J^·’Û¡àꕼU“^Ìí’6·Ö–ñkJ¼*‰¨Y§WIdÒcßÂúîÒÆÁÌòyß Êé@ªRëœ]¾íž8èýÎ2õphîÇ~Ï]£ûFïèÍn×UÓä`€›iòö€÷fÿøõノ›Ž•'¶Å§o x/Y½ûŸˆQüH‘È$BLvdTvt\Qf¥D®šY¿çÙ>òn¿w­¾ólý¶tñ¿lóGµ²IbL#)»Œ'3­nœ¿?·ù ¨lÀ)Lpfé ‡²Sâʹչe¥Xj¸/(²²²¹|³gâæù‹?mìþàÝ5ZÌuâŠäê8J£D^i6:¥šÞØtsË^i¨$êòˆ­Éø†D?+FXš×Tœ_›Šô y²šU]‘¦¡XP–QW˜Âåä˜%ùMeÅ‚ªÒæšâúÊœò’äâ’¤âò´’ÊU‡ÒéñØÜÓŸ…p¹w^‚ZœíªÎþ­ÆzMe¾¢³_ûNçM­ýJûð7ÎkNP¸¤s\{0¶_¶-<6Ï}.µ–i×ä_ÿû#Šæ‹L.dÔåñ8Å|0OZžÞ)èZlí>Ûj¸ÈÓžçë¥}ßTˆW‰ ­V^hX1*?§RÙªùdES;%*#GùLˆ F§%Ðc¢aX2 žžÍ««±©Õ[½}û]}kêžaY§NßÝÚ?,ÿöýµ‡¿?|óêÙ=ïâ¹$Î66|‰ Äý©'¡L!Ë3XâÜ´¦ÜÜÚ¼B^i¥¤Ž[W—ž,ÈÏUä‹+‹[«ËEÜza]m—Tªjæ×d¥ÄвÓèÙby…PR*RÖ4Kë¤jyW¯™ž:5}ysóQ‡a»M¿+hßkÒžiPmãi7¹êõjéW½ÆÕ¬p5K êÅzÕ\ƒzž§[âw® ºv]ÛÕ²)®r¼Nd{ý×ÿ—`¦“SŠãÀÕ ëkeªõ (Vˆ'«¤«ÕÒ]Nëv¥xp+æÏÚJ$á)•a‰5ñùÒ2žY¨™hR çWK@ÉñThh Á!BP(†‘QYÓ%UlåÛMò•fý¤ cP$»:Äç,ïÞÜ~uüàáµ`F¯á ¿ÿ*â‘üÜé¯U,E•‘$Í˯Í,ÊÏÉŒÍÌKÌNeDe„3*“šr³…¥eüòjne§¨º$3· -µ =©ª<[§å ¹tf‡JÕÍSu7¬z×䘲Ýxâs(›’–)ªk®Ì–·,—4/4N+jãdvÝHaÓDaÓxo,;’Ûàc!´X8‘Ç+löfÖZK›íœ¦Á—¿ü?¤8p¢‘RšœQ]X*læiMí®Z¥·RºP)Þ¬–ìUˆÎVˆvTçÊ„ó‘ÙÚìúî´*uV­±k/å»ê% WqC{RA’rZŸÐ `46œ•’‘ÕÐ,rµ¨ÏÔÉv+¤KÍšI¢OS^íHÏX©)¿»¾¸Ûhïîvä•מ8xâD( ›VVÛ_Ô0^Ä[VÈ›-jš+.– ŠšfKsŸL8SÄŸÌoÏmËmÉåzr½…üÉìzG¹À]%°¾ùëG\4Ž›S_RÚÒX«P7êM@`¥-£uÊíjÉÙZÙAeÛ¹r!@·QÊŸŠ)ìÊá ,@¥µò¥rÁLeËtØËià«û£³òCÉ„S¡!H=1£²¼JÛ¦[,—m•(ÏräËJÉøtCïF|Õ6„± M-2–5·”ª¹‰â®°­i(¢x 2¹#2®#5»»ŒßÁÓË… \CNA[l'%±ˆM‹sŲ&…Lh4´H<¼ÖA‘¬­IÈ‘*ùfGï°Ça°ô´ôô;²îª½”ÛŒ¦ý åO¡Ð¤¸¬biw¬¸y¥¬e½T¸RÞºV-Ý®‘íTŠ×+ÚÖª$ÕÒM`œ¶•Ò–Å¢æ9`…Íóe­KŸù˜…îÁ*G´YÞº¬J²"ð&À°¢ Û_`wÀå'“lÖÊ·9¢ùFåO:þþ?>6Wå5Uð‹[ÛÊÄzŽÔT«œäé·@ì*îÔˆêe‡u’mžj[¨ÛhPÎÔj§9Ê©Jåjµ|„¸ZéN½løx|ÃŒG„‡J\a(6ŽËåŠgªuçë:/ók†ª¡3Ì–}ÿ¤é/PÝP‚ ¢ºZ;P¢˜/âoòšø¼íʆQa£ÙX©²V©´Uúú}^iwn½¥D4 N© š±Ô$¥Ú* 6‡ ë†K[W …Žn§ql¥Û³jëvô´hÛy²žZ‘¹´a°¶e¤¤ÞÄLáøsÂöeäkX :2¶ˆç*nV‰ÏT¶í‚h^WÜÀ%À^ºŸV+Û«WœoÔ :”ÿ†zî×ÿüX"UŠÊnaߨԶÔÚ¿ÖdØn6\ Þnµ·@ØoÔî6wlÖk¹•ê•:í¿ã€¯?ߨÞ)áD劃ˆñþ¸pr\*5.5yJ'Ó‹ëDcçZz/jzÎŒH§24ÐŒ¡@º62¥š/)í÷æwîf·¯‘ܬ]+mK+ý`A[gN‹¤PÑÐøÉý‹Å“Y –Ô¼6!E¦i–ð•ËÕ¢ÕfýyžÖkš4 zÔÐÙ 3V -µ"¯@µ^Ó:UÙìNÊ—}@9ñgßùâë _vZ>xZNÛV­b¿F¾¬^uÀÕ\hPòt—µÁe¥ü\¥ä\…¼u«¿Äïº"ê¹ÂÓuíÕsïÿócl„£iìÝhµÊœ×î;J÷÷J×CéÐC‘åA‹é^›õ¾dèn›íÛÓ¥æþCÑÀ7*Ç=¹õ†ÀpF2pFaÙ*äõÀ³Bȉ§QŒÄ†FEODjéŸ@_A4#­6oë½l=oÑŒ®6ôÇ4 ¹=YmjõxUÇrQû^™ö®ìV³äÛFÅ5…|g´Õ-Ã%ÛhÉf– \S̵—´,qeå:&9¿Eî©—/p•Š®ëjýºË³á˜²J ü²¦zŽ@Û «i›¯lYVÚ4VÞdÉ,•°ŠðD–Ó1qåà[«u±¼y\<ðmj¯¹ûjf_Ø{½µÿ[ÑÀÍ&ãuAßÍúŽ«Uº‹ ×ê:¯Öê/óz®·Ùn .‰Me{:Ó,×­×Ï ÌWÚ†nŠ·E¶Û­Ö;À$Žmö{àR2|Gæº+uÞ_o³_WÝ×»¿o»Ý>rEiݨWÛcò¸Á¤¸Sp‚–R!h×™& ê¥Ád¶š ‹£§s[:'-ÞÏÈò®ci·Û³¦Ý´í€ô¬Õt®qàJcÏ·"ýM‰ö¶¸ãv—þpVäéÂ%{1ôö`¬ÛѪœ§™Š®+¥i2::C ž¬×or¤\å~«Ìiè7óeõœ¦B®T&Ô:š•ó|ÕN³fOj<¬hu·ux+ùê:ÍNyúÝË;¿[]¸ÞÖ¾&5#¼ªº%³ÝT;ïI­ßòZM×eCwÚ,·š¾šn4õ]å/µ˜¯KߊíWäöKJ˞μùö˵‹õÆ­ëÔyMâ¸Öf¿&º!¾)sÞ&wÝ”»n(G¿Uݦ½©qÞÒ:nt]7xù#켺`rô)õËPrTz¹Âà´y×¥]Öèœ2\Ø_B0~VGÚn÷M/ŒML{FLJ‡Ü½ƒnQG0¸Ô­×Ñëw®Ú&/iL+ÄÁ57¹±kuRä¼ì4³Áx}ïÒòô–{ú@gY³L_ÖÙ6@Œ†ÑývÇ™Žá³ÒÁÕÖž¹yD¥u»Ý}¨²ïuº/€w;‡64½“ü÷GñÀœÜ¶¬qlª‡7åæ5ñà2ø”ܺ¡uìê\g5CÛRóªÌ¼¬ZU­É-+ÀU–Õ–®±Üz .:ÉtΈ¤¨èâZ®DoÐõÚäý²Žž\‘\X:|QD\t|Qks›­Sííuìz&¶'ºÚëZÝ­½Kí“Kƒ+£Î­~Ϧ̳¤6{¤™µFFZ??™“?Ûïê·.KûÖ;íg¥#‹•Ô¨ëS{·$c‡Jï^׸·QÕT\ŸRV—¢ëS­–v“³Ï9¯èuµvô©úû ö¾6­ öUË s²²béÑtv*=¡ ¨N’WÕZÁW—4ȸòž²«èo÷q„íå}ƒbX¥ÈP-î«hੜ5m|¹‰ÛÚñëßÿoa‡UÐekétµt »œbظw¼ch *©'[ n±Ñ¥0y•ƒã­'Wc©SöpÅ”„_4Ê=K¬äX¡\ÖªP5µI9\^i]CycCvY#>ÚŽè ÀŸŸ”ÃË“…v‹nXÒÒIOšˆ)_ÉÍWjíbƒ¾s€×Õ]+•ŠŠjÔ‰™b<ÊVZ hn­lÖä65ÃB¡"::¶^¢TÚÆ%C‹¢ÁqUO ¿¸° õ‹x*zâ 0~%2Ø´˜$MЍ8jLJ|NIR~yTz;½(2¹$¹ ‘™\œšW“š]þæýߊ¹µM¹U¼œš¦nkE‹¼^¬©—é„OÕYÝ¢(jlåð%õ2mXUÔØ’VQWXNKL-R§áþ~?ÐxLa‘ 9…i9Yyy)¹9¬Ä°ÏL¤E†QñDb<<ƒG'FàK“#äé‰fVüb(û"4õ2&oƒVäʪíå eÍüúºª†ÒRNrB6!¸*1<>-—˜VPÃÈá””FÒ)%e¥Üæb ²†–æú–¦¢êꔋB¥¨»d]&C›V.íT5ÐáIAÐcàúìD‡ŽûòYyÀ=88îqÏÎO1Ù‘Ÿ}þç:qâÏ'|NŸòó=àê †›$,•FcÇPY‰ÑÉyh 32*™“øæíÏ%%‰¹¹ìÔT`qYY©……àNfi)0ðܤů‚‘”‚‚„œZ||dZžÍ‚QAÓ,ˆòýç &I ÇÞà0=*!Kƃ†Ø°(*†„À¡ø Oí0‘pXÊÆç !m¡Èe8ë|PÔ–?s,$¢;2QWX$)/®.ÎIM‰§‡a ˆ/8dþë0"!·ðtËÄ¡‚ãØ‘Œ< 4“ªóÓÔB·&ÓdÖ”–g–Uæeüô´¸L6šÁÒýa' ðD¢´¥reÊ}çÂᙥ¥ÇßßyýòqrÛç䟿úêÄ_>;áç{‹d†Íð¾¾>_ûœôõ?D#"£Øñ)éé9$ð1±111>|¨âÕ•ÖVä–¦æeƤÅ^vrtBVR§ ³8;1;9.#!);-%7#&5¦ƒ38‡   „ Æ‚>ŠùñÇa /çh4 $ à¤PЗÇÁÈx D'âb)Ä8"hDOÄC0¤:©Fµ 0eTB6›šCOIˆ=ÛŸþ‰ö™â³SøÀ“Ì—4òi*4 #BO¡‚O‘0*•Ìb†gÄPòÃ2?µæE§§ÇÆ%DÐx" ÆÄFÆ“H ‰D ù±Y¨òÂÔ6nõ N·èñÌy\3GY~úן8}òD°ßÉ“9äûU3¯nyaZ«‘CBü|¿¦ñá4r\\LFVzzvV^An^^NNnƇŸßö˜z£Nª‘4‰xœúÒüòœNnYmqMSey] x[šUÈ)(®,Ê*HÁ0¨1ô°h2™…%ƒcÌð  B¦Øð¿‰AÁÁ†ˆFAð †Á‚™ø€H´¬³HÐÄ0H*‹¡†C³ œ¿rßÜÿL  ÁiT$ø`0>ÈýùiÌç>Ä`Ú‡AöÇc(p6 ‰¢âbYÉÉì‚dzYZdNZTNfBVVRjZ\|bdl"(°2 ¢ Ër £’SÃ’¨‰ÌD´ÿç&&ç&Å5U—¦D3 §¿ ƒi ⺹Àª²¢Ò¢\Í*ÎÏÆ)/ÎÍËÌÉË,*Î+(ÌÉÏËüåÃÛÿ}ÂMendstream endobj 16 0 obj<>endobj 17 0 obj<>endobj 18 0 obj<>endobj 19 0 obj<>endobj 20 0 obj<>endobj 21 0 obj<>endobj 22 0 obj<>endobj 23 0 obj<>endobj 24 0 obj<>endobj 25 0 obj<>endobj 26 0 obj<>endobj 27 0 obj<>endobj 28 0 obj<>endobj 29 0 obj<>endobj 30 0 obj<>endobj 31 0 obj<>endobj 32 0 obj<>endobj 33 0 obj<>endobj 34 0 obj<>endobj 35 0 obj<>endobj 36 0 obj<>endobj 37 0 obj<>endobj 38 0 obj<>endobj 39 0 obj<>endobj 40 0 obj<>endobj 41 0 obj<>endobj 42 0 obj<>endobj 43 0 obj<>endobj 44 0 obj<>endobj 45 0 obj<>endobj 46 0 obj<>endobj 47 0 obj<>endobj 48 0 obj<>endobj 49 0 obj<>endobj 50 0 obj<>endobj 51 0 obj<>endobj 52 0 obj<>endobj 53 0 obj<>endobj 54 0 obj<>endobj 55 0 obj<>endobj 56 0 obj<>endobj 57 0 obj<>endobj 58 0 obj<>endobj 59 0 obj<>endobj 60 0 obj<>endobj 61 0 obj<>endobj 62 0 obj<>endobj 63 0 obj<>endobj 64 0 obj<>endobj 65 0 obj<>endobj 66 0 obj<>endobj 67 0 obj<>endobj 68 0 obj<>endobj 69 0 obj<>endobj 70 0 obj<>endobj 71 0 obj<>endobj 72 0 obj<>endobj 73 0 obj<>endobj 74 0 obj<>endobj 75 0 obj<>endobj 76 0 obj<>endobj 77 0 obj<>endobj 78 0 obj<>endobj 79 0 obj<>endobj 80 0 obj<>endobj 81 0 obj<>endobj 82 0 obj<>endobj 83 0 obj<>endobj 84 0 obj<>endobj 85 0 obj<>endobj 86 0 obj<>endobj 87 0 obj[16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 86 0 R]endobj 88 0 obj<>endobj 89 0 obj[88 0 R]endobj 90 0 obj<>endobj 91 0 obj<>endobj 92 0 obj[91 0 R]endobj 93 0 obj<>endobj 94 0 obj<>endobj 95 0 obj<>endobj 96 0 obj<>endobj 97 0 obj<>endobj 98 0 obj<>endobj 99 0 obj<>endobj 100 0 obj<>endobj 101 0 obj<>endobj 102 0 obj<>endobj 103 0 obj<>endobj 104 0 obj<>endobj 105 0 obj<>endobj 106 0 obj<>endobj 107 0 obj<>endobj 108 0 obj<>endobj 109 0 obj<>endobj 110 0 obj<>endobj 111 0 obj<>endobj 112 0 obj<>endobj 113 0 obj<>endobj 114 0 obj<>endobj 115 0 obj<>endobj 116 0 obj[94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R]endobj 117 0 obj<>endobj 118 0 obj<>endobj 119 0 obj[117 0 R 118 0 R]endobj 120 0 obj<>endobj 121 0 obj<>endobj 122 0 obj[121 0 R]endobj 123 0 obj<>endobj 124 0 obj<>endobj 125 0 obj<>endobj 126 0 obj<>endobj 127 0 obj<>endobj 128 0 obj[124 0 R 126 0 R 127 0 R]endobj 129 0 obj<>endobj 130 0 obj<>endobj 131 0 obj<>endobj 132 0 obj<>endobj 133 0 obj<>endobj 134 0 obj<>endobj 135 0 obj<>endobj 136 0 obj<>endobj 137 0 obj<>endobj 138 0 obj<>endobj 139 0 obj<>endobj 140 0 obj<>endobj 141 0 obj<>endobj 142 0 obj<>endobj 143 0 obj<>endobj 144 0 obj<>endobj 145 0 obj<>endobj 146 0 obj<>endobj 147 0 obj<>endobj 148 0 obj<>endobj 149 0 obj<>endobj 150 0 obj<>endobj 151 0 obj<>endobj 152 0 obj<>endobj 153 0 obj<>endobj 154 0 obj<>endobj 155 0 obj<>endobj 156 0 obj<>endobj 157 0 obj<>endobj 158 0 obj<>endobj 159 0 obj<>endobj 160 0 obj<>endobj 161 0 obj<>endobj 162 0 obj<>endobj 163 0 obj<>endobj 164 0 obj<>endobj 165 0 obj<>endobj 166 0 obj<>endobj 167 0 obj<>endobj 168 0 obj<>endobj 169 0 obj<>endobj 170 0 obj<>endobj 171 0 obj<>endobj 172 0 obj<>endobj 173 0 obj<>endobj 174 0 obj<>endobj 175 0 obj[129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R]endobj 176 0 obj<>endobj 177 0 obj[176 0 R]endobj 178 0 obj<>endobj 179 0 obj<>endobj 180 0 obj[179 0 R]endobj 181 0 obj<>endobj 182 0 obj<>endobj 183 0 obj[182 0 R]endobj 184 0 obj<>endobj 185 0 obj<>endobj 186 0 obj[185 0 R]endobj 187 0 obj<>endobj 188 0 obj<>endobj 189 0 obj[188 0 R]endobj 190 0 obj<>endobj 191 0 obj<>endobj 192 0 obj<>endobj 193 0 obj<>endobj 194 0 obj<>endobj 195 0 obj<>endobj 196 0 obj<>endobj 197 0 obj<>endobj 198 0 obj<>endobj 199 0 obj<>endobj 200 0 obj<>endobj 201 0 obj<>endobj 202 0 obj<>endobj 203 0 obj<>endobj 204 0 obj<>endobj 205 0 obj<>endobj 206 0 obj<>endobj 207 0 obj<>endobj 208 0 obj<>endobj 209 0 obj<>endobj 210 0 obj<>endobj 211 0 obj<>endobj 212 0 obj<>endobj 213 0 obj<>endobj 214 0 obj<>endobj 215 0 obj<>endobj 216 0 obj<>endobj 217 0 obj<>endobj 218 0 obj<>endobj 219 0 obj<>endobj 220 0 obj<>endobj 221 0 obj<>endobj 222 0 obj<>endobj 223 0 obj<>endobj 224 0 obj<>endobj 225 0 obj<>endobj 226 0 obj<>endobj 227 0 obj<>endobj 228 0 obj<>endobj 229 0 obj<>endobj 230 0 obj<>endobj 231 0 obj<>endobj 232 0 obj<>endobj 233 0 obj<>endobj 234 0 obj<>endobj 235 0 obj<>endobj 236 0 obj<>endobj 237 0 obj<>endobj 238 0 obj<>endobj 239 0 obj<>endobj 240 0 obj<>endobj 241 0 obj<>endobj 242 0 obj<>endobj 243 0 obj<>endobj 244 0 obj<>endobj 245 0 obj<>endobj 246 0 obj<>endobj 247 0 obj<>endobj 248 0 obj<>endobj 249 0 obj<>endobj 250 0 obj<>endobj 251 0 obj<>endobj 252 0 obj<>endobj 253 0 obj<>endobj 254 0 obj<>endobj 255 0 obj<>endobj 256 0 obj<>endobj 257 0 obj<>endobj 258 0 obj<>endobj 259 0 obj<>endobj 260 0 obj<>endobj 261 0 obj<>endobj 262 0 obj<>endobj 263 0 obj<>endobj 264 0 obj<>/XObject<>>>/Annots 87 0 R>>endobj 265 0 obj<>stream xµXIܶ¾Ï¯àÍ`Ô#’Zç–Øñ{¾8ÛÞÁ@"«Ù=е´%õ,ÿ>_qÕ=c  L~¬b-_UQýõгÿ8Ë“«»«¯LÄù–6cV¤[Áb,2™l9¡7xÊÞ ì—«˜p"‹ä)KŠœ 6*¶ðŸ+™A(ËmÎ:V”ÛÂ.ZöÛU°ìX)¶e€i¹¤Ì¶)är2Ã,H.XB'Yµ`F®[ ¹LB<Ñ ’ –À²mb¥_vŒ‹Æ,‚\ ºÄjå°;TËË4¼@¨Y!ØâdEš¬4‹ŒšE^ Nl‘ `NVÊŸ%wdB©ðh±Ø¨Ñ¢Ð÷†V™0å1ŽØ´$zA’pÎ[Œã¤[ÈIF8¼€^”—ÜŸî˜ÈK¿"YQœ¬D`F/+eLa´še¯4Ët±£c ˆ ×Y­XAö8'_õJ›ÌsÊ€CÓœ®YP°.XTðÌŸÕ& AF:¤q+BM"w–“½ ,X‚ÀÚå’âbå8×õ ç%ùæÐTGxA3f‡º2´”¬H„_igMM++rQ/+@odÇ¢2Öôñ¨äš@MuAÓÂ;OÙÑÄôhÂcJˆ•MRžEB‡¢žbšƒºhô‚üAµ@­ÅÊb›Øa6@©€‘t/ÉQJ°ß¢—¸³&NËi° 5‹L—¿••(÷%V»›:&a"|ó÷J´» qœò³ šÅš­`±I€^i‡¨r(‚†d-(ŒD,Š ‚` jhbQÐÀy ¤Ìu(Bï4™`”ä CAÝŠ_¬’\øÉÚàXY™ëÆâcY4ẋz”‚ã¬D¨Òr寡…æ*Oû£t«)6‹q8‡@y£Às‡&œ\_Ð$§À94×íwAMX-Jáð¨@#E¦Wh¨D‹‚s^VÂmg±F¬d‰EHÕœäÜkÒA&ÖH¨/Ñ„Ð5s» }«ðDFs’@ŽQž,h¶åèu,ûJ¶ÌY3ãÍ”^4‹,]É 8 (Ü2°JÆià”%B±h–IÈJ¤Úi²™Ï˜Ô]Z@T¯üáîêæ}‰mTàÝo´?¼W24XYìn‡GÌ]½aÛ›ÝPß´UøUí·OÃ\·ßÝýidérÈFN8B–óL@ánósU©êæ}Ó*ö¡ßcWÍÍÐ{aN¢1 o¥–ø8°£bÇqxhvjw3ª¯§fT;’¢³ݸۼSû¦W;öÓç?U=O7oÛjšÔtk”˜y¤ï¶,$q{«M¿½ý­f:¶±‡¹;QK/Jr{·ù$EÎ[ë³¼Îïçyl>ŸfõéÓ^,º¤Üf<3öüþû©ÿÒ:|›kmئjÛ¦Ÿæª¯Õ¤Å–ý¡7êQUÖJ{¤AB¤g§¦yžÏ·÷M;«ñåÝéun6×t ²&û‘ZdþÑŸ2†ÓvÓ?TZ»æ©Y¹H'ÕXu 6Ô½kÑ¢¬<íÕch©5›ô,rœðhMô åFu²ét„ ç'ôlIÅÍû F9Ö~“T¨ìŒ˜g(­Ñ •hÁ±eAõªjÃ_—ìãQõ«¸TãX­²Xæ¡GCë{UYmœ{V·ªêOÇÕ™¡ß7‡Ó¸Ö4ôs…<­­´Y|à_`šz¨t_qÜVOÍ4¯tª'íû[gÃ÷ã!¼ò’¦f' ¨¡ÙžT5Ö÷+!O ˜rPóOÍüߪߵëZ¸¯¦ N4}}ÆìËb» ÿùÆ j'TAuyÛtY5Ó £qïÌÄõù¸Ê`[]pèBe7<¬dú¡é›—jZ—éy‰Òú2ú¶ÑM'L{×™é“Z݈å+Y™N¨ã½I:Qgeÿ©?Sv:¶êA­8x:ž%åah1ÃÚ•¢‡ÇÊÆáµòÇÇÍÓõLÁäÕ3* Íó,g¾3)õx{;¨`Ïæ>Z× ^›Ë}“œEx!%ÏéâwjªÇæHÓWkÄ;.ÓÂL–ÿýtW·Œæû ã¿TìÕ¨0Q¶Ìˆ}VƱÚÙ‰kˆ51TÓTT“ö;rJ#mÈzè:X6}úN;áÛV”²TÂæ»Ï¤Ú=Ùƒ_vüä«1T1Rë/ˆ’7JûvÙ²3Nôì³b§Icd)‹ðµ˜ò<ÃUé¢v±ú±z6Ï“ «8C6,Âmóiì'í+¥ž {ýïköxßÔ÷¬§ù™ÛgÆÔ“ªO”W“ƒmø°gͬ%álÞCdžÓ<áE·TôÚª¯éPh„Çad¨Æ ´ _TþÇmÞVý›™áM¶cÞ©7o^+ˆ¿5IŸaš¾ ¡":˜]“möØÌ÷pã>õ¬§2u¿tKçœN>zb™Šu²Hoz-ë"?´;“%6úà¤~¦ ŠÚã•fu Ó«Æ®z&íš½®7ìÚ1}©K¾½Š€}”Jr Q"H¬Éf˜LÐUuÇù™áí€úy-)îýñÍGŠke:ü¾±ÿÍœ,rßÈ+¾MEZ묬2⹿„ž´10u•‚a®·|Ó?ÇLC/ý¾>,ºe¿Ú*5YZ™FÏ'“_< \JlsÒµŽa~?ì^KÇÿmn0ù{ÍæŠÝvK3r±øŒ\TÿºÅž‹½:©axM°ÎãûO[›Ø¡Œß9ЏÈð£8>†Í(3#)ÂOüµn/ú[–EÑ«s˜ã·žbìäqI³½v2)À{3‹99ôãÝÕ/Wå]>1endstream endobj 266 0 obj<>/XObject<<>>>>>>endobj 267 0 obj<>stream x½XMoÜ6½ûW rɰ´ß_¾M[¹´i°‡q´Dí2‘ÄDyí ?¾o†Ô~ØZ‚&°“•ÈáÌ›÷f†ûíbHüÒ|Dã%ÅÅ»ÕÅ€ÖÔ¿]ÐpH«Œ†ÓA<د:¥£ˆ·]÷Ü";ÕÎÔš¼è§ ÌGžzɼxÃß´nÚRȲ­t¢S]&š¶ÊmÎ+Þ:8P¤v•)×?žV•^ßvMU 5;|Lj{ÿE'®ïÙßw“lØ@7«±ÛCH Ž25˜¬Óx/mwz »°vÂjÿ?yK¶bûÑ$žÎç³É)ßÞŠ#²jq/wŸƒ«Uë’/ãÙ‰d€®ô)õDØRðšäýe•-‚•ôªÄ5J¶E@‰î™±¾ÀÈö˜Þ—@«Ð©QÕ“ðW^ƒ°jÖ¥’,3f=C´Œ‡Óéh~ŠPb‹mã”3¶Œi…|ˆƒ>\¹¼ (ÕV‡Jº×ÔÔx2SÕÂáhãéèÔ:ªVSèÒ±B£f{™k>(Ibï\:Z¤_MÇt/ö颙8“ײà‹,ÀZu¦£­œEF«ŠYo#Êà,í“Íaúò"ϯvåà—D܉Ìm`¼—ìiªJ¾þ×ôœw¿Íˆò?¤'šÎã9úfÔæ§x ÅuÉ^¢ÑîbWTolå<åÀ;O’Oܘ>?ÛÙ“Èœä¾Ãð8©éK,„óè¸c'Ñç Õw¸z«“™DØ©9BNí Ô•S¦t;kŽÝ:S˜ï")ß %dÓYÚUÆiay„ÙbuÛ ¦ñx2˜>kšžm¾ŒðBÀ£R»ƒïz5 ŒJüJï.[×»[†8<‹³ÙäÙlÁ3D[Ïã:\7¹CÌ™G¾u®ÇU!à»C]¶ @ ª¯|k?[Él<-ÇK…£`E!MUq]hsÅÚbhBLnSÙf½Ùëü¢3-ž==cY®Ö> (*í/ÕÚhÞñ=¤Á¡W"e?΃)s©ÅKˆ„ÙÌpÊ¡˜%v&Ï÷å”_¶Õ#Pd/ñçÀ“â •’ðÓ%6‡l#krèáš HŒƒ±ÅÈØÅ\i'Ѓ_ík챋'ц‡…O¥ä¼¾¼t˼ð=XýûÏU’·)nÃÞ•.A}MÍUò Ûê}ÊÑüùG#Í ÍSÇŸeù›—®^_?Z—ä×ך[%Oá?08¼óÔ‰Ý꺉¶ºâϘXn0ç§] ÷;è·QP¤0’¥:3Ü!LÆÆŸ8h´Õºz¼ ü’ ÊG_à¹|@Áòdï¬|¢ ö3|,z~Ò=+Z• +Wy0 ?;U¥(?|o@'á²ÍwÝR¡íX 6ÞYÛ0¿k0´¥Üb 𭣨ï.¯B˜Oâ:¯  :‰ƒ ž7x×Ã(Uú¡Ø)Ÿ{?Íwv€#cPz›Tän¯A&y4¤·\Ñ=Ê]i¥-qÄûNã-Ê|#óÃA`Šçax™î­u˜ÚÕ–„¸H‡Á†;ǯcxPðcžzP&ga‡;Tt¬Ý½ Ðð2³nPdÃ|cË6Ë^¨8ô8øÆ³çá þšÖ¹½Ç¢§P¡žE! üŽé\;ƒ€dº‹¯ºÁÒab¹ýÀ‰pYSbŽƒǵ —åàÏùˆÉçFpWž£4×e17ß¹9óE+8’×8Ëæ;3¼ß&rô, G³…ToÙúŠ\¤v²¬_©[‡4Õ6s¸ñUšù÷dñ@SÙ\&Kž ´a­–)úKo¶‡ˆ“‹0c-yãþÚÇVû·“ðUI´Œ'ƒÅ¿+‘/2|Oˆè7›ÈÍ@Æ$Š"Šû©Mú¹*×u‹ $½ÃÉ÷ŒóÁ’§û…ÕZ÷o ¾Dx_B°…ØàÅ“Ê “öFüù÷ÕÅ_ÿµzYendstream endobj 268 0 obj<>/XObject<<>>>>/Annots 89 0 R>>endobj 269 0 obj<>stream x}WÛnâH}ç+JûD¤à`À@xËÜvWZm´¤Ý‡H£ŽÝàž±ÝLw;öë÷Tµ3!“(4:uªø6HiŒß”šÎ)¯cÚâ`’¥I:^Òl¹  9M|ðë`º¼Mp¸À¿šfi–Ì⛊ïÖƒ›OKJSZo(ÍÆI6ŸÑ÷× ®ó¡ñThœÝë‚Tƒ¿ª‚éJcOClòíS^)ïo|»ÓN^>^Q°dC©ÝÕúË`šŒ³t1×£qF£tšLàahŸ¾è<ø¹ =)ÄÜóæéEWUB¿oˆM ½Ý§s§UÐr@ˆÎëpMð£ŸxágÆÓº¸¦§6PcÃÉ™˜èåÅ‘|ջкÄEãßÌÁÔ;ë‚jÅK©<U…i¶¤hc*M/&”$iÂçÆ4æ >¾(ñß&i–Mç(µЛ†îwº¹{ÿmE«*ä¥xAaŽ>¯úþÞ ù5Ž¢ ŒÃÒè\{¯ÜžKx@#€B7 OU<Ô!O$Ðr4É’LÊüñ»ªw•^El˜š=©Òh§\^îéŽï©_¬¯ê²#»¡wâ …íl¹wfÇyIŒ‹q2™M¼0C°qÆù†FU£(7Pî<£=)ìGq†€GQa>>†ޡפs-ˆQ!8ƒ="Ž÷ä,(ú|Üb˸â÷>èZ"ƒlD¢A¨e‰å"gú×Dk8š¡(›¼ºîö²ãÒ×?­Í÷ÈÇa÷¦fxuˆ=šÒ¿ÇõN%XL'Fõí-ŒEVÉqd,b¡Aä6ȶXÌgqr¹-ÇûgS`èK0÷[«±ñÔÄ–xÛ’9·AÇ%ô“cçܳªZŸãät.ÚïT R‚(ªBFû»¯€Xä·Üê•ÁRƒ¤äÐC‹й¨ìû²DeÄþbŸAAƒÝöË7êa²ŸÂæ-OèØ¶pȇBi)Ò©€]'Ϻ¶šÏ“e†ïóq{8γ}838Qr7–§¿õ&‘M)=Ã×— ‹ãb|Ë«¶z-³%ÀÝ6å›׃¿ÿcU…endstream endobj 270 0 obj<>/XObject<<>>>>/Annots 92 0 R>>endobj 271 0 obj<>stream x½VMoÜ6½ï¯ä¤WßÒnNm·è¡I›=ˆ{ )ÊË”7"7ö&Èï )Ù+Çî¥@a`a‰óùfÞ£>­RHð/…:ƒ¼ѯøy•¥K¡¨7¬²bsÿ¤á=ZÜ KQ•l“¡USC£„nõãnµ¾l Ma×A]°<É Âã]‹ö;½ã#肋£Ý¾Ü}\,)›<‡8OXQ6ÚEñ€tØÔlÓT59¶ÑoøLn/ÁjãÀàBHk¡M|sýQ <˜,(D<Lj³”å)£­é¹R4!Ex WÑÈŒ 4·öê%%æ!­àv¯Ä”I¯%­lÏ’5°HÖµSŸ¹>£¹ ßÔµ1Zb &´)TwRà XüÑØó>Äÿ÷v+ÔÊ:¬ë,k½ÌÚÊŽcb„zoZûÐê„&ù{4o H-{98Äq™?´9EŽã\kÙÂAŽ08ÍYFˆNÙ.9À`TÁ”ywÐJ(§OSƒjØ£Ú{>ð›c v:›g}¾WS)ðÁJÝýõo¡u&ýO6ašµƒIÇyövoŽºGN8„¡ÑCˆöŠÂ!]Ê2«eœ”0 ÆI\OîwñDd8ÒÆºQ ‡À-ö wí€x¤C† ÚáY¬¬ëªX†žÚF¨À1˜ño_‘”S\«/Ü)ã7>Þd,)°¨lƒqšœÆwI;f° V:®´½a‹ëã¹DíDîè̈‘ü£ßõåÒ’!e;ˆ'¦ÇUʪ$ý‰¨ãIÁ[¼>:߀wôú€”%,/©oâÎòmáì-f›æµûEŽÊ!dß¹m·wÆ ½Ý¾G¥ ÓG:ã»~-­Õ€ñeÖ ËŠ|"È}Å~•qNˆñœd'ì`Ðéq•-|:ÊÑ—R Öq2Q»ÖÒzÌÎ(ó¤³úãi¨Ô@š„±y٘דßo»²‹gÃ…¹ÓÁƒ4.¢­ÈàAäžDû$z¯vOÆâ¨ñ·§GŒºñ#pã1HwV±¢Áp€oòÁÜù!ÿ!/~5û^ù‚L×—Å„^U±¦, *+VU„ÞŸo‰{1šŠ#]è^ò!Ž­[#Ö—èÙ1¯Œ*N‹o© Õ;ÙP€ ¶Û¥ZMÊÊp+äõf·ú}õ_A®endstream endobj 272 0 obj<>/XObject<<>>>>/Annots 116 0 R>>endobj 273 0 obj<>stream x­WÉnÜF½ë+ê8Ä›;}1;N|‰g90Zdψ ™MJV¾>¯º¹4Ò!ÃnÖþêUñÛ…$’Ò€Â„ŠæÂ§Ÿ/‚4%i 2j(ô³å©¦?ðÆ"Iœ‰< (ÊR ¨×t¸Èr‘SœDx»!%BNO,%ã@Ëmàç"ÝÜ2†­Y6Ù¢{bÙ ŠD¼Þ»­æ “[Íy.ülè¯o#xno­·³ÝÈNn#ùr›rd«W>Û‰ÙvCqÈîÛv8¶™˜î¤ïs^–Ké§Iå'¢2Ž—· ¢py²™ˆ·Vƒ,ã¼,šƒ<ÉâS(£Ía°úL¤’³¸È†iÊYœ|ŽP-ĺÜZ«¨ŠX#Ÿ“dØ%Ô>Lw.ùËtÉŸ.9T˜Xo%k “Ž0`Ø=÷dC ›n›ß¢\U<ðÝû‹«IIû¡,¡P îK s_ìö7šLÝ t§zÕèA÷†~Øß^ìJ}Pc=Øß—î¨j«¡hJ{Dª-Ý齪G½ߨ{MCGךF£KjÆaTuýÈB^*’ síù y2„‹ûr§¿õhª{]? úØõÔtè‘RªªÍ%]kà pÔZÆ¡ë+UÛÁÿ¯>æ„®ˆ8DoŠÑK¤Hü gåî}­Œycß'û{²YñÉC½ÃxyÕ]ÏIÛ½yAhàÝWƒ:êgbŸ¯oua3h=œÍr¿õ]a®>µf¸ã_ÖÁµV ˆ,ιHåîë×±ý»íZÃT dµ‚¬j mžœwÅö èµ¬w»¥‡nûë)µúÎÖi}Í ‡ª&ž¾ìN£ê.ùory©,«=týÃòÖ #3Tí½z¦µ©¾W'!²‚—3Ä–\Þ¶®µúaû¸ˆž=,î†ÿsazýqRpõ LÌ4/"Mr~ ªˆV@¾¥·ª?š·,ú$T«û]Ý3˜Ñ—Žx¶!C3½é0TŽÕ_¹$´`¢Sï¸G¥eÂ̵[ظ÷†àš³23L>à!¦ Vî«ÀL¶º¨›ðæjlõ¿Z±wœ4Æ–9dTýs®]O¨µ)È Êl ñúÑúä*j="â,+Æ+7ä0l=Ø(Çã,úµ³jp`ÜŠ¨ÚtT@ ˜1ô ¶µ›ªãØÛôzg-/ÄΡ±ímˆ[óŸÛú—dt]v ¬=#·;b˜4Hu£,£lšëAµV+ 7N¹˜7ª­Lc§Ëíh†5ð9ÕœiW¸sÃÄ¥ÆÐ}¥œ¨m‰³Eþ¢‡±?Ó‘+ZVʪï¹ÄÆàg ƿ %²é]» Eå('oM´(óÙÂ×+tÏuÒ«|ß5w##e­ç²rx,Q޲} ø1™¢î@ÊAñE¼¿”ŠÃˆÉMß0À«C€×*}‹rÖxõñYv° ¥©§¯&'Á¦†vD¯Ø]Ób çWPÁÿD:¬Ê9Ïá;%âà¢ÀDÝŠG3Tbw­?¸Î$¥Ë‰;¶<Ä kîzö‡;¬Är³Š¢7Ø…Ý ç«:Œ7í¨½ç&FvO2iSb51OìølÞLupAã›1 ÜN!…õBº£e­9kÉhÕ7ܲïÖ!6iô€Ü~]ð9¤fb6¹át5 }u F2ÞÖ™yŸ œ?[¢p.Äz+ÓDäðû)FÓâ e.¢(Æ·s&¤´;†›²}è ;í]õ<ÄUÙWµj_ôA|ï†Â~#x2Â÷[Œõ&õínãÖùÍVá³8v©‹ÙÿŸö¿_ü jÂf­endstream endobj 274 0 obj<>/XObject<<>>>>/Annots 119 0 R>>endobj 275 0 obj<>stream x½XMÛ6½ï¯˜[¼@ĵ>lÙ¹,ÒMRäÒ¢©Ñö°®DÙLeÒ‘¨8î¯ïÌ’å¼P ÙK$QóñæÍ›‘¿ÜÄ0Ç¿òÒ%û›9ü|“$K‘ÁrµsØC’Çb®jøý&›¯ÅÒ$1>Í’Ÿú+~:ºÆ§Ë9Ú8?ýiƒ¶p÷aq › âl)Òy‚æsØ”ʦ˜=Ⱥ·S°WngK¸Ý|¾™ÖTzÛ5НÀYîðYûôYŽÚíøú«¬;ÕÒáX,’Åj¥¢ù¢8 :šûU—ªé ¼Z4J:m 8½W6/ SÍ¡Q®%wäg~¶.›m·WŸq<µ’¥6[(e»S-ȶϬÀL[A/Gq"’4FãK§îFéAÆÛ“Ðh£Ý€ Z´G [ZÖúŸÑÓ‰1)jÙ¶>³>Âgð‚‚è’ Uc÷|ŽõF Ö-GMb…rí!TÕþ­ºy¢{•nZ¯¢W“`dŒ(IE¾\A´ˆÅš«ø@% o×'`8=]†Âƒ¢ ئT ùâÛôÊ^íms‚ÊâmôoÔ1Ѐá1ôæd.¥ªdW;ðôâ÷²‘ÈTÕ`e¯VɦØ!ˆÈ¤¶;¨†QDz?Î$ÞQtEæS1_Äùò’–•íLùx+àƒ6k(›5­kºÂa°œÒ¹àºå¤½7JdÜhà 6½8]ž‰*Ðk¡ãæIxE4Ü 'Ž„{&´dèV ÉVN™>0½?ԺЎ“il·õýɯwæocŒö KRì¤ÑížC„ç¸C»QÄ=ʈ/oá ÷b¬‡fð^lU›ìOš¯,5óôHú²ßKSúªª/ÆšcOÓÛwŠ _Øô*€ÿd;Õ`ÃE…­±` Ö†^©C΃7}|¤ã ôòõ§¢k‰u{y‚£4ŽE‘ŠNDÀ¦»Fš'…´Gªà±†z.Ô¾fà3±ÈóevÉKkÐ"Ñ÷  ]ð-âà+P߆âb›‘ßZUH£·;”Vn<[ñ£³+I^ôu}¦VFäd}”'$”AöXS ,+,â›ËL6*Õ‚äŽ+ÂÑBtnGøCítQ{Ÿ±Žò¹H²4Ç¢Æ"—4“fŸ”ëÃ>ûÇ8¦Ê™Á®Gª{´YˆJTÍÖIŒÉÙ¨–„`*¶x¼õA¯q¢<ãÁŹÀñ”’Em*ëOõãqFÈ(e(«4…(‹,œÛ™Hoû"ÌÞÀ9ËÙŒ³²`4îØúdâïT[4š}ŸýGãKtà‘‰Y™ðLƒü*u-ŸhRZ/N¤„­ âáÙM™Ï¸‘éKÏÓErICY·¨á6·$ß¹ûˆ´O(ÊÌ[­JN7a`’üB¥äPØ\±ÓuÙ ÔܤCa7÷ÛðTà‰Ï3ªkTëTIF-¢òã¿êHÉ¿t8+ ˆ8-N/¡Á{À6nÁXwŽ×÷ä¤Zqÿu‹‘;”")j‚ÏÎaHE3Œqÿ€y»—‡Ôõþ£V‘ñ ¸û÷œŒâL$+ÜÃNò˜&9v%pæX8-±"j?P/>ƒgÐSdäZçèŽs/aÎ2m¯× å‹ÁõËÖÈõâ¥Üª«å—Cñ¸© ,€C4Y/\ U*R‡ YôÙî´jhq8¡6V=ô4Ôê¾f$û“Í%PÂjB»ˆg…*¯¡Ôð"J}Ÿ¡ÔK] ÷8ƒm‹«ùý †Ä¢FÅ<êÅÔ¯©œõÖùâ"DS/´¸W…=“l:;Y„£ óñÂkÛ=qnǽۋ¾×p)À–#Ó…â8¢Œ²)Û×Ü—C…ξ/Š4åz„Si‘d$Á>ŠË`^ágm¸¤j&m4Iœž$ȯÔþàN¯IœŒÅÅEg¹sáÇ‘68àú¯*î©«zöÝØÙÿ±"Eq<ç%*MVb/hÐ\01ëeˆ×"˦ §|î¯_7E ¼³sÌ(Gˆ»Òwµ4ÛOª߬+jŸq†?x,psÈçkrô1Ô‰µ&[! ôëE9[Òé÷››ßnþ‰)4endstream endobj 276 0 obj<>/XObject<<>>>>>>endobj 277 0 obj<>stream xíXKoã6¾ûWÌÑ"EòC¶÷ Û.°— ì|a$ÚæB&½Ç¿ïÌ´%Gr°M ôPä!["çùÍ7Cý¤àO ³Œ3Èwƒß–ƒ6póei Ë5¤“,'#Èæ3X¸x™íVXØ ›oÁn%ì…µ²ÒñÕòÇ`Og³l"£d Q:ŽG¸iø¹uý§ØIPzmð_m ¹‡¥H»5ˆj¢" ÃOp/í¡Ò5Ú¥Ö¤nG’qßa'µÞ‰ßø †·±¢}erX I§Ð¹ô WWn‡Sï6mE ¼a¬r'Ót–µyåA^ƒA»ª'UKHbøºeA>«ÚÖ’à/UCmM% ´Èé ¾rÌn¾¤!ÚQ:‰GóŒ²xB‘[G3ÞÓL ¯‰Æ‹8ë ïZ•˜öëNÊU‰&Rx*¹ÁO’lrkë¾)»í÷;ÚDUÀÎj­d¢,9Àn;?ÄøU”c+7•°(z5tî¶@:Òx:šÎçíÐR’œ8pÚjö`uõ!a2?ÚlXÑÙ.ïÖÚT _i]rB·*€“^XPŸ¹¡.f5¤þµ¹¦z¢ ÜFˆ.¥•UF³º[¸õ%xûÚº“Åi2žŽÚÁHà ;ѲBÜi ¹Ðø‡ ¶[Ä®¯Q‰ðÀ¼?áÅìåº4{²N”TØ\ 5VŒÛËõÁvz£ùóñ);÷orT£Nà|ÛJÝ#—jo/s—£Ë^Çä¥ôÆeõè=á—tu*©˜•d…ÒRwʆ÷„}§¢?Ôˆ k6Èq>pH0„4¬@ZÛÃi¸U[„e[V×lðII“ÜŽ‹8+\’ëRlj”@ò Æ£ÃhÓ 0 ‰S¢¤3TÆ›é(>h9Iê$ßrÁ(4³"äÄ÷}E°Å“$ÁÞò»¥É´—Þ”zb7VŠîá%´íÕì-Íýmk§ž1€ÊíH°^]‡dw‚Š ÌÅ‹º#¨U-ü -³f´¨³^9¢« «•6Ïâl´/Ú¥~D»3ŸÕIGÖÜÃ^k/ ®Ã¬•´"ZÄét:šµu4LñDAíf}(±â~Dé Á.µÌ r··/×Ôëµ!m×®ÅöAk:Šçof7ËâÄãïó비#„ýñ6ÊKS*y‘\C¶9,ùõ±Fï´5ð´U<3aø"Ò«zFš@X=*›–ĽøëK°QÌr¤jŠ®Î¹  Áœ»>‡øá)ÅÁ7¾M*Ž yÍžtö QÖ†©È»Ä½þ”G"Žà6Š,IVºP•Ì-¢€ý$ù=drîÿÿåðÎrø¦ÕFïM]<Œ4B1n>ù"®[EÐY»($B)<±¸™€HÑÏA`Çü¾yi/*´gÜ|‡CSÏ„$šÖw3tC®ÑÚ6¥ºYßa}5Ä`&󇜄iFߥ`£Î༠säÈα¥m‰Ÿ\,j³-Ãñáâ4(µƒY0£áürØ8»ñS$YC…&Ø0ÏM•´³ÏÀ_J—þ“Ú{¶ÜS~ÎÍëÎÐIÆ¿g©Éë~Œú“ek: *`DÂ%—¥†Ë`d¦÷€oÑ; Øý[RÛGú3Á^TŸ÷áÄrHmgyúçýöCÚíçr>/XObject<<>>>>/Annots 122 0 R>>endobj 279 0 obj<>stream x­WMoÛF½ûWÌ¡0×ü’(ùb4q\äÒ´‰Ðh{ É¥Ä„â*»dõ×÷Í.)R2Aáƒ,q9oÞ¼™ý|¿€’¢e»+Ÿ~¾ ¾ˆ)ðCÐŽ‚U$æÝ·Š>\½ZãІn–´.(ˆ"òCZ,Zç0·Îfr·o×TT+Ú¥M¶%ùµ4?®?â}/ˆDˆÓ³×UjÌ/éNRYŠö©ÆÿÔ|lvKïeÓêÚ ¿S+ÖÈÍCÐGà±—+vÏþŽÂ„ˆØÀ8F{à’[Ó>fÝyY¥L«åÝíÓÔwg¡¤6R¥UÅÏ"áσd!=>äÕ[”†O6[IÖ ·… mÖ;²Ö©4dö2+‹Ræ×ö¸–¦­ÊTݤ%H Ÿ Ä<œ/—§¾ždUÙwž;~éЛ+W€©VÇliäJ–OÛôжªô¹M+‹Õ–6/ó$YħÀô¡\“ÒômJN°i±¾ïƒâ/p*Y‰°;wÆfÓî¥~N¬ágÎàŒ_Œþ$H'¼è0 ´ßK1öä-DàGóð·sîшc}Nƒß!!i¸ìsx‰zÝG “í¢åq/ÓpFß œÅe²/sñÈþ ”cÛ£ÞiâGÄš5oˆÕÙ;inµ3V»WrYAN­= èNå¼»œveÙ4èø6˜ü9†”@Ќ؆Ï%®•±n'/ÙVB\9+ë©i1'ËÔ^|fvhMÌK=ƒ ¡53âfB«k·žc¬±äB¹ŽŒÄmCÁ{§Ì|­d½`Ø-WvÚlKç½Ä‘æýãHµi1¿Ý¡ßÜ#{7=>ÿîf0vææ–Ü#w›á[%DxƒK.ÛîÙ…ŒG[ÕIƸ»»‹y°q<§EŒÛQ`‘qáѽÊìfÛœ<ÄMŽn©Òzó^â«j2[bܬ ALü•[$\?ÙÆŽ— Œ[/—ã›õÕoWÿòéñœendstream endobj 280 0 obj<>/XObject<<>>>>>>endobj 281 0 obj<>stream x­WÛnãF }ÏWðÅ€DŠ%ß³éö²ÀE³Ý5Ð>øe,ìÙ•gTÍ(N°è¿—œ‹,ËqŠ E€À–Gä!yxÈùë*þ%0Oa<ƒlõãêj[¸ý°„$UÿGñx”Âl1‡UއWÙpÛ°:¿^}½ºý°ðdžw ¹U@¦d.ŒPRƒQÀŸxÖfÇ¡¥á5½ÍGq:Ï!J“xœÌÈôðg®³ZTôêrgfä2¾Ïóže ˜· 5ß mjF¯C¥„41¬Z§ 4(Y><ù yÇ£i2Ÿñh4…(Ç)y…kÍk`5b¯Ã†P„æpà ¶RÑ/­ƒ> t^ÛŠG.­Ÿ$ž¦ÓÅâÔZaå=뀩kíb’>sÓÔÝüÌ]~ø¾2Ï€ rK/ Í'¶€Q2ÅÄÆ(µ)T}8/#ì¹Ù©ü7¶çp¯l1ô=Üg¬,9ǬÞê{r0ÁÜ-ÆcˆÆ£xâ;¯·ÍžK£mýŽBµm%΃$yE yh¼öhúųt9^b:g'jñžŽÔæ«ÎTÅo rþ«šâÉ' Ÿæ¼`Mi€ hüÎY]>oRYnm GG†D¼Þ(ÍOaá™CÆÎ ƒœ‚$îØ´±÷{&ñi ”gæÔòüR¼m1NúŸº*•7tšgÒgÛH˜{æ³Oå°h²†ÉŒc+økV2­a=Ôb/J†G0 t¨ªU¶¾¦÷B's¾°˜SºU4dÉ…– BGYeeHÉ (j;Ÿ–õu ì¸$4/[n)C ï²{c±³Ì4¬Ävö¹ òQeN4°Õ{FYUq™c¹04*—®x& Z;Ø÷2€Ñ·Ï!ãµaBö,êf£0ÓÇ ß0쇪d·Mƒ*Ü*Ñ€òˆºÞA¿›gËЀþåFIBKEÉ$NK§ëq:t¤‹=€'Ž>5/‹®Ï¾Ë.A{ŽþÝS×QÒ÷RˆZ›6ƒ!ÄcòžÏ7÷}ðç‡/ðÈʆÿ}âþ´ºö2Ù1ÇSJœ/„a'£ñ4=Us;t´{€>nà€´åôÙ!aƒbS‰<¢ÄÕ ùY‡ŸqPñ-1¼ß+È<ò6ŒáSxÏŸÕžˆÏŸ³Šþ‹Zíí“ v° ù#Ô};ìDÉÏ!8z_²Šxâ %/ã•ËÃÂOÓxA‡¾°I²¥•?Á¯¿¬°¶ |SÁ6ÍÐìθpì?Š ˜&>/XObject<<>>>>/Annots 128 0 R>>endobj 283 0 obj<>stream x­WÉnãF½ë+ A`¶ÙÜDúbxL2£C€$‡6Ù’:ᢰ[éïSUÉ´g²À«ÙÍÚÞ«×Å¿|ü“° L ¯>|¿S‘A"† –rX”ðiÊX¤©¸Fé°¢Ý Šñ¥0ˆD‚»AãÿnE»oVh~7)H «5È(¡@’.aU` «üêv­©¸­»´Î¸½ÓäMU©º×€u…n[xÔë¦Õ :ß;So¾[ý±ðdè ?ÉÀ Ce’ì^}Òhó -5­Q%/߆B;eJ4¯ªÚ•ÚŠnï£vû¶¾íºÚ¹#ý¼yÈN‘{2A†à™ˆèú15F[?©¶;ÛgyüШÚýh¬£ÍHøqJoc´QœFôö}»ÙWºv–½Ž®–¾¢pIÕ!h~ji,&VîMS¡Yþ,'I¥ÌKe-¹öz{^ E(®Ð;móÖìœiºœû3ìóÓNçf}|Ѫ€ÕV[ Á0õV·†ðz<|ûŲҙ‰Š$Ä"Èe¢=?ÄM”`µ·¶MYpäª,ñ%ëT“{\bº¥@-;TPbM)é¦-L­Ú#’¨D¶Ô…áS èlÒŒÏòe¸‘dHCæÔ̓ì¡ôRlŠ8€ÑÏð)ü[€%æ×ˆY*ÊÉñt›u•9˜ú’wªÝØ»J0¡¾Š£‰3.PÙØ%XÆÏäŠêñï(ðúk o)\2œ¶ÐÔzÇÚk0®÷¤š–!K­ûˆM­€÷O‘ö8ª@iš3|À·¶êÚÔ$Äd3!m•…Š$a Ѝ¿6-1ƒ=UãÃçäs–‚*§B ø©±Ö<–žT¹§œÐ2çŽþ͆+yuÝ=Ùhnë~©Š¢+* ÿ(t©{Ä#X¨ª)ÌÚtq@¾o[ì{:(EÄiz^,É`±b© hœ³í4Ì^C¾ÕùŸ,œìôLíþy˜ç˜wѲ6öa b ÖµýlP &šù¬{¤ D’q»¿Ö=¨¬ÙÐ=;Õª kØæ×vÂu¨q‡2¾PÕ¯o¡ÞÀÄè-¢ŽBKðw´ÝµÍ“)ŸÛޱÜ4aÐnÛpX³BóªºÞ’ûÜ^×Ñ ¥êAÇ8âvÏè‚‹@*k¸?g‰Ô…I»·˜Y?]{¤ÖdŽy3”šW§ä°e»òt;åýE¸I…R6UÞRŸÂ[2â_ìpFƒD³Çr Þ¤ïÏìîöίxâð;íŽÐÍBð´^†™ð¿ÌÖG™‘­m“ŸGuÅÁ]ÝÔÞ®± éÝ7¤TéÚ¾Ûµú¾¿ÛîpÙX7®ÉØÿKïþZ=á;4Ñx‰!;.r¸Èóž#T §\ùÆe¯ÊLÐÑ÷’ªÍ3ã—a¿`7‰˜ üEKã¡aÈ{)²s¬žY € ÐÏ*n«Pö‡áæ4»RÏ¡°ä§!V_”欋'ùÌcä?Î_€Z“pÍúŸm W5¬Ÿ§ZÕ‹MÍN,J4ŽTG”S¼ÅhBë•Ërº¹ÛKÎLñÅðáħò8þ*u¤ibcžtÍòõ¹¼wŸ‘'Ï–?®QÊ ¬‰uQàÐ\£uj9o‚¦ÓÝxØšãón²a({ÿ<™^XžÚ¡‘dˆ^›SgFM™-ñ|>jFÃ7~€ öFËH,—¬@¿| {ð®Éù‹‚?ð<7E“ß”ªÞ|Ôkqh\ΟBžŒ¤1ê÷ÒÏh\ýgG¢%Ó1Z&Ý·‡d~¿Zü¼ø~h($endstream endobj 284 0 obj<>/XObject<<>>>>>>endobj 285 0 obj<>stream xWÛnÛF}÷W Ò×âE¢¤£ulÔ@Ѧ©P÷Á@°"W"Š«pW–UÃÿޙݥHÚtâ4FƒÜË™3g†_ÏãOIÑÒíÙ/˳1làüzAË5$1‹Æ!Lg ,3<»L½Û\TPTJïj™B¡ åe)28:^Øîôx½ÙoE¥¡,”ÆÇYûj%³ãt.Þ/¿œùO‚d*üñü b!:òÔN¤Åº@«]G™(…3÷’1 ã(? XL)>ï“ÐûºZÐûæ5†œy6$¥ë¢ÚÐËóë¹ËÏw úAÂÂÉ,¦Ó•8ØC \øi^”™\ƒ\}¹€ ÌN]С£ŸEøÑ˜ÅîþÏ.uei}õBzÕb‹½· ì¸Rˆ„–Ö‚k [c¬›þ¡ÒºØéB`p)«{Q¢Jl…ÎeÇ"ՆﵬøaŠ"Õ ®Ø†¹Ò†lΣ9kÚ ðϯËåG@à \ÈÂÙlö‹k³P°XªWAú&iÿ2:plMbm§[® bÈÑQ$ƒµ¬Að47zÁ‘ã >6i+Œ£’¶oÕ†4†îÀ=¯ ¾*…‚C^ 1^ à÷¼(é!HÔ6r‘–Ø'GFÛtÎ5äüS¢ƒ^6BcqΕù¯iA#šÈ±¢y¨€èЋœ"8±}"5OðH§,G“gÖT‚È‹ÈláqÀ.¤Î]õ„ÿîwØò#TnQÃJ´¶M$ Õg5LÍõ‰sÕàþ;&C×ù¾Ôór/Ð1¶'ož!ÜøZoS 4QOrÃÏá™pʻ۬ٞ4ÝÒi4“VÇEtª¬m·HÊôP(ªfy$;ýLp V‰†œS‡;flãÉ$2â;ìî=ƒ¥nÛƒvsÔ2¥)ª=‰OÏ6"¦)&ä=º­Í|3G^¥Ù)¬kŒªÄ]dpKãZVèÒ+«‰§ëF/…Ʊcx° ÎÇY_É)Ôæº­¦UæÁÃW|»+Å['Ê¥é²K^ƒßÆôø˜IY+ˆŸ •¥¬ŸžUF]Á"¯ŽàÛÃ!øæ0lj« ]iu뇄ûåñBµÃ(`ñwU;Œg,é«¶Q•~lž•zø¿%{Èì¢Ã]+fÍDãÛ Méuƒ±hZà…›FÉäòоEr“ÌiY‹Œ’Ôâÿ–•Æ¿f/D1­h ^¢x9¡5Âm7ïÜ£wF/ÌŽŠ—€L“#?f“$™Æ}V·t³+mcÛ1n˜`#[©f/\E YL—;Ú@NÔxkxÞ’¶s›§\ÖÚ*=jp?´ÎYòrùÃùGlºïG6Ä5ŽSz^ÿbíZ€ WP<,»ÂÑEEÃÈ~WŒ@àÚÏÉtÓbx óý.Ãù¶ÈPEѤ•ŒÊAÆ¿¶¸½¥ÿÜËú?vtÏYŒÛs<°©•€þX¦%øðA¦æ“ —œd¾ì<“éyÉ«Í'±ffY&pç pçà <Ïiw»qcfÉŠ“)}§e^Ðá«åÙŸgÿçù?endstream endobj 286 0 obj<>/XObject<<>>>>>>endobj 287 0 obj<>stream xµW]oÛF|÷¯XøIAMJ¤DQr‚4n€MÓ:*ÐÁ™x«WÝF6¦½vï†øù(N'ãœÃ—„yùÚ†6Šî%…äåi„Ei“)—9è«8ªïš„¾¯ŒzO¾Ž…ôÇ!nd[èjk*ÕØbÃ[âiÖªl©u-K궪 …á<©% ü¾ÿ" Ó­‡‹ªðÂíÖ²ÁÎŽÊ“qœúÎñư¨EÛÚÓæòŠî;C‚Z±‘Qƒ_¥íOÊǪ5-‰ÇË}L—£Ky’¢QÆW}(Âã„Fï«fEO&àäªRšªBÒƒÔ­ˆéç†ÌZ¶– G¢•íÕ„DpTWW£ø‡JP)[£ÕþǤ˜kIÕ£ú·R/•Þ<í¢5¢)…8PÕT¦âè‚ïëŠð2,EWÿbÏÄQ(¹V¢”å0ÚéÊÙ ~‡†ÁØ$ŸÊh”õw"€Øá6öÊ‚M·ÅVÅšÖ(£–@§0¨qÿx'àZvšAm䣉ù6ΦY¬…AѶjI{Õ 0J<±pÓVËh+´9ÎÒšªFª1¢jÀBÕvH’8K³Ùì´- hP, zãÒð†¥÷g)mk=;·ÒtúÌTðü3=¹Éáû$C4Kã,K)™MãÙhÎD¿K1§Dî`Yœ÷tápSÜv¸GK;w08.þÖóƒ'B3æß$46tˆr"ojÄæ1¶G¤´³X¼(Ÿ¶²¨–{²D>Ðaœ0«}“—T€O+ЉÉ*èŸËXZî|År´çéeX'í ܈yk{ƒ.QÑi I¦Qwàìҽܧµ±œXðdzlòÜqj¸« Ž,XAc¿ŸI˜€3-0?Y¿Z k–º>¾¶Ý»lï^]‘Ù]ÕJ’›­Ùs°3ŒœÏãÉ<±Žñ#“d糪k¾6jgUûˆ.Ï{Þ·Sñÿ6¬OA0} &[Õn˜ÀõðAõNìÙ ªÕJjàlíêÏ‹¢f$Ï e©À\¾Æ‚éHW<²ÄOÝv«Z6,{¬¯Ò]nx‹9Ä©Îj%‡w^–›+²•Q­Ô×^lÇÇg¿ôý^ÒÝÀI6Ú[ª®uX-}6É;k­‡ß½Bñ%ÉGYt]Vp•Š8ØÏõ(bŽ\U\è ƒëü¸_À^÷Cƒàr»eãP g’èKÙÖp+kó:xÁJ6R³÷ÀrýVUø,§é|<‡ðO{?ƒì’ííW@G>}ÿ‡sDŒÎúà 7§öÊ•u­Ô¸b/i»{;œ@.Hê÷KÂó ö*À F ÷9ŽöÓûP–ÆéÜ.\O§~cd—äœ(™Mâ<±~õ›V…½Ä~%ƦÌëb>µ>öpJÓ;UðÃÿlR!À‘à\[—=`é×5w•Öñ¿ß©¼ðVk·;´Nô%ö&Ïe-—˜Ô¦ÀEú}ð"ä”™›?ÚÃýï%æÅmŠ˜½ºV;¦µ|›m-¯Ò»q{GQo¼öñ—{Q| Ty-ŒG­`ôü*J¢3*âEÒÎæaEˆé­Ý¥ «)G ²e¼VXËpS\×ù&À^U?HºVKÞÆÚ®(¤,±:%Ù…¯j:ùº·8lq I­±V¸ugy>œ.|N'Œ,íè˜á,Îæ 4#sçswã´_Ï&^M’n9É(›Ìã16dø¡«+¢UØëìöMQDñ°TŰÆ6s+—ñ£2Þ8’I'&'w{àa®&ùÔý󗤌ÐO‹‹ß/þtcæendstream endobj 288 0 obj<>/XObject<<>>>>/Annots 175 0 R>>endobj 289 0 obj<>stream xXM“Ü6½Ï¯à±SeiDRŸ¾¤¼ùØÝË&kOÕæà‹¬fO+QKIÝžù÷yE‰œö8É–«ÚAÀHÍïwR$ø'E¡„ÎEsºKÄ#r]ĹÊDZB‰Ñˆÿ¼+«¸Y–ÇZœ„TUœ,oøp'uËMZȸô¥EáéªDº*©<]••¡4O}i¥VKäWUŽ“Ð* tµN<]—qá¡ÒEº¢<‰T%nªrO7Í‹õüòÞTcí$”Ž•ÈøÅBB†ìëIäYœz2ä%[e•$8«^UšÅ¦TŹ ¥Vä‘*dß—*v'Eœ%”sΩ–\›Õ²–\'B”Fåœ-äH¦+þ5 Œå@~!QQR™T’ð­B© J™“¦)E³I³m7˜f«¶ImÕ]•l–8V©)áN &;?,E”*U—7¿ªTž®ÖœãÕ¯N9Ç‹e]Tqîéê2£¼-Ò”ðãM±î’ƒ,fœñÕ2sIæÐƒy#¿à4#„‹¬H(M« •E&ÑS¾PJߪ?œ2+SŽtÑU6g«a%+ª²“¦¡[•ú~u")g«®F=6Ý4Iišä¾¬@uV]FŒ82äÁ6 ¿`ÄŠl/²%ÖU¸Äꤚ9ºIßÓEß&-´'UIHø¾é*d U\uUZþÅ/±Ç·¬ÊÒÓÕȱ³DýãáîþÇRH)øMb(‘cà>ì1šÝñÄÉÌÇa/ðÔÔ]göbèÅ©}jûû¶Ÿf~{shûvn!¢MÓlŸŸÏ†þço¾yøõ.ÂàÁd-M”d"O»¦«'(L—³ùYÔý^œë±†çe‰µA=•êBD(™–9Áܽ7óeìߒ܉|¿3§óü,¦ylûGÞÿX Ic‘F.Ô(—qž”XÜï¾#lg'~úô«iæUÓ“À-”­{­Øeo÷V°…%åÏãÐL÷ÿFÆÎôÄž¶äãX+³Š’¾ßÕŸ»¶þwoYÜÕç³é÷üèVƱ~.óÐ#eþZs4ÍoÁE.˜º¿œƒ¥¡?´—1´4ôszÛô-˜·:çÐÞ Ž!X2׺ó]™'Ð$Àcž8öï†w#—ÏåáÐv „o®<^ê1H]žL=6Ç`û0~^·’uu%z4óOíü/Я 뉙é[jû&Òö‡!”Oóµ~±ååÂÌN`}}ëͶQà`VžºüØ®³»è׋®»åw¦oò4\ƒª÷uµ¿ckËSo"u°H~“ýÑü~iGóÐt:×Màk2‹£¸±þJU¦ :ÅwJÔ l^úÕªí£Ë¹3Wpðr~Q”ëÐÕsÛ†®Ÿë%19Ä/+µ®v)ž¨m¿7S3¶gš·ãˆ)U‡n?‰ùhÄy4NÌT;d'Q_ë¶«?u¸ï£À(¿üôÐt–zŠÅ;,Aybx^yW¸*×Ý4x–h(Sß›‰Áó(LqÓ(Ä=††~„›]ª dQ)oæˆË9 Þ"¯^©mŒí8üK@TiQˆùZâÐâ—“ég71¨Ùa0Ï)<²k1yS—Î "Ÿ@º 7Ðô Qé ŽEïŽ ›-Bwcf¨Âá%’0¯ÙõBõ²ò–R`c$3‘‹Ì?ȾJŸgÓ´‡gŒ/a1M¸º÷–"âs;7 ̦CÎñ=‘èL…G°M‡˜ØMk@Ã^´=&í ÅÇñÈç, Ì8#öƒhgº´ýuø Þ£³›¹{f’E¸{f²ÈC?.Ÿ¢…ŠT/ž?“8ÖW#æA`øŒc»7°km|)O¯ø„ÊI:zD¸ýd•tÓÄ· ñö£V…< 6–à‚¥Ê AVÅÚvó6,½: L Çh>µ¾4þC¯ƒ‹;„#ä-M»ÁuDôÚ1«Ç9ÊíÏßgß;¾|ð0B_ÐäÂ1~á¾¶¤&´Ü\Ƽˆ±×…á÷jüo$ˆ£35QR6ö¸‡v¢N'º~ÜMƈýаcŒiÌ6øÁÊ”7wa[ rÇìqƶÝôñŸháˆx•h77Ë[¾á¦X&åŸóM㯠ö[»ëœWB1œgt2îyâ[ é[Šñÿ¦ŒÝÐ͇y|Aµàªî]¸¿”¸F(©^¡™×»ÅãÅË”¨žT0ÕM†ñÁ”T’¿‚ŽN×™*NS| á/3£‘ø>àN‰øtºïêþñ½9ÄOÃl¹ÉTÆ2'Š„O<{¿ë}¤EnoìRSÔ?<Üý÷îÚ.Þ+endstream endobj 290 0 obj<>/XObject<<>>>>>>endobj 291 0 obj<>stream x­WÙnÛF}÷W\ -Äæˆ«÷ÁH³yiÚ@}ð˘IL¸¨Ã¡#í¿÷ÜRm9H‚ʰhs¹ë9ç^þ}R€Ÿ–Šʪ‹ß6íhþvEaH›-%ÒUL‹Õ’69nÞdÞkÕfº8˜¢©¯^l>^,%ñ’/æÞf_´T)³or:(½mtÕRS+j¶Ôª;¥eI .H~œ¯Ù+º“º·¥¢]q§jº}`»ùa,"¶*µ–¿ËJ zg$Ýky€2µÐâ"ÕøÊbIYSU²ÎéÆk•bc~ŒDÂåBùA:ÚÍ›¬«Tml4âé³÷…ÙOmÒ¡\Y”íÍ aíºìäG¡ˆÃ—Éû L§Ï'GvºU¤UÛ•¦åçço×}©ýe"â BpK¥«ÄæÝ™†“rwMñèšOxÿ¸ƒM›O$¶W1ùq ’ÞÂK½³¶¶U£·IÓNͽ÷®è½í2ZV5y±-¼5‰hµZEÓZÎü¢n¬35£J~R­­ì3 \Ò†lM%µ•,K*•1J»2†"EÒ«Ç&Q)ef\0e,ê\}æöÖ˜š¿‹h¯akÚ–3•¼¢[‰†ðn?cqˆ˜+êe:íîWñ?0x¢xOísA_þý•ÿµÕ“ßû‰xX±ßs!©>¡Æ=7¸<™Îlup„æ==ã‚ñ?ÚEhWïòô"ÆR{â©©™V yÂms¾môØÞ#©Î‰üs„UÕÁ<ôŠå¼>!g¯E°¶{ËWɦ §Ì³¬D5œµ!( ¯†ó?LÎS#v^ã Y¿vøÿ {µ—õ®òÖŽeÏ-ùÆ[?ñ0£99ï4Oдs›"_=Á“¶ë“ãeÖiA† jÈ.¬¥cÁ¼Kºßcc,ìÜã ñ’Ñthø°ûœnjËoÚÔŠÞÑ$dfiÝ`^TÆÛP޽Ärdž­ƒèûû„E‰kèx¬"Z‡vOü:<‚X¤=<”¬»ƒ³7äùµ¶{? ÑÄ/õma´ÔXV†Ò ›ó¾••Çp¾6Ü&‡­h »v0Äè‡mœ/êÂX9±0 ,r‹5q’tA¯l«¹$ÏlöïhÝÃx`„c-iñra¿G™õw¨™µõ?KÁôº©·Å®ÓOWþc·çoGLõƒÞ¾zMДôò†k‘$)-˜N”þzÏo9>½ž¼üø>‰9Þ‡æ%xýAmÅçÆô[X˜„˜{Ø¥—nåx‡]•«i%+Yö“7L¸‚o6^ü¨endstream endobj 292 0 obj<>/XObject<<>>>>/Annots 177 0 R>>endobj 293 0 obj<>stream xWKoÛF¾ëW |‰˜_zb¤I\ôR§‰êÖÔRÚ˜âªË•%ÕÈïÌìR¤dÅE#°(îÎóû¾ÿÕ‹!ŸÆ ¤#È×½~îÅÃQ˜@6‰Â ¬!žŒÂ±*ákï§9ZÂàvq ó²(Œ†“F“1Ìhnž÷ß›åv-+[ÏÞοõ·Sv…I–ŽéТ#̲¾qcý¼ ÞÀZÚ•^@.ʲ¦As1Hâ0Gä©ÿQÖ¹Q«tÅnš3lü]»’l﾿õêþ­7\‡ðK(CO¢Ü +kÀP\À *ïßJs°+U-)„³ŒÇ#DCâ+„!ÔV‹`§ìÊ{"•¶°OôFÀB-•ÅßµÌ5_ ƒ‘têà ṂRÕ–\E­YJª#l+«JN§’{ËžT ª²ÒlŒ´rѵwÌ&2×G·…Znä'P®¤q8L†“ÉiBTq4ö m$ûÃ˵5ÛÜj㬩Jq”}Xl eH_(Qª¿µ‚ hdn$?b¥+²C®/z,tYêÙ‘{±Þ”òšÝ> £ÄC)±j#f(``OJÀ1&LNë–‡\î!$a2™L’Ó<ÿÝ=|“¹ ùØCFvZ\ãp”LÓ)^µ ™#¢<:Ùí1~Â0+Œª‰–QA$ô _!DƒyPÖs kYµ– }š\:À t§ÿ%‡_µå* ¬lÑ`Éõz@`VÈ£ ®Â0;¨瘣.r£’KL÷I’­ià¾ß0£ýû·%húØ!?†ƒtx½èd'À$¬\W.f‚rÓM)r´U‹B–JA£¢F%ÃeWJQ#Ê(›N•ÿà3@TK‰"þDÀ(B*='W˜Ý:…K2Dv‘B|•DYkÏDb…£¡¿ä±«k_¤Ýš ’æëˆ5"HÕj³Áœ e0£~Q(­Þã,L£á;‘ì)E„ˆµBU\Ôí}¸ ®•ÜÝàGÍÜ O9ægÂLg¬õ)ifÞàûF;_û£uaGðïXÂ{¢QK-P?厞YD@øär]VGE .JJ½‘¹*ÇÝ á3âo! ±--a¬SüDŦ£w¤­Ý‰éÎØ9çE"ÎÛ5â v+•¯¸OÝàë•Þ–¤®>³E¤'>2²×Á…†/£(ÈÞ*;vñÝÀÚw°CJ9é>Kí„îºù"rÔè\¯TåŠuËWˆ½y<ðç–xVfXhœ¤¨rtìrgä9wÝô§baôú̇xR’çz¶×6/g³;†'}÷ïýòÈí@}†+ Jƒ^¯I‘Zœ­ yÝ€óh¶Šn_Ý<毣†ñ8ØÖ°ÖO%k𨮳(_4]q:{ +•µ%kD õI›[•3GVRxè4~V¤O0•ÀÁ±A½#'}¢|:6½^xX—\W¶cp?rÌD=\£^.TQHCÛHy®74ë(G®ÕE‰nÙxôDÓ¾Ë GhhOÖËG‚ƒ{ÆÃa2>çD£v“hZëôƒ-»2(ĸ–X,T)kÄ “A ¥Ök c¡öôi.íyY:mÇ? ʵŸé‚Ãe°«ŽË˜{õü¼‡8оÃóRüýý¬ò+_š~`)×¥6|Ÿ—Î,CBÂŒ„ ½l°¯|6ªzô¶ºJß‡ç³ hƒèˆ¡Éi ÁvR\¾¾ {¼)Cp€ä‚›ã1œD¯;/ÓY„xÙ¥¸Ä^Vÿ#ÆW#»ðòe<üM«$WK‚"’™´±ÕP¥!9”Z?Ö¸{;›™èeô-þéÍà6nÆn0™„Ãi Y< ÓdHpºO“1VÜÌüöãû,B2†“˜7šßïH=ø¨s^ ÝÈ J$ØY„¬Ôd,ˆ³)‹;ô8š’£_ðŠÑ9o ÙxäþŒ‡tøÓ¼÷[ï?ZLêendstream endobj 294 0 obj<>/XObject<<>>>>>>endobj 295 0 obj<>stream x¥VÛnÛF}÷W übW¼SÒ‹á:1P ¨›Tâ<¬–+‹1Åew—¾´è¿gfIš’%¹mŒÀILî\öœ3gøçI>þ !JAlN~Zœøp“kA‹þí³È!f°ÈñðBŒ`>×>þóùSp¾ø†A^±¼z}ûÆ›7³†øÖÅN®§]“^æ³0Ž2ð€EAJ­Ž>KÛèjNõûר}>ªšÍRjP+°k 澨k™ÃªÐÆ×wÍFVÖPÔäzö’?v xAÆÂdS¡êçöTßÅ*ùø+ßHz3?™Fx‘Ïâ.ä²ÏîšÒï¶7ä.8šC.-*n UQïTT-µ{B‚ðA¡‹š¢ö‘øMê•Òà˜\Ö]ʵü&…ˆ’·£Ç®—%E¸šc(‹{ îÈØ5³$ËÒXz~2È¡æ!±RãÒýË»=«à´ì”½À1妶Ï`¬.ª; ž\=ÞtÊ’YÓ”…3|ŠdÝFa†ªmö¬1 §3ìÔX’Ð1ÂX«=Z/Pæ‚‚_±QÐbuH±Cê¥^Vsý<(j„‰ð>]K°J…è0Ç)Íj>úÝò*ç:ßJÄàŠW°” ¤.ÏIþJƒhŒU›â/üµ¯Jb«µÒGQ„ª²t—áKa^îÄrUIX>£bŒípepÚýïcâ¢EM¡Jšn&zßÉX΢VJ-!…pã”éÒRgmYå4ð7´ëEòeCm¬T«Õ¯Û-Á#ËÕ×aÿг¬ƒÓõqa¦3g˜o‹3ŽXàÄ)x¹ÛÓˆTã¬ê‡uÙ'.ŠV#6¹!ýõÞý°ê²Vu±W×ñìlý ·m. kn¥R*Ǹ.ø²”Q÷…F*Ý,nÊi±ÀcÀ î"Öjó`—ÇÒÒ4¥uFJ—¥›Ê¼E÷ˆ¸ò6U/>"Ÿp¨…½RÕª¸k´D‹Øc®„ }.Dck:ñ>ƒÙÓÆ0§[fðK«­_LÃÚAX·Ö%uóªÉ¹ êYým^¼Š4‚6ÒÝmãvdÖª)sôe®-¸­qæÝž·‰{ãÝ-ü %¸èz| Rü1–žÁJ« 45ªÆ î8F3XqâEåS̓šxS¹Wk)îý'£E¯$ôŒ¤=fñŽý¥\Õ1©¼“\ŽW×a’+Ð/ûÌ£«¼‡ÏIÿêÌà8”4 nÜòÆÝûµg,ŽHC”?#xÿ¸!‹óàƒNŒíçŸç›äJLJ^Ý}–+ö¤¬p»Á â׮̬Mð3ê’Öd»%²î£ H ˜‹“O'ßFŒ_(endstream endobj 296 0 obj<>/XObject<<>>>>/Annots 180 0 R>>endobj 297 0 obj<>stream x¥WKÛ6¾ûWÌ¡AÀ⊖mÙ{Ù¦H¶È%Iía/´DÛJdÑ¡¨} éï̲d¯7-=œç73¿ $ÄøOB:†dÙnÃï9‹Å¦³‰Ãä"ÓðW ¿-Qh×s–k˜Ä"žÎ˜ÍSXæ¨n™ ?hרêòÅòÓ Åx’¤tž%k¸U¶P«Rƒ¾/jWð'<­Œ#ñ‹ëEÐ¥‘Äcˆd*ÆÓù„ÒiëåZûC¸RvS_Ñé„]I J0„pç¥Ý4;]¹šÝéô9Ö©è^‚·õ^gźȔ+LEv¢ör4–"‘3Š|øJ×™-ö$ó8ò7k ‹Ã_ÈWþ‚¢SiÀöo…k-锘0ëàD ÎÀJC­€×·Ú>„ØŸDÌå$ÕQ<Å|%X8ôg×à}¼¡*øëÝ2+aoMvQTµ£¸+ܶ¨Àm5˜Õ'¡ñÌìµ€s®:تvÆj2wF:ïIѺ°ä3FR†Ð¹Ê(+Þ›º.¨ô·ªl(H«}Zžo8µÃ‘?ÙhÆÃpD¬«LgÇñ©<÷‰4Ö_Éu©;ˆJ0™;“cÕ‚ Yc-¢€òçŠjƒ¶k(ªœŠªsר„ƒ\;U”5›•bŠÈ››Í¶:ûÌQ±u×8ƒx.ùAÿŸÇSÈç›=\Xnл½{€ÖmDlƒù´wEíCtùâZ¶ÍÍçbº ÇS1_0 n’q ÀV:ðKlîùË8I„œv­µi”å¬öÚ àì­Úi8ü~Òi ©ø¡Nó2ïzëy×mBÜ+°zƒ= ­Î{XïÑ/O¯Nö‚¸¤Â“ÖÌ`Ñ ÜPú^gÓ\În¸œ­àùöžùÁö2ÏO4³C!>Ëö¦¨°‹—Ü14Ñü,(p$²?ùÓ¨GÀPG±zß@Î6ص︸Ӏ½DX&AoŸ»º2ýk›âVWOõ¨òN=Ô­O}m? sœAϵ³Ø}O¢6óxNXú6j“¹ˆýÐõáÕZÙl{(Øi·5y µÿŒØc5G˜ Åõ@À}23ß„ÏGöŸÐÒ”%|iTIƒ+°bL¿r„“0,½öÀaÖBgÐLÈ8™Ž'—ŸA(ØnÂï‚Ö¢…µ±;å.á9îÊÜ׬ÄÙL_,ùµ]g*fãE²@#³n!tÙzþóÓð$|J(NòvRôkÓTy þ² 1YH^ÓßF–œ‰ÔÏCcïÎÌÂ.<¸2¼ëë+¸ÊTYj´Ýÿé œÀùÒÀw džö‚oê—¥7þ>Ra±yù ò*÷V¯‹{ðÝŠ§¹^«¦tì.¡ñZ>¬hVž!=J!9Y™:Ì÷Ö-èû2öÈ*yNsš°ÉB4Xw;Uá© Lå8à#ömŠqÔ³-caö“>PØa'­jyS ‡m»Þ ëbW”ÊeSÜ77/¨jmå0i­ Š¥—<åƒÖp3tè)î,bn!÷ÁîÍ nµ§p§˜À^!Íg‰“OëˆSŒÌ §Í„"%õ©/ª[ãù.“4µßë*ÇÊ`DT™–Þ1WˆÎZ9äwOÕF…I;œC¦-r­ êfU»‰oå eœúŒó¦T™f&o“«}F ·y{}Z=Zƒ7ÞÙöè(Rà>ü 9-afGI?«u¹îÛ<5éàaybõ|ÇѰÖ<µâu›³ÇÕ9kó»&ûÁýýì×÷ï>zFþÏ‘ù£B{¤Ì6áÑ«„|8»pL…T§f¶hcwÈ]5}"*~›[d|*½A‚„ßHôç› o½“œâL ëÕ/’2æã˜fÀ˜‡xïç‹ëIxXJ‰Ë`2|•б—óï£^™Œßbž¦Eˆ‹ßL¥ª6ôZÜ—1ÑGÞ,‘7#,ÓxAtåMxUqÓMÒÀ eJ©y½ü1ø&’‚Üendstream endobj 298 0 obj<>/XObject<<>>>>/Annots 183 0 R>>endobj 299 0 obj<>stream x¥WËnÛFÝû+îÆ€ „´HJÔ#‹4mš"@Q§±€v¡ÍˆI“•3òEÿ½çÎp$Jv´Éá}žsîå_ ñ—Ð$¥,§¢¾Ò/Ù4žQ–åqN5M’ÃEE·?.pdC×ï§”$´XS2Êãl˜R>Т„±E1Myµø|1ˆé£6ʪ;Iª±r#[Cf' µ~$»•´sOuCëV×îÎJnTCzí.*eì+64¤(Éâö÷[UIjäFôÍ~Ã*â‰ÙN”Äãt<Êh8>šüûR´›¢RM)è×·‹ædÅÉ1¸4¨qÿì–pp_ËÆ†}2J–ı’0|ðY'f¿2VÙ½UH÷NT{ùŠî·²=ñ@ʸě}½’-; Í¡Dì¡WÕÜéµÐËðú}%£8Î(ÍãWn™¥"â÷ûÝsg¢l†fãÐååœÕlPål $û5Ãhõ7¬†¦]ºú-Š**t]‹sê®ÈjZI’²Ø[Y¾¦C±PØÕ#µÒì«ÿF”&ñ(=€çmYºUõHR½†¢áv­\«ï¶PQu\ý—?|¼¹=ëÄrÐhë@C¥¬T OÍÀ…$a]_Ãå~á²ó·7ð…ô+…|ØUªPöÌ|à 8us^…@0Ý>eîq÷º-}ÜGb.<¶³x8N&ù)!‚+$}ÄŸhÑ!®@‹<+¹F^šZµÙüMIf«÷z&É%¦qžg0ÀVÉ%Bt²™ª¤›7ÈÀ±œs J‡öEzõÙz×q¦pâ c§t±0ŽQBJ8÷NGÙ³ªÂ¢,¼ÈÝò¹Q#jT|9Ð „Èjƒú±¦Ý+»=+îe²¼â[ßžmõ¸‚@‡’ΩÒú íw®¿ë}ãcØi3N8¹ïx¬Bw‚Òœ"AÕ8Q «jÐÈä~/—Ü<+EÉŽUwgcZl•Sü^§´Ão ‚«S`דCbÌÿ©zWIž%§šó×h(. I[ÄË«×_)hð¡:Nã)‹vt'Û•6ŽGÏ4çÛžŽ1HÙÒÁ¡æžfaÄ!£ž²‹2¶ÐäD¾ë#˜=Œ‡ùŒ¢,‹G³„7ˆÁ­”^¬0,u«DÅ飄 Œÿ)¸|Ʀ}’vß6N/$ë}ôUšu;J”äqšeEé,ñøÙB*a\q@oÜÝ߀ô7le…œò«u„_üêÛn 0Îåõûàg2ŒÓQ6á%¨œÙ鹘;1¢9gÝ´Ps›S,ñË’Üæ4E«¾œßpÆy[à]^(€{/úÉÀN!ÁMÜT«^¯<ª» x/„î€ny©ñ× zvLøÐ·J¶¢-¶:Þ’'GÐ ÀôíÄ:Ðzoî1³Œ}ÜaL>>e\”®ÏÏ¥×ú“z$œÊÐÃà¸MÓx à΀‚mËÅ [Qèã4Ny?j&cn¥jŠÖ› ËÕãªeŒÐ~èˆü}péì¹™³%V¼ó›„ìôàqÈ ÞÜÂÉ(;Ë–ž-è‹(ûrõÃÌ›5 )8Ù ÛC¼÷[(ŒG:Àԥǰàõýžý÷dÓ[¹ΘÀm.T%ÄÏRvp0Þ™sK‡¨ v'oööÅ(“a6NOœ?Z±ÃrËÂÉp¹¼'³cÎ@ŠJ]¸•ßíØŒÕ³q2‰ót–ÍNð0<5ÝÓ/³¼úïxFÉ=>8„.{†'èN2hÖÐ ýKè'1cßÁ{­½­#¼!2öì3-üpè³ftø­†9åù4žæn<üyÃÕŠèÝI£ˆâkÔõºÍæ“\ÇÚNæñÍ’ÄÉ;ßd8ãÐ>`úºñÇñ&¹wŸLùòçÅÅïÿ)YU-endstream endobj 300 0 obj<>/XObject<<>>>>>>endobj 301 0 obj<>stream x¥XMoÛ8½çW öäcÉß¹»èèa·ØÂÀîÁF¢l²èRrœüû’’%KN›¢(‹çññÍÌ£¾ß„0Æ!,"˜Ì!Þßü±¾Ã†°Na*ƳådóåÖ N^Ç£ßÍö¸WEU>Ü®¿ÝÜ?­ÜÜÅXDÓÉ‚&%#i¶¥öK +R úPeºàÁÀ¿D¡˜„sŠ1ú¤ÊØd<‰ø9¼ìç¢2º<¨˜Ö‚~þ†?Jë‚Tç¹>eÅÖXð¬€ÞÈÒL%¼bŠY4[.U0žANDDqq¥¿å^YöªÚé„vØ¿ªêhŠ*Œƒ£–B@êõá`t Z aÑ«ÁBÌ£Õd…ÁæM0÷Bìbln…%+ôlKÍÀcÛDÈ @›Pš1‡Ds1½ØÁ³NÞ†wÀ£×ÁûMż‹^Ê,Aýà§« Ãqûüq.KI‡û‚ÎÈ!ç9õ£1¨J§ˆ^>‰-–Ñu<uKñ.Ë YUÊÄK\ž• ¹Ýµ••J¼@á”U;HyþÆ|öªâûQæ,S ]–¥|ä#‘ÂI–PèÊJî@£Í)+Q¼'T™çPƒ>á5˜4l%Ë‘a/«x‡è¹ ÞG(Ÿ±WßuN'+1¿Ðh¬÷{Y$eÍi‡RÞ‚Ÿ“¨4+ÐTÆåðf)½4nRëãdùHÕNV–‚÷àüór¹N€§©%*Ü“<æŒ+ Õx‘¦ÃBH: “ðeÇŠñD¯ª<*|òZiÊ]â¬ÀÁe%Áz‘ùQ k,àsJòR¯¨qVF'XëUÈJ(+mð¼²ÂóëóèºÂcA¯Ò,Ç”ìð&Á§£Æ&ñ/%a°=J“À^'”kHev .Uzk^VTjk8µ7#»3J¦uØ¥\[Á°BÚÐŒ0Ð&q`œôœŽÓá¥Ù‘ˆ–ËeÔnU›Ñi§s;„/M¼{ÛÜáCà’‚#ø‚±›\!ØGµ©C5¡wäQz: ²ë±­gÏo\X }¼*c´æcÀå!c[@ëšr­N»×•)Y0³Åb>m³ý¥Pì#bJµC¢]º*TUv}¬lQbß"ó:WKL";…Ç™·³ 5ËpºhÇóó­X:û⇨¦v"b½»àˆ3ÏÛÐEþÆó¸¢“3j¶L¯ö¶!Ô¿ë"(¦N¨GvF‹‚KLöJo±”9R°žÐQpC¤Ù½ùTã¹cœÍú¾®Õl ålÍ%Ú3Œi{-2;#ík7º>Š7Aó.æmvÑ 2R%¶‚{ 6j¬h sgËšxè0%vZÚŽm6òÁ|.Æd.ÐFU/î•Áb%"7±U4°úR)2ö¹õdôþû²ŽsxA’ß‹žèu4µ$’,6®4½;¦ãDÖtlýHEžº® ’_­mCxçÛ]bë«PGÜ"ˆØ³nK̨;ÍbÚtiÂB1êû13ªŽÇ½=wÒU”Çkµ——Tï ÙžUC8ž|I:l?ØYf‘X^Xº²0ÖæÐôÒ¢|‘Y.Ÿ±Ÿßnð˜XLè°èÃf4+|7m`9Nx(“x=ˆúñbkϳϔûFK„¸Ygº1JÆ;¦s‹È¼zC£QÄù1Aq“¥ÁšeåþŒ÷‰{P{Gºòmëì} îŠª·æ úaŸ½âºþò6€O9(4Gâ¶zz?M(|Ð;[wq6ºœLOú/~¼zOT Ç®¤^ÝþKEÝ´äÐÒøýSç’øžºmåéU7/‹Í“ ¶Lk~¬wZH®J°^ª]ü”ýq+¿ãrÈ2_4ýÙ[þ°MÔ×sÛc쮳W·ö¸¼æY‹îtTÒÚàX•DIÐì³rxÂKbŒ†Eʹ@÷(j,nKíÎê7Ð –h>Ýï\ìz~IŠÕoQœ¡ÒÈWLhß$Ï[%ûµ?To\è ín:Ö×÷Õ Ö—ÏP µ"›_Þñ ]t‰—o›¨0ÇMéÂ9Nb÷f½“·î4±×£Ø*ã׺ȉ_¸“¤A„h0µMdÓ¼}@rþ& £7#ÎúÞÏ ðY¸žKÿ#Šî ½iëùÂà±Hz¡ãxû4xê¿pcÀhèþ;múöM›¾•øíáá76c(G;gsKuÿìƒI/—̱³ì·ñž¬xýf±d‘®l?GYúë¹ÛÙ7ÅïTÊð7M*†0á¼÷ ½ˆGÜÆ‚Òh–ïRKÚù $ìy.‘LýÇÜ™ÇS4¶±ù»¬µ¢|Ò1ü”|× ÷‰ŽïsYl¿ªT¼ê*ÎY„á4á ?z.Æ+òUŸ}§ÑébnÝO¸¢Ÿ®oþ¹ùKqÊdendstream endobj 302 0 obj<>/XObject<<>>>>>>endobj 303 0 obj<>stream xÍWMoÛF½ûWÌ¡@À\“”DоI“ŠM…¢@ÕÆ\Y›P¤Ê]KV‚ü÷¾Ù%)S’Ý6È¡ðÁ¹œ÷fÞ ÿºˆ(Ä_DiLã„òõÅ‹ùEH·tõzFQDó%¥1cJf)Í œç£úÃÇ·r­HWËš6MºÙHkUSÝ<›¼]Ó{eïšÊ,ËöD¡–ºR-ë†ìJŒ¨Ü’^’{¥}ß]ÓN¾"1§³™ Â)ÑXÄaTÕ–ÌFåz©UqI5Œ5;mŽ¥æÄ­]IKkió•óÚºlþêuÔ%ÌD<ɲŒ:'‹8I‰\h(ph‹ NÄ„C9BåªPU®è&Еmtet~ó$4y)QHrt.çDDáxsÞ4½íº)TC˦^Ón¥Û´z ÐüÓÜmTãËWpÄt•(fÙèϪ`_cN£4¢é™ZŒ´Pâ’Š»M©si[ˆ`À §u½UÅâY@[¡ìQå ¾+c]9þÎÂÙñá-sªâ\©£ŠÑò™ˆù?êø‰j(Èb1i ~+›§´üP"Õßüç{‚p\öýÁë÷ìý ‰D–S ÆhêܼÊ]s¤!!Åè7YÞAá–(ÛÔ\äe[o¬®+®1I†åá¶å²ã¤6hµ6ˆR(ÍÌI ×*2b!Ñ6¢›m,„ØzÉ gã1¢ ÅWÅóæön­*k\€W¯;7ƒP·Ñ‘ékªXÛ]ðÆJ–³Q²3B#1n¡Dó Òë6mYz¥vÖ›œÚÀ¾ý.¼‡Ö_*“7ÚáwŠö ]À´êãìú¶1¶öM}×4@£UÄ!my½Q‚^ÝËõ¦T-Hy7öDgã F&}Ò˜%ªrS`bü…ûJ_ ÒÍ>M´Þ;½†1uå²<9f”íž/F?°AHçyYçŸÈ((\aþ>/XObject<<>>>>/Annots 186 0 R>>endobj 305 0 obj<>stream xÅWMoÛ8½ûW Š«-J¶låtÑfÑK·Ûõa¾Èí°Ñ׊tÿûÎ %ÅI“fE ’È™á¼7ïÑÿ$øOÂ4„(†¬ðÇ Œ‚ g"†Â$Ú=ð÷à÷9.ZÃèzRÂ|cLfQñl óÃÍ3›¶º¼˜L1Ø8šÒûÜ“P·ÐëÑuÒí÷§c!ør*ÂÉlLë´)õƒ®ÜÂ>‘WY‘ó%-Õ}ê3ûQ ÆÝÎízSªÊN¾ÏrTÆIœýY¼K¨0:Ô+H“­a©À*cUNIý>’Jɘí}T&kucu}æÐsÜ ÷7ÊÞ¨ð¤]  ¦á“R_tel÷°âuõò»Ê¬x2ëKº,ûîù³PL&!L#$ø«^„X=€ërÇ A? D4AP W‡[Ö‡óßôú—8ˆq‚±­®Ö؄Ԃ¹©7E¾a¸ë¥¶®ƒ;È** [FݬjûdãÞWêAKÕåðéNµ[øçÏyVôŸnRC@RRLÜ3åØ]I#…­ÍÒ&]êBÛ-Ñ,»QÙíð`¶Hºò?Æ‹0‘ÌÚgð—A„lqðÛmÃG8@ÈÍÆðG´íEs¸çn]åäQ|%†±Ó™ŸŒGǧat( ø,”¢âL¶¬^*½Ú?P-±ÀÖLÂc•ÞͶ£ØÄƺbQÑÖ€Ù4ªåeÊüÏØiÓ¨ŠeíÜ»´%hI§øÌ'ãýr|»@Ðí¿ëtYtìê(€Cií‹8(ðT¡Xäilögx½4àóCZÌÓ¨L¯4"ßK4ÎoÍŸ zØ_na×%„T5i›vú:‘Óø„!}Á ɧ3̸Ýo ·,ÒêÖ,.‰«]ì¼V¦úÍ:Í ^Ö*LD¾AQgÏæ»GFžé.-6¸qᥠ¯3¶É”,‹ìŽT+«Ë2­rØo&X<…g©¿Brçʦº ÚyÝ9ƒ|ʪTÙ ø9¹w4ydX2Bþ?3,9‘‚ì ¥çüÕxtîÖðr6_íBqÑYvGŒúdž5Ä6zï{Ê{$F¤=™= {z\sï*FÙÞ\m幋RW—ˆñN— ?ã½åj¥+ä=ëSð´ò²²n‹!ù\éƒS‘ûºè}š³˜g­ïkmŒÆÑGª3-SŒÌ)ñ‚§×ÿwèÞ¬óÜëÓœ / ­ûž£X¦(.Á)뜆˜­²MÛâušB¦McIóÏ¥«GçXÀ5FçãväØ3g7¶Fõ*øáõÄGká`»Yp泫Û!;„šæ^¼ŒöŽ®ÏŠ EœðÝâ9s‘°¹—õÝ#k¯Ôý›ý ÆÑ¬äxÖÕNt(=Ôh‡o˜š¯ªE *Qs¥ÄŒBZûÈYòÂcY#©×íàœC”Ñ[åh?Rñ¹Ô©¿þYe]é‚€bqAîð®;ì;_j‹?èÒÊeàôvôC±×eã<€Ü…f7«›-4ņùxËx,’)£tå¸ûÙ$ljãÇø³)Á+; Ÿ»{úðñHÜ}Äõ~„³þ¦Vâ¡¶ÓÖ—c)äe`$à3þiÚ:s®?í.S¡¤n|šþü"º eendstream endobj 306 0 obj<>/XObject<<>>>>>>endobj 307 0 obj<>stream xµVMoã6½ûWÌQ T´¾eç¤Ù ÐKƒn ´@Ó-ѶYÔ’Tbw±ÿ½3”I‰œ.Š6âÈçãÍ›7óeჇ¿>¤„ dÇÅ›…{XÞ­À÷a³ƒ4b¡@²Ja“ã»›ÌÑÍV‹/¨ äB%Ï k¡¸)dÅ>lnê± SpŸ…~BWÏÂ4ªº¢óþ­åŽ8Öæ h¦¨öt¸¼[w®Ýηë§,ˆW½]sÅ•óöí>P*<¡ï"æÅ«07ôXÔÝ»QûæˆkÀàcJo`ÈÞ¹‚'® ¾- [µ’OE.rx.ÌöÂ`,Km?;HÖ,…ÎTQL#5wnòø+{;©€WPTÚð*C(Ö·9еȊ]áPìÀ5ÚÈäñÈ+FÂ|/Œáz1¸~ÈòDVé®Ü>2øtâǺ*Y_t–ëp÷’áàÏýöQd$ÁìM$Œk§ÙWNà{ÞÌIÝ H8ýI‡þ³8~?“üžî*`q€®™·¶0<ÈK€Ö_O¹ ÓŠÆ„U%‹ª0Ó˜^Ñ+¤÷æK›¶¥Ý•|ˆsƒ¥ÁRª&3X‚§¥‹ÀéÝ8@dSbE¥!Âe¼,E~©Rnz©T·%×ngÀ¾µŒB"gøOaàë7øj ph¾Í¾žùàÎ!1bÀ¦%‘ƒL8™o?°KÊÒf¡7]×È‘À¬°á-G¨0Ø §]j4Þ0–lóyæŠ?#ãuÅk y¹£~§B2Ž §€œF÷¾´Àn.‹¿„B ±K¨«•Èlt€XÅí³g5í-±Ã$vŽ¢:q¢·ñŽDÚ ‚a‚ÿ…üÍÖcëÔòñ=ÒFH^T=d#•–Òú¨G¸®dåÖR»\íõ5Ð_ØÊü ×µ7Á!qºÆG©ÍðL¶æXÿïEµ£þ ¸}Në<ÓÐ_ew…ˆ"ç%vͰè1ÅV÷Û½›I׌¼"olwÁ^0…M02@h^20œõa\ÎvR7_²Åok¦[96ÈăDõØ ÔyZØ—¶ÓÅId]v}¢Ò˜!ÀˆL#¸/Àw8çýϪú»ú«sgìõ®Øy”𦩧ÍÇ3ξMV¾LDmÓÖmC†¸øi2íçûŽ2%š`<ò3IÏ0X·g0Ïxž¿á©•Pè:Ibkw£ =PC¹#7$SvñÁBßC‰Ê¶ˆþxƒ›²$Œ,í`y{ ÅOª¼¨¸:[$P¤Ú[f1øí Úý¢¤¼4mÚåæ%Æžù­RÍ—#â4æ~°‹—;ëc€’™ÞQ.J\ãòÿE0ƒ(fÉ? fl=¦\e‡W­fIôóü^i¥ö¦×—÷öJʹ72i#]ÐòÕ6h¯…ßÕË»aJønè«bŸ¥3IGÝNçGká>—«~úýž:Æ…2³"i7xp]`Ë\fË’WûÏbÇNÒd–‚®ù —#À×4h~ê jU%J»U6ÅO›Å/‹¿…’@endstream endobj 308 0 obj<>/XObject<<>>>>>>endobj 309 0 obj<>stream x¥W]oÛ6}ϯ¸oU€ˆ‘dÙ’½‡`[¬/ëÖÛ€e´DÛldÑ!)»úãw/)Ér­®h±,Š÷óœÃ«§«"üÄ%0™A±»úiyÁnïsˆcX®!KÙ$J`–g°,ñÙe|\[8n%þß »U%˜­jªVd}P¢„µÒÀkP«¢°xU‚¶Ñ5Ø­€uSUÏðÔðJ®¥(¯—¯&,šÆÙL„ÑÂxÂôÔ|'@­ÝžÖ7À¡’Æ¢'ØkUôf4ùÜq»€WèõWÜú¹¨¸1tE¢“]Ú÷YÖÆº Üväºt7ºë=×¸Í ]ìüÂÙî&~“åp4x0yÅ`‰YF‹eÙ+m˱P»•ª1XA« Ð‚[AK_-‘÷⨫*>bo¥ªA¬‘±¤«?~ß´]Ób-´sà—EÆfÉ|2ÇÌN¥’»}%v¢¶Vügo؆ÝІÛû¢EI̦É4ÏÏ›ø§\ÒÆ#Æ ~_‡®AK<:\ '»ƒõÅ⓲EµX¼óˆê2C£_µÉ|ZKÒIa³I<# ï´žµËˆí2ø˜0 ÏËÐ".v{û ÆjYo@®¡VAØÔ·÷ó¶x|íx´"Ø«‡²àÄòÕ3üõnYT„=Qƒ@ôœ„Á5h”=D±•(*>*ßl´Ø #ú›×€m bO>:8ʪ$ûuOBìQx]8p-ùªæÆ›õÔ‚Ž™[Q<º”œ¥#7)›fÙ,=gCÑh,‚¸ò:d¹2Þ8N²^+ZêkJ–Î:ÆàY£º½­á ´A† Q*íRíJˆ«=DlØöWWÑ-G•Ù ©AëSDæŽØ€/Qk(Éùíº1ü@Ü)ý<èó¶Ù¨›Ý ã%ïÐâ9š°$Ïóä¼dc HÕÔÚ"’j!JD U!.±õåF ¤º¥¾¡„QJaTæ0$†ÓE0(á ¹ãÄ PÁQÚ­ïc ÂÎ2ümDµþg±ÀÔ>ÀU×½‡ëïW ¡¤‘Ûû¸SË0OØtš@<ÍØ$›’&<$¨gЪj'79Š 8ŠÎ %ŸºÐÈ€`îB½;ðªwäiLs~Ô›†Äß8Å9)Ú™h¶¶|´]°ÁâLëÉ@§áÄM+'ƒ¼B1Lì…]XC©ÿOÙü€GjâEttÔ!3ÖØNcŸ+HT1ÀZÒÒõžÁŸ UûFéÁÛ"¢\Äð´H2ߊ‚Ï—É”=*Dj[v·]º§»()ÕQºwAÑÉNæûâ|? ÿ šv£Wç¸ÏÚ7ï˜IÄò(ÿ0'9‹ü1lš•ùâøÚÞšöX%W/F¦‡I;T yÖjÅ‹GƒóáV˜; íðÕþêji7ÈI¤ú!Àfà© ¼¼¸t¥m𣿮¿ M3.ô±ß@õ;§º ¡÷äN‰Ì…Ú÷=Ýȃ¨]£˜mGÔ¥*œ à™Ž‡ê8¡›U=h;®\ºÙ¿–ËʼDûàQ†‡e½Ä[„ºñm¼%)Ë=Þ¬¾˜´z)ü_@Óœ^´ß• Ö5æem_Rا¡©·†#Ñ ÚC1 kžïÃf9³”ÍGNœ´›ÿÓ9Kñ­aÏØh¸endstream endobj 310 0 obj<>/XObject<<>>>>>>endobj 311 0 obj<>stream xÝWMoÛF½ëWÌQÂ?EJ¡El @P£ˆsXS+™Éew—²ýï;³KZ¤¨ÆvsJá‹D®fßÌ{ófü÷,ÿHCˆ–W³_·3°¸Î `»‡˜ùIE°ÌRØîðð6Ÿ¦UõúÝöÛ,õYG)=ßÍEÕ˜'ÐFõ^.®W]/Yä‡à) “,¦Óm­…qÇúËæ°ñj™Ëª)yQoàÀæ2ÆŽõ†Nö`¼Ègqæuh+Qmñœ®!…=»s Ôº¸+¥¤‚JhÍBWtÛ4 ˆÝyFl®¢•ðü%xaÀ¢`IšƒIüÏ\œâ ƒ¬ûâø£ß>ñ0_ÃMc Yó*‰ÀŽ\éQ@¯ÏxˆæƒÐ¹*ì§|mï…òŠSt؉RÌ]Ö°²»³|ÈÈ=ÝlÓѰW²^ƒ¼û&rÃ(ñ‹(^/˜ —‚—…,IBÔOÂÒ0¡ÊÞ†Xa€1ê e…lÕɪ)ÅQ”g$ÀÆ>ÝŠ«âõ6\ôŠÊ…<»i O÷_¦xŠaÄsÿš`"J§n¢úN@ÎËÒIñb¡¿K÷Ÿ÷¢s_hT¸¹—;ÀO-  üÚ|‡œ÷"³É½‡ÂÐ1äþ^*{©*’Üæ¶Èé°‚ˆ…DU—‚+MÞ™ê¼4B눂/Z”{›Ú†½õë–Nò.Þh“s`]lVè(DÖ Ò©)m—³*5¦Ô_ýv1£K´¥mªÎ¨SUGhe~ö’ª“€‘æÉ,ìº3¥=kZâ… MJ‰¹Ó‡ÍäÑ%©Gùuþikhcœˆ@Kúø’Ô'8ÎrXƒ{¡D£{cAK|)H´Âå:G«r1úÞ X‚#%C#F#ñ¿Ô`„ÿYí /ÐNQÙ8„ÂVô¬æ8èúÿA÷aµ/öÞ„2Øà>ã>da–e¡+zßÕ ~².L½<[RœD™í•ã/&+ Öñw”©âl?y} bŒôIzŽÜÿ&½«ÚتµAAˇ¾)JÛUºy±/†Í‡vOƒþv®…€ÌíüqËöGçú/ïÇÕ³jm‘ã¸À…Âð¢Ô·ïÞî¨Ó}rb¤Ù’…«ÀZä÷Ö?Âe‚Üî(KL¥ì,¤_6^æ­ß­ìžk7©·;ÀöÂèÅ©î(xB:x7‚í6E·-w4ôÝN†Ë@kd…ðiÀ=½'- hxpÓ'O«ÐO 1å5Jæ ·¹ÏE­ =¤¡^нapõÈqÝÝöÜÏê‹3–¦6Iã¾Ü8Œµx¯¯éWB´¸žp”f,H§\Ü­A¼b1.ÑÉjÅ–±]þº¡IìÁ‡‘ú<ع(y}ø$öìQ·ƒxA° ÁE<õWDóo]šÖ«ãtéþ? cBxµý1û]·Tendstream endobj 312 0 obj<>/XObject<<>>>>/Annots 189 0 R>>endobj 313 0 obj<>stream xµTÁrÛ ½ë+öèÀBHBÊ­i’ö–6Ñ¡‡\0¶RY¸€šäï» Û±=Ing,oß¾·ìŸ„AŠ?"^‚Ú$)¬p#OK**9þ3°–xð-Ii ¼ªhÈrZì=<$GË BQqtv´Ü@Y@½£åê’–G÷0™¨(?åqÕ$óÛ ƒf 9M‹Šs(1¦i‘x£f÷Úv¸¼hž‘Ò,ç"ì·3½ÙúWpÞvÃ*Îok`9å‡üH3 <£y&òÿÃå1JD2FEY‡€•ö7/ÿ.‡¶×vŠ<'FxJ󢊀×Ú)Ûm}gÞa‡¬m§ÿjðk j´V4ÂÃz‡-òÑíˆf,Lû ÒÜUCCn²/60ä¬ ‚|¬Å9pÄœJ`û:]Ô ¬X(@;{䙀SUPĬª”5M9¥ºO¤™ríÝ;é‹]¬ÝE£GQú}uÑÊ À©Þ³Ë3}>”äS´ŸÔ]xß ºtrÖ9\k5zÝÂóZ! „q|,(ܯ»Fõƒ:b_.ŒÅO _å £Ã}o@ɾÕk9Œ[‡,¤‰®ÆÇ¢8ö<¥&iñ†/3ª“1{ç×`OZy3ƒ eŸ;ñ¡ÕøFå}¼ p7LE„ž›nœÑ~ ÇnC’”K¯'}³%­^vnAÈ®]ÿsO2–ѲŽÒžôä¡wÃ3ÅA¾lÁƒ+©~}»¡Õ/°•+IÎoóÝ4a9£¬À ÄjZ±xgòÀµQ±-ex½@ÐykÔ¼—Ãê^/é‹ñªîì1ð9Æ!q˜"¹(§9”!ð¦I~&ÿ8¡ƒàendstream endobj 314 0 obj<>endobj 315 0 obj<>endobj 316 0 obj<>0<>]>>>>endobj xref 0 317 0000000000 65535 f 0000000015 00000 n 0000000211 00000 n 0000001532 00000 n 0000094180 00000 n 0000094365 00000 n 0000095274 00000 n 0000186608 00000 n 0000186802 00000 n 0000187711 00000 n 0000187789 00000 n 0000187866 00000 n 0000187948 00000 n 0000188084 00000 n 0000188228 00000 n 0000188287 00000 n 0000200613 00000 n 0000200715 00000 n 0000200817 00000 n 0000200919 00000 n 0000201021 00000 n 0000201123 00000 n 0000201225 00000 n 0000201327 00000 n 0000201429 00000 n 0000201531 00000 n 0000201633 00000 n 0000201735 00000 n 0000201837 00000 n 0000201939 00000 n 0000202041 00000 n 0000202143 00000 n 0000202245 00000 n 0000202347 00000 n 0000202449 00000 n 0000202551 00000 n 0000202653 00000 n 0000202755 00000 n 0000202857 00000 n 0000202959 00000 n 0000203061 00000 n 0000203163 00000 n 0000203265 00000 n 0000203367 00000 n 0000203469 00000 n 0000203571 00000 n 0000203673 00000 n 0000203774 00000 n 0000203876 00000 n 0000203978 00000 n 0000204080 00000 n 0000204182 00000 n 0000204284 00000 n 0000204386 00000 n 0000204488 00000 n 0000204590 00000 n 0000204692 00000 n 0000204794 00000 n 0000204896 00000 n 0000204998 00000 n 0000205100 00000 n 0000205201 00000 n 0000205303 00000 n 0000205405 00000 n 0000205507 00000 n 0000205609 00000 n 0000205711 00000 n 0000205813 00000 n 0000205915 00000 n 0000206017 00000 n 0000206119 00000 n 0000206221 00000 n 0000206323 00000 n 0000206425 00000 n 0000206527 00000 n 0000206629 00000 n 0000206731 00000 n 0000206833 00000 n 0000206935 00000 n 0000207037 00000 n 0000207139 00000 n 0000207241 00000 n 0000207343 00000 n 0000207445 00000 n 0000207547 00000 n 0000207649 00000 n 0000207694 00000 n 0000207779 00000 n 0000208285 00000 n 0000208385 00000 n 0000208408 00000 n 0000208446 00000 n 0000208531 00000 n 0000208554 00000 n 0000208602 00000 n 0000208687 00000 n 0000208789 00000 n 0000208891 00000 n 0000208993 00000 n 0000209095 00000 n 0000209197 00000 n 0000209300 00000 n 0000209403 00000 n 0000209506 00000 n 0000209608 00000 n 0000209711 00000 n 0000209814 00000 n 0000209917 00000 n 0000210020 00000 n 0000210123 00000 n 0000210226 00000 n 0000210329 00000 n 0000210431 00000 n 0000210534 00000 n 0000210637 00000 n 0000210740 00000 n 0000210842 00000 n 0000211029 00000 n 0000211131 00000 n 0000211233 00000 n 0000211266 00000 n 0000211318 00000 n 0000211405 00000 n 0000211430 00000 n 0000211474 00000 n 0000211561 00000 n 0000211613 00000 n 0000211700 00000 n 0000211803 00000 n 0000211844 00000 n 0000211947 00000 n 0000212050 00000 n 0000212153 00000 n 0000212256 00000 n 0000212359 00000 n 0000212462 00000 n 0000212565 00000 n 0000212667 00000 n 0000212770 00000 n 0000212871 00000 n 0000212974 00000 n 0000213077 00000 n 0000213180 00000 n 0000213283 00000 n 0000213386 00000 n 0000213489 00000 n 0000213592 00000 n 0000213695 00000 n 0000213797 00000 n 0000213900 00000 n 0000214003 00000 n 0000214105 00000 n 0000214208 00000 n 0000214311 00000 n 0000214414 00000 n 0000214517 00000 n 0000214620 00000 n 0000214723 00000 n 0000214826 00000 n 0000214928 00000 n 0000215031 00000 n 0000215134 00000 n 0000215237 00000 n 0000215340 00000 n 0000215443 00000 n 0000215546 00000 n 0000215649 00000 n 0000215752 00000 n 0000215854 00000 n 0000215957 00000 n 0000216060 00000 n 0000216163 00000 n 0000216266 00000 n 0000216369 00000 n 0000216472 00000 n 0000216575 00000 n 0000216960 00000 n 0000217063 00000 n 0000217088 00000 n 0000217140 00000 n 0000217227 00000 n 0000217252 00000 n 0000217296 00000 n 0000217383 00000 n 0000217408 00000 n 0000217460 00000 n 0000217547 00000 n 0000217572 00000 n 0000217615 00000 n 0000217701 00000 n 0000217726 00000 n 0000217760 00000 n 0000217794 00000 n 0000219492 00000 n 0000219535 00000 n 0000219578 00000 n 0000219621 00000 n 0000219664 00000 n 0000219707 00000 n 0000219750 00000 n 0000219793 00000 n 0000219836 00000 n 0000219879 00000 n 0000219922 00000 n 0000219965 00000 n 0000220008 00000 n 0000220051 00000 n 0000220094 00000 n 0000220137 00000 n 0000220180 00000 n 0000220223 00000 n 0000220266 00000 n 0000220309 00000 n 0000220352 00000 n 0000220395 00000 n 0000220438 00000 n 0000220481 00000 n 0000220524 00000 n 0000220567 00000 n 0000220610 00000 n 0000220653 00000 n 0000220696 00000 n 0000220739 00000 n 0000220782 00000 n 0000220825 00000 n 0000220867 00000 n 0000220910 00000 n 0000220953 00000 n 0000220996 00000 n 0000221039 00000 n 0000221082 00000 n 0000221125 00000 n 0000221168 00000 n 0000221211 00000 n 0000221254 00000 n 0000221297 00000 n 0000221340 00000 n 0000221383 00000 n 0000221426 00000 n 0000221468 00000 n 0000221511 00000 n 0000221554 00000 n 0000221597 00000 n 0000221640 00000 n 0000221683 00000 n 0000221726 00000 n 0000221769 00000 n 0000221812 00000 n 0000221855 00000 n 0000221898 00000 n 0000221941 00000 n 0000221984 00000 n 0000222027 00000 n 0000222070 00000 n 0000222113 00000 n 0000222156 00000 n 0000222199 00000 n 0000222242 00000 n 0000222285 00000 n 0000222328 00000 n 0000222371 00000 n 0000222414 00000 n 0000222457 00000 n 0000222500 00000 n 0000222747 00000 n 0000222971 00000 n 0000225203 00000 n 0000225371 00000 n 0000227167 00000 n 0000227348 00000 n 0000228916 00000 n 0000229107 00000 n 0000230306 00000 n 0000230499 00000 n 0000232199 00000 n 0000232402 00000 n 0000234154 00000 n 0000234322 00000 n 0000235821 00000 n 0000236014 00000 n 0000237657 00000 n 0000237835 00000 n 0000239460 00000 n 0000239663 00000 n 0000241090 00000 n 0000241278 00000 n 0000242689 00000 n 0000242877 00000 n 0000244434 00000 n 0000244627 00000 n 0000246449 00000 n 0000246647 00000 n 0000248121 00000 n 0000248324 00000 n 0000249942 00000 n 0000250130 00000 n 0000251346 00000 n 0000251539 00000 n 0000253112 00000 n 0000253305 00000 n 0000254901 00000 n 0000255079 00000 n 0000256976 00000 n 0000257164 00000 n 0000258642 00000 n 0000258835 00000 n 0000260171 00000 n 0000260359 00000 n 0000261611 00000 n 0000261799 00000 n 0000263300 00000 n 0000263488 00000 n 0000264637 00000 n 0000264830 00000 n 0000265550 00000 n 0000265605 00000 n 0000265718 00000 n trailer <<6ca0534b60230832a3901bd4c23d34fb>]>> startxref 265893 %%EOF ./xotcl-1.6.8/doc/._langRef.xotcl000644 000765 000024 00000000430 12161600406 017224 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/langRef.xotcl000644 000765 000024 00000165752 12161600406 017032 0ustar00neumannstaff000000 000000 # $Id: langRef.xotcl,v 1.18 2007/09/05 19:09:22 neumann Exp $ package provide XOTcl-langRef 1.6.4 package require XOTcl 1 @ @File { description { XOTcl language reference. Describes predefined objects and classes. } "predefined primitives" { XOTcl contains the following predefined primitives (Tcl commands):
<@tt>self<@/tt>
computes callstack related information. It can be used in the following ways: <@UL> <@LI><@TT>self - returns the name of the object, which is currently in execution. If it is called from outside of a proc, it returns the error message ``<@TT>Can't find self''. <@LI><@TT>self class - the self command with a given argument <@TT>class returns the name of the class, which holds the currently executing instproc. Note, that this may be different to the class of the current object. If it is called from a proc it returns an empty string. <@LI><@TT>self proc - the self command with a given argument <@TT>proc returns the name of the currently executing proc or instproc. <@li><@TT>self callingclass: Returns class name of the class that has called the executing method. <@li><@TT>self callingobject: Returns object name of the object that has called the executing method. <@li><@TT>self callingproc: Returns proc name of the method that has called the executing method. <@li><@TT>self calledclass: Returns class name of the class that holds the target proc (in mixins and filters). <@li><@TT>self calledproc: Returns method name of the target proc (only applicable in a filter). <@li><@TT>self isnextcall: Return 1 if this method was invoked via next, otherwise 0 <@li><@TT>self next: Return the "next" method on the precedence path as a string. <@li><@TT>self filterreg: In a filter: returns the name of the object/class on which the filter is registered. Returns either 'objName filter filterName' or 'className instfilter filterName'. <@li><@TT>self callinglevel: Returns the calling level, from where the actual proc was called from. Intermediary next calls are ignored in this computation. The level is returned in a form it can be used as first argument in <@TT>uplevel or <@TT>upvar. <@li><@TT>self activelevel: Returns the level, from where the actual proc was invoked from. This might be the calling level or a next call, whatever is higher in the stack. The level is returned in a form it can be used as first argument in <@TT>uplevel or <@TT>upvar. <@/UL> <@/p>
<@tt>my methodName<@/tt>
is a short form for <@tt>[self] methodName and can only be called in a context of an instproc or an method specific proc. It allows certain optimizations and shorter to write. <@/p><@p> <@tt>next <@/tt>
invokes the next shadowed (same-named) method on the precedence path and returns its result. If <@tt>next is called without arguments, the arguments of the current method are passed through the called method. If <@tt>next is invoked with the flag <@tt>--noArgs, the shadowed method is called without arguments. If other arguments are specified for next, these will be used for the call. <@/dd>
<@tt>myvar varName
returns the fully qualified variable name of the specified variable.

<@tt>myproc methodName ?args?
calls the specified XOTcl method without the need of using "<@tt>[list [self] methodName ...]".

<@tt>::xotcl::alias class|obj methodName ?-objscope? ?-per-object? cmdName
can be used to register a predefined C-implemented Tcl command as method <@tt>methodName. The option <@tt>-objscope has the same meaning as for forwarder (instance variables of the calling object appear in the local scope of the Tcl command), <@tt>-per-object has the same meaning as for the method <@tt>method (when used on a class, the method is registered for the class object only, but not for the instances). This command can be used to bootstrap xotcl (when e.g. no methods are available).

::xotcl::configure filter ?on|off?<@/tt>
allows to turn on or off filters globally for the current interpreter. By default, the filter state is turned off. This function returns the old filter state. This function is needed for the serializer that is intended to serialize the objects classes independent of filter settings.

<@tt>::xotcl::configure softrecreate ?on|off?<@/tt>
allows to control what should happen, when an object / a class is recreated. Per default it is set off, which means that the object/class is destroyed and all relations (e.g. subclass/superclass) to other objects/classes are destroyed as well. If <@tt>softrecreate is set, the object is reseted, but not destroyed, the relations are kept. This is important, when e.g. reloading a file with class definitions (e.g. when used in OpenACS with file watching and reloading). With <@tt>softrecreate set, it is not necessary to recreate dependent subclasses etc.

Example: e.g. there is a class hierarchy A <- B <- C Without <@tt>softrecreate set, a reload of B means first a destroy of B, leading to A <- C, and instances of B are re-classed to ::xotcl::Object. When <@tt>softrecreate is set, the structure remains unchanged.

<@tt>::xotcl::finalize<@/tt>
Delete all XOTcl objects and classes and free all associated memory.

This command has the only purpose to delete all objects and classes of an interpreter in a multi-threaded environment at a safe time.

Background: when XOTcl is used in a threaded environment such as for example in AOLserver, one has to take care that the deletion of objects and classes happens in a safe environment, where the XOTcl destructors (destroy methods) are still able to run. Without ::xotcl::finalize the deletion happens in Tcl_FinalizeThread(), after thread cleanup (where e.g. the thread local storage is freed). This can lead to memory leaks in AOLserver, which allocates e.g. some structures on demand, but since this happens after cleanup, it will leak. A simple ns_log in a destructor might lead to this problem. The solution is to call ::xotcl::finalize in the "delete trace" in AOLserver (as it happens in OpenACS).

Note, that ::xotcl::finalize is not intended for application programs.

} } ## ## Object methods ## @ Class Object { description { This class holds the pre-defined methods available for all XOTcl objects. All these methods are also available on classes. } } @ Object instproc abstract { methtype "instproc or proc" methodName "name of abstract method" arglist "arguments" } { Description { Specify an abstract method for class/object with arguments. An abstract method specifies an interface and returns an error, if it is invoked directly. Sub-classes or mixins have to override it. } return "error" } @ Object instproc append { varName "name of variable" args "arguments to append" } { Description { Append all of the value arguments to the current value of variable varName. Wrapper to the same named Tcl command (see documentation of Tcl command with the same name for details). } return "empty string" } @ Object instproc array { opt "array option" array "array name" ?args? "args of the option" } { Description { This method performs one of several operations on the variable given by arrayName. It is a wrapper to the same named Tcl command (see documentation of Tcl command with the same name for details). } return "diverse results" } @ Object instproc autoname { ?<-instance>|<-reset>? "Optional modifiers: <@br> '-instance' makes the autoname start with a small letter.<@br> '-reset' resets the autoname index to 0." name "base name of the autoname"} { Description { autoname creates an automatically assigned name. It is constructed from the base name plus an index, that is incremented for each usage. E.g.: <@pre class='code'> $obj autoname a produces a0, a1, a2, ... Autonames may have format strings as in the Tcl 'format' command. E.g.: <@pre class='code'> $obj autoname a%06d produces a000000, a000001, a000002, ... } return "newly constructed autoname value" } @ Object instproc check { options "none, one or more of: (?all? ?pre? ?post? ?invar? ?instinvar?)" } { Description { Turn on/off assertion checking. Options argument is the list of assertions, that should be checked on the object automatically. Per default assertion checking is turned off.
Examples:
<@pre CLASS="code"> o check {}; <@i># turn off assertion checking on object o o check all; <@i># turn on all assertion checks on object o o check {pre post}; <@i># only check pre/post assertions } return "empty string" } @ Object instproc class { newClass "?new class?" } { Description { Changes the class of an object dynamically to <@tt>newClass. The method returns the current value of class, when it is called without arguments. } return "if <@tt>newClass is not specified return class, otherwise empty" } @ Object instproc cleanup { ?args? "Arbitrary arguments passed to cleanup" } { Description { Resets an object or class into an initial state, as after construction. Called during recreation process by the method 'recreate' } return "empty string" } @ Object instproc configure { ?args? "'-' method calls" } { Description { Calls the '-' (dash) methods. I.e. evaluates arguments and calls everything starting with '-' (and not having a digit a second char) as a method. Every list element until the next '-' is interpreted as a method argument. configure is called before the constructor init during initialization and recreation. In the following example, the variable set is called via configure before init: <@pre class='code'> Object o -set x 4 The method configure can be called with the dash-notation at arbitrary times: <@pre class='code'> o configure -set x 4 Note, that if '-' is followed by a numerical, the arument is interpreted as a negative number (and not as a method). If a value of a method called this way starts with a "-", the call can be placed safely into a list (e.g. "Class c [list -strangearg -a-] -simplearg 2").

See also create. } return "number of the skipped first arguments" } @ Object instproc contains { "?-withnew?" "Option to overload new to create new objects within the specified object. Per default, this option is turned on." "?-object?" "object, in which the new objects should be created. The default is the object, for which contains>/tt> was called." "?-class?" "In combination with option -object: If the specified object does not exist, create it from the specified class. The default is ::xotcl::Object" cmd "Tcl command to create multiple objects" } { Description { This method can be used to create nested object structures with little syntactic overhead. The method changes the namespace to the specified object and creates objects there. Optionally, a different object scope can be specified and creating new objects in the specified scope can be turned off. The following command creates a three rectangles, containing some points.

  Class Point -parameter {{x 100} {y 300}}
  Class Rectangle -parameter {color}

  Rectangle r0 -color pink -contains {
    Rectangle r1 -color red -contains {
      Point x1 -x 1 -y 2
      Point x2 -x 1 -y 2
    }
    Rectangle r2 -color green -contains {
      Point x1
      Point x2
    }
  }
The resulting object structure looks like in the folloing example (simplified).
   ::r0
   ::r0::r1
   ::r0::r1::x1
   ::r0::r1::x2
   ::r0::r2
   ::r0::r2::x1
   ::r0::r2::x2
} return "number of the skipped first arguments" } @ Object instproc copy { newName "destination of copy operation" } { Description { Perform a deep copy of the object/class (with all information, like class, parameter, filter, ...) to "newName". } return "empty string" } @ Object instproc destroy { ?args? "Arbitrary arguments passed to the destructor" } { Description { Standard destructor. Can be overloaded for customized destruction process. Actual destruction is done by instdestroy. "destroy" in principal does: <@pre class='code'> Object instproc destroy args { [my info class] instdestroy [self] } } return "empty string" } @ Object instproc eval { args "cmds to eval" } { Description { Eval args in the scope of the object. That is local variables are directly accessible as Tcl vars. } return "result of cmds evaled" } @ Object instproc extractConfigureArg { al "Argument List Name" name "Name of the configure argument to be extracted (should start with '-')" ?cutTheArg? "if cutTheArg not 0, it cut from upvar argsList, default is 0" } { Description { Check an argument list separated with '-' args, as for instance configure arguments, and extract the argument's values. Optionally, cut the whole argument. } return "value list of the argument" } @ Object instproc exists { var "variable name" } { Description { Check for existence of the named instance variable on the object. } return "1 if variable exists, 0 if not" } @ Object instproc filter { ?args? "filter specification" } { Description { If <@tt>$args is one argument, it specifies a list of filters to be set. Every filter must be an XOTcl proc/instproc within the object scope. If <@tt>$args it has more argument, the first one specifies the action. Possible values are <@tt>assign, <@tt>get, <@tt>add or <@tt>delete, it modifies the current settings as indicated. For more details, check the tutorial. } return "if <@tt>$args return empty current filters, otherwise empty" } @ Object instproc filterguard { filterName "filter name of a registered filter" guard "set of conditions to execute the filter" } { description { Add conditions to guard a filter registration point. The filter is only executed, if the guards are true. Otherwise we ignore the filter. If no guards are given, we always execute the filter. } return "an empty string" } @ Object instproc filtersearch { methodName "filter method name" } { description { Search a full qualified method name that is currently registered as a filter. Return a list of the proc qualifier format: 'objName|className proc|instproc methodName'. } return "full qualified name, if filter is found, otherwise an empty string" } @ Object instproc forward { methodName "name of forwarder method" ?options? "-objscope, -methodprefix string, -default names, -earlybinding, -verbose" ?callee? "named of the called command or object" ?args? "arguments" } { Description { Register an object specific method (similar to a proc) for forwarding calls to a callee (target Tcl command, other object). When the forwarder method is called, the actual arguments of the invocation are appended to the specified arguments. In callee an arguments certain substitutions can take place:
  • %proc: substituted by name of the forwarder method
  • %self: substitute by name of the object
  • %1: substitute by first argument of the invocation
  • {%@POS value}: substitute the specified value in the argument list on position POS, where POS can be a positive or negative integer or end. Positive integers specify the position from the begin of the list, while negative integer specify the position from the end.
  • {%argclindex LIST}: take the nth argument of the specified list as substitution value, where n is the number of arguments from the invocation.
  • %%: a single percent.
  • %Tcl-command: command to be executed; substituted by result.
Additionally each argument can be prefixed by the positional prefix %@POS (note the delimiting space at the end) that can be used to specify an explicit position. POS can be a positive or negative integer or the word end. The positional arguments are evaluated from left to right and should be used in ascending order. valid Options are:
  • -objscope causes the target to be evaluated in the scope of the object,
  • -methodprefix string inserts the specified prefix in front of the second argument of the invocation,
  • -default is used for default method names (only in connection with %1)
  • -earlybinding: look up the function pointer of the called Tcl command at definition time of the forwarder instead of invocation time. This option should only be used for calling C-implemented Tcl commands, no procs etc.);
  • -verbose
  • : print the substituted command to stderr before executing
See tutorial for detailed examples. } return "empty" } @ Object instproc hasclass { ?className? "name of a class to be tested" } { Description { Test whether the argument is either a mixin or instmixin of the object or if it is on the class hierarchy of the object. This method combines the functionalities of istype and ismixin. } return "1 or 0" } @ Object instproc incr { varName "variable name" ?increment? "value to increment" } { Description { Increments the value stored in the variable whose name is varName. The new value is stored as a decimal string in variable varName and also returned as result. Wrapper to the same named Tcl command (see documentation of Tcl command with the same name for details). } return "new value of varName" } @ Object instproc info { args "info options" } { Description { Introspection of objects. The following options can be specified: <@l> <@li><@TT>objName info args method: Returns the arguments of the specified proc (object specific method). <@li><@TT>objName info body method: Returns the body of the specified proc (object specific method). <@li><@TT>objName info class: Returns the class of objName. <@li><@TT>objName info children ?pattern?: Returns the list of aggregated objects with fully qualified names if <@TT>pattern was not specified, otherwise it returns all children where the object name matches the pattern. <@li><@TT>objName info commands ?pattern: Returns all commands defined for the object if <@TT>pattern was not specified, otherwise it returns all commands that match the pattern. <@li><@TT>objName info default method arg var: Returns 1 if the argument <@TT>arg of the proc (object specific method) <@TT>method has a default value, otherwise 0. If it exists the default value is stored in <@TT>var. <@li><@TT>objName info filter: Returns a list of filters. With -guard modifier all filterguards are integrated (<@TT> objName info filter -guards). With <@TT>-order modifier the order of filters (whole hierarchy) is printed. <@li><@TT>objName info filterguard name: Returns the guards for filter identified by name. <@li><@TT>objName info forward ?-definition name? ?pattern?: Returns the list of forwarders. One can call this method either without the optional arguments, or with the <@TT>pattern or with <@TT>-definition name. When the <@TT>pattern is specified only the matching forwarders are returned. When the <@TT>definition option is used together with a name of a forwarder, the definition of the forwarder with all flags is returned in a way that can be used e.g. for registering the forwarder on another object. <@li><@TT>objName info hasNamespace: From XOTcl version 0.9 on, namespaces of objects are allocated on demand. hasNamespace returns 1, if the object currently has a namespace, otherwise 0. The method <@TT>requireNamespace can be used to ensure that the object has a namespace. <@li><@TT>objName info info: Returns a list of all available info options on the object. <@li><@TT>objName info invar: Returns object invariants. <@li><@TT>objName info methods ?-nocmds? ?-nomixins? ?-incontext? ?pattern?: Returns the list of all methods currently reachable for objName. Includes procs, instprocs, cmds, instcommands on object, class hierarchy and mixins. Modifier <@TT>-noprocs only returns instcommands, <@TT>-nocmds only returns procs. Modifier <@TT>-nomixins excludes search on mixins. When the modifier <@TT>-incontext is used, it guards for conditional mixins are evaluated. <@li><@TT>objName info mixin ?-order? ?-guard? ?pattern?: Returns the list of mixins of the object. With <@TT>-order modifier the order of mixins (whole hierarchy) is printed. If <@TT>-guard is specified, the mixin guards are returned. If <@TT>pattern is specified and it contains wildcards, all matching mixins are returned. If <@TT>pattern does not contain wildcards, either the fully qualified name is returned, or empty, if no match exists. <@li><@TT>objName info nonposargs methodName: Returns non-positional arg list of methodName <@li><@TT>objName info parametercmd ?pattern?: Returns a list of registered parametercmds the object (or empty if there are none). If <@TT>pattern is specified, only the matching parametercmds are returned. <@li><@TT>objName info parent: Returns parent object name (or "::" for no parent), in fully qualified form. <@li><@TT>objName info post methodName: Returns post assertions of methodName. <@li><@TT>objName info pre methodName: Returns pre assertions of methodName. <@li><@TT>objName info procs ?pattern?: Returns all procs defined for the object if <@TT>pattern was not specified, otherwise it returns all procs that match the pattern. <@li><@TT>objName info precedence ?-intrinsic? ?pattern?: Returns all classes in the precedence order from which the specified object inherits methods. If the flag <@TT>-intrinsic is specified only the intrinsic classes (from the class hierarchy) are specified. If the flag is not specified, the returned list of classes contains the mixin and instmixin classes as well as the classes of the superclass chain in linearized order (i.e., duplicate classes are removed). If the pattern is specified, only matching classes are returned. <@li><@TT>objName info vars ?pattern?: Returns all variables defined for the object if <@TT>pattern was not specified, otherwise it returns all variables that match the pattern. <@/ul> } return "Value of introspected option as a string." } @ Object instproc instvar { v1 "name of instance variable" "?v2...vn?" "optional other names for instance variables" } { Description { Binds an variable of the object to the current method's scope. Example: <@pre class='code'> kitchen proc enter {name} { my instvar persons set persons($name) [clock seconds] } Now persons can be accessed as a local variable of the method.<@br> A special syntax is: <@tt> {varName aliasName} . This gives the variable with the name <@TT>varName the alias <@TT>aliasName. This way the variables can be linked to the methods scope, even if a variable with that name already exists in the scope. } return "empty string" } @ Object instproc invar { invariantList "Body of invariants for the object" } { Description { Specify invariants for the objects. All assertions are a list of ordinary Tcl conditions. } return "empty string" } @ Object instproc isclass { ?className? "name of a class to be tested" } { Description { Test whether the argument (or the Object, if no argument is specified) is an existing class or not. } return "1 or 0" } @ Object instproc ismetaclass { ?metaClassName? "name of a metaclass to be tested" } { Description { Test whether the argument (or the Object, if no argument is specified) is an existing metaclass or not. } return "1 or 0" } @ Object instproc ismixin { ?className? "name of a class to be tested" } { Description { Test whether the argument is a mixin or instmixin of the object. } return "1 or 0" } @ Object instproc isobject { objName "string that should be tested, whether it is a name of an object or not" } { Description { Test whether the argument is an existing object or not. Every XOTcl object has the capability to check the object system. } return "1 or 0" } @ Object instproc istype { className "type name" } { Description { Test whether the argument is a type of the object. I.e., 1 is returned if className is either the class of the object or one of its superclasses. } return "1 or 0" } @ Object instproc lappend { varName "name of variable" args "elements to append" } { Description { Append all the specified arguments to the list specified by varName as separated elements (typically separated by blanks). If varName doesn't exist, it creates a list with the specified values (see documentation of Tcl command with the same name for details). } return "empty string" } @ Object instproc mixin { ?args? "mixin specification" } { Description { If <@tt>$args is one argument, it specifies a list of mixins to be set. Every mixin must be a defined class. If <@tt>$args has more argument, the first one specifies the action. Possible values are <@tt>assign, <@tt>get, <@tt>add or <@tt>delete, it modifies the current settings as indicated. For more details, check the tutorial. } return "if <@tt>$args empty return current mixins, otherwise empty" } @ Object instproc move { newName "destination of move operation" } { Description { Perform a deep move of the object/class (with all information, like class, parameter, filter, ...) to "newName". Note that move is currently implemented as a copy plus subsequent destroy operation. } return "empty string" } @ Object instproc parametercmd { name "variable to be provided with getter/setter method" } { description { Add a getter/setter for an instance variable with the specified name as a command for the obj. Example: <@pre class='code'> Object o o parametercmd x o x 100 puts [o x] } return "empty string" } @ Object instproc noinit { } { description { flag that constructor (method <@tt>init
) should not be called. Example: <@pre class='code'> Class C C instproc init {} {puts hu} C c1 -noinit The object <@tt>c1 will be created without calling the constructor. This can be used to draw a snapshot of an existing object (using the serializer) and to recreate it in some other context in its last state. } return "empty string" } @ Object instproc proc { name "method name" ?non-pos-args? "optional non-positional arguments" args "method arguments" body "method body" "?preAssertion?" "optional assertions that must hold before the proc executes" "?postAssertion?" "optional assertions that must hold after the proc executes" } { Description { Specify a method in the same style as Tcl specifies procs. <@br> Optionally assertions may be specified by two additional arguments. Therefore, to specify only post-assertions an empty pre-assertion list must be given. All assertions are a list of ordinary Tcl conditions. <@br> When instproc is called with an empty argument list and an empty body, the specified instproc is deleted. } return "empty string" } @ Object instproc procsearch { procName "simple proc name" } { Description { Search which method should be invoked for an object and return the fully qualified name of the method as a list in proc qualifier format: 'objName|className proc|instproc|forward|instforward|parametercmd|instparametercmd|cmd|instcmd methodName'. The proc qualifier format reports the command used to create the method. The only exception is instcmd and cmd, which refer to commands implemented in C. E.g., <@pre class='code'> o procsearch set returns <@pre>::xotcl::Object instcmd set. } return "fully qualified name of the searched method or empty string if not found" } @ Object instproc requireNamespace { } { Description { The method <@TT>requireNamespace can be used to ensure that the object has a namespace. Namespaces are created automatically by XOTcl, when e.g. an object has child objects (aggregated objects) or procs. The namespace will be used to keep instance variables, procs and child objects. To check, whether an object currently has a namespace, <@TT>info hasNamespace can be used. Hint: In versions prior to XOTcl 0.9 all XOTcl objects had their own namespaces; it was made on demand to save memory when e.g. huge numbers of objects are created. <@TT>requireNamespace is often needed when e.g. using Tk widgets when variables are to be referenced via the namespace (with <@TT>... -variable [self]::varName ...). } return "empty string" } @ Object instproc set { varName "name of the instance variable" ?value? "optional new value" } { Description { Set an instance variable in the same style as Tcl sets a variable. With one argument, we retrieve the current value, with two arguments, we set the instance variable to the new value. } return "Value of the instance variable" } @ Object instproc subst { options "?-nobackslashes? ?-nocommands? ?-novariables?" string "string to be substituted" } { Description { Perform backslash, command, and variable substitutions in the scope of the given object (see documentation of Tcl command with the same name for details). } return "substituted string" } @ Object instproc trace { varName "name of variable" } { Description { Trace an object variable (see documentation of Tcl command with the same name for details). } return "empty string" } @ Object instproc unset { "?-nocomplain?" "possible error messages are suppressed" v1 "Variable to unset" "?v2...vn?" "Optional more vars to unset" } { Description { The unset operation deletes one or optionally a set of variables from an object. } return "empty string" } @ Object instproc uplevel { ?level? "Level" command ?args? "command and arguments to be called" } { Description { When this method is used without the optional level, it is a short form of the Tcl command <@pre class='code'> uplevel [self callinglevel] command ?args?<@/pre> When it is called with the level, it is compatible with the original Tcl command. } return "result of the command" } @ Object instproc upvar { ?level? "Level" otherVar localVar "referenced variable and variable in the local scope" ?otherVar localVar? "optional pairs of referenced and local variable names" } { Description { When this method is used without the optional level, it is a short form of the Tcl command <@pre class='code'> upvar [self callinglevel] otherVar localVar ?...?<@/pre>. When it is called with the level, it is compatible with the original Tcl command. } return "result of the command" } @ Object instproc vwait { varName "name of variable" } { Description { Enter event loop until the specified variable is set (see documentation of Tcl command with the same name for details). } return "empty string" } # procs of Object @ Object proc getExitHandler {} { Description "Retrieve the current exit handler procedure body as a string." return "exit handler proc body" } @ Object proc setExitHandler {body "procedure body"} { Description { Set body for the exit handler procedure. The exit handler is executed when XOTcl is existed or aborted. Can be used to call cleanups that are not associated with objects (otherwise use destructor). On exit the object destructors are called after the user-defined exit-handler. } return "exit handler proc body" } # class @ Class Class -superclass Object { description { This meta-class holds the pre-defined methods available for all XOTcl classes. } } @ Class instproc alloc { obj "new obj/class name" ?args? "arguments passed to the new class after creation" } { description { Allocate an uninitialized XOTcl object or class. Alloc is used by the method <@tt>create<@/tt> to allocate the object. Note that <@tt>create<@/tt> also calls as well configure and init to initialized the object. Only in seldom cases the programmer may want to suppress the <@tt>create<@/tt> mechanism and just allocate uninitiaized objects via <@tt>alloc<@/tt>. } return "new class name" } @ Class instproc allinstances { } { description { Compute all immediate and indirect instances of a class } return "fully qualified list of instances" } @ Class instproc create { objName "name of a new class or object" ?args? "arguments passed to the constructor" } { description { Create user-defined classes or objects. If the class is a meta-class, a class is created, otherwise an object. The method <@tt>create<@/tt> is responsible for allocating and initializing objects. The method can be overloaded e.g. in a metaclass if other initialization behavior is wanted.

The standard behavior of <@tt>create<@/tt> is as follows:

  1. Call the method <@tt>alloc<@/tt> to create an uninitialized object.
  2. Call the method <@tt>searchDefaults<@/tt> to set default values for instance attributes-
  3. Call the method <@tt>configure<@/tt> to configure the object with the values provided at object creation time. The method <@tt>configure<@/tt> interprets the arguments with leading dashes as method calls.
  4. Call the method <@tt>init<@/tt> to allow initialization by the class. The argument passed to init are the values from the passed argument list containing the arguments up to the first '-'.<@p>

Create firstly calls <@tt>alloc in order to allocate memory for the new object. Then default values for parameters are searched on superclasses (an set if found). Finally the constructor <@tt>init is called on the object with all arguments up to the first '-' arg.<@p> The <@tt>create method is often called implicitly through the <@tt>unknown mechanism when a class (meta-class) is called with an unknown method. E.g. the following two commands are equivalent <@pre class='code'> Car herby -color red Car create herby -color red <@/pre> When a users may want to call the constructor <@tt>init before other '-' methods, one can specify '-init' explicitly in the left to right order of the '-' method. Init is called always only once. e.g.: <@pre class='code'> Class Car -init -superclass Vehicle <@/pre> } return "name of the created instance (result of alloc)" } @ Class instproc info { args "info options" } { Description { Introspection of classes. All options available for objects (see <@a href="#Object-info">info object) is also available for classes. The following options can be specified: <@ul> <@li><@TT>ClassName info classchildren ?pattern?: Returns the list of nested classes with fully qualified names if <@TT>pattern was not specified, otherwise it returns all class children where the class name matches the pattern. <@li><@TT>ClassName info classparent: Returns the class ClassName is nesting to. <@li><@TT>ClassName info heritage ?pattern?: Returns a list of all classes in the precedence order of the class hierarchy. If pattern is specified, only matching values are returned. <@li><@TT>ClassName info instances ?-closure? ?pattern?: Returns a list of the instances of the class. If <@TT>-closure is specified, the resultet contains as well the instances of subclasses. If <@TT>pattern is specified and it contains wildcards, all matching instances are returned. If <@TT>pattern does not contain wildcards, either the fully qualified name is returned, or empty, if no match exists. <@li><@TT>ClassName info instargs method: Returns the arguments of the specified instproc (instance method). <@li><@TT>ClassName info instbody method: Returns the body of the specified instproc (instance method). <@li><@TT>ClassName info instcommands ?pattern?: Returns all commands defined for the class. If pattern is specified it returns all commands that match the pattern. <@li><@TT>ClassName info instdefault method arg var: Returns 1 if the argument <@TT>arg of the instproc (instance method) <@TT>method has a default value, otherwise 0. If it exists the default value is stored in <@TT>var. <@li><@TT>ClassName info instfilter: Returns the list of registered filters. With -guard modifier all instfilterguards are integrated (<@TT> ClassName info instfilter -guards). <@li><@TT>objName info instfilterguard name: Returns the guards for instfilter identified by name. <@li><@TT>objName info instforward ?-definition name? ?pattern?: Returns the list of instforwarders. One can call this method either without the optional arguments, or with the <@TT>pattern or with <@TT>-definition name. When the <@TT>pattern is specified only the matching instforwarders are returned. When the <@TT>definition option is used together with a name of a isntforwarder, the definition of the instforwarder with all flags is returned in a way that can be used e.g. for registering the instforwarder on another class. <@li><@TT>ClassName info instinvar: Returns class invariants. <@li><@TT>ClassName info instmixin ?pattern?: Returns the list of instmixins of this class. If <@TT>pattern is specified and it contains wildcards, all matching mixin classes are returned. If <@TT>pattern does not contain wildcards, either the fully qualified name is returned, or empty, if no match exists. <@li><@TT>ClassName info instmixinof ?-closure? ?pattern?: Returns the list of classes, into which this class was mixed in via instmixin. This is the inverse function of <@TT>ClassName info instmixin. If <@TT>-closure is specified, also the classes are returned, for which the class is indirectly mixed in via instmixin. If <@TT>pattern is specified and it contains wildcards, all matching mixin classes are returned. If <@TT>pattern does not contain wildcards, either the fully qualified name is returned, or empty, if no match exists. <@li><@TT>ClassName info instnonposargs methodName: returns list of non-positional args of methodName <@li><@TT>objName info instparametercmd ?pattern?: Returns a list of registered instparametercmds the class (or empty if there are none). If <@TT>pattern is specified, only the matching instparametercmds are returned. <@li><@TT>ClassName info instpost methodName: Returns post assertions of methodName. <@li><@TT>ClassName info instpre methodName: Returns pre assertions of methodName. <@li><@TT>ClassName info instprocs ?pattern?: Returns all instprocs defined for the class. If pattern is specified it returns all instprocs that match the pattern. <@li><@TT>ClassName info mixinof ?-closure? ?pattern?: Returns the list of classes, into which this class was mixed in via per object mixin. This is the inverse function of <@TT>Object info mixin. If <@TT>-closure is specified, also the classes are returned, for which the class is indirectly mixed in as a per-object mixin. If <@TT>pattern is specified and it contains wildcards, all matching mixin classes are returned. If <@TT>pattern does not contain wildcards, either the fully qualified name is returned, or empty, if no match exists. <@li><@TT>ClassName info parameter: Returns parameter list. <@li><@TT>ClassName info subclass ?-closure? ?pattern?: Returns a list of all subclasses of the class. If <@TT>-closure is specified, the result contains as well the subclasses of the subclasses. If <@TT>pattern is specified and it contains wildcards, all matching subclasses are returned. If <@TT>pattern does not contain wildcards, either the fully qualified name is returned, or empty, if no match exists. <@li><@TT> ClassName info superclass ?-closure? ?superclassname?: Returns a list of all super-classes of the class. If <@TT>-closure is specified, the result contains as well the superclasses of the superclasses. If <@TT>pattern is specified and it contains wildcards, all matching superclasses are returned. If <@TT>pattern does not contain wildcards, either the fully qualified name is returned, or empty, if no match exists. <@/ul> } return "Value of introspected option as a string." } @ Class instproc instdestroy { obj "obj/class name" ?args? "arguments passed to the destructor" } { Description { Standard destructor. Destroys XOTcl object physically from the memory. Can be overloaded for customized destruction process. <@p> In XOTcl objects are not directly destroyed, when a destroy is encountered in a method. Beforehand, the interpreter looks up whether the object is still referenced on the method callstack or not. If not, the object is directly destroyed. Otherwise every occurrence of the object on the callstack is marked as destroyed. During popping of the callstack, for each object marked as destroyed, the reference count is decremented by one. When no more references to the object are on the callstack the object is physically destroyed. This way we can assure that objects are not accessed with [self] in running methods after they are physically destroyed. } return "empty string" } @ Class instproc instfilter { ?args? "instfilter specification" } { Description { If <@tt>$args is one argument, it specifies a list of instfilters to be set. Every filter must be an XOTcl proc/instproc within the object scope. If <@tt>$args it has more argument, the first one specifies the action. Possible values are <@tt>assign, <@tt>get, <@tt>add or <@tt>delete, it modifies the current settings as indicated. For more details, check the tutorial. } return "if <@tt>$args return empty current instfilters, otherwise empty" } @ Class instproc instfilterguard { filterName "filter name of a registered filter" guard "set of conditions to execute the filter" } { description { Add conditions to guard a filter registration point. The filter is only executed, if the guards are true. Otherwise we ignore the filter. If no guards are given, we always execute the filter. } return "empty string" } @ Class instproc instforward { methodName "name of forwarder method" ?options? "-objscope, -methodprefix string, -default names, -earlybinding, -verbose" ?callee? "named of the called command or object" ?args? "arguments" } { Description { Register a method for the instances of a class (similar to an instproc) for forwarding calls to a callee (target Tcl command, other object). When the forwarder method is called, the actual arguments of the invocation are appended to the specified arguments. In callee an arguments certain substitutions can take place:

  • %proc: substituted by name of the forwarder method
  • %self: substitute by name of the object
  • %1: substitute by first argument of the invocation
  • {%@POS value}: substitute the specified value in the argument list on position POS, where POS can be a positive or negative integer or end. Positive integers specify the position from the begin of the list, while negative integer specify the position from the end.
  • {%argclindex LIST}: take the nth argument of the specified list as substitution value, where n is the number of arguments from the invocation.
  • %%: a single percent.
  • %Tcl-command: command to be executed; substituted by result.
Additionally each argument can be prefixed by the positional prefix %@POS (note the delimiting space at the end) that can be used to specify an explicit position. POS can be a positive or negative integer or the word end. The positional arguments are evaluated from left to right and should be used in ascending order. valid Options are:
  • -objscope causes the target to be evaluated in the scope of the object,
  • -methodprefix string inserts the specified prefix in front of the second argument of the invocation,
  • -default is used for default method names (only in connection with %1)
  • -earlybinding: look up the function pointer of the called Tcl command at definition time of the forwarder instead of invocation time. This option should only be used for calling C-implemented Tcl commands, no procs etc.);
  • -verbose
  • : print the substituted command to stderr before executing
See tutorial for detailed examples. } return "empty" } @ Class instproc instinvar { invariantList "Body of invariants for the class" } { Description { Specify invariants for the class. These are inherited by sub-classes. The invariants must hold for all instances. All assertions are a list of ordinary Tcl conditions. } return "empty string" } @ Class instproc instmixin { ?args? "instmixin specification" } { Description { If <@tt>$args is one argument, it specifies a list of instmixins to be set. Every instmixin must be a defined class. If <@tt>$args has more argument, the first one specifies the action. Possible values are <@tt>assign, <@tt>get, <@tt>add or <@tt>delete, it modifies the current settings as indicated. For more details, check the tutorial. } return "if <@tt>$args empty return current instmixins, otherwise empty" } @ Class instproc instparametercmd { name "variable to be provided with getter/setter method" } { description { Add a getter/setter command for an instance variable with the specified name. This method is used for example by the <@A href="#Class-parameter">parameter method. Example: <@br> <@pre class='code'> Class C C instparametercmd x C c1 -x 100 puts [c1 x] } return "empty string" } @ Class instproc instproc { name "instance method name" ?non-pos-args?" "optional non-positional arguments" args "instance method arguments" body "instance method body" "?preAssertion?" "optional assertions that must hold before the proc executes" "?postAssertion?" "optional assertions that must hold after the proc executes" } { Description { Specify an instance method in the same style as Tcl specifies procs. <@br> Optionally assertions may be given by two additional arguments. Therefore, to specify only post-assertions an empty pre-assertion list must be given. All assertions are a list of ordinary Tcl conditions. <@br> When instproc is called with an empty argument list and an empty body, the specified instproc is deleted. } return "empty string" } @ Class instproc new { "?-childof obj? ?args?" "args passed to create" } { description { Convenience method to create an autonamed object. E.g.: <@pre class='code'> HTTP new creates ::xotcl::__#0, a subsequent call creates ::xotcl::__#1, ...<@br> If <@tt>-childof obj is specified, the new object is created as a child of the specified object. } return "new object name" } @ Class instproc parameter { parameterList "list of parameter definitions" } { description { Specify parameters automatically created for each instance. Parameters denote instance variables which are available on each class instance and that have a getter/setter method with their own name. Parameters are specified in a parameter list of the form {p1 p2 ... pn}. p1 ... pn may either be parameter names or definitions of the form {parameterName defaultValue}. If a default value is given, that parameter is created during creation process of the instance object, otherwise only the getter/setter method is created (and the parameter does not exist). The getter/setter method has the same name as the parameter. It gets and returns the parameter, if no argument is specified. With one argument, the parameter is set to the argument value. <@br> Example: <@pre class='code'> Class Car -parameter {{doors 4} color} Car herby -doors 2 -color green <@/pre> } return "empty string" } @ Class instproc parameterclass { class "parameter class name" } { description { Set the parameter class. The parameter class specifies how parameters are stored and maintained internally. Per default, a method "default" is called, to set the parameter with a default value. I.e., <@pre class='code'> Class Car -parameter { {doors 4} }<@/pre> is a short form for <@pre class='code'> Class Car -parameter { {doors -default 4} }<@/pre> For specialized parameter classes other methods can be called, e.g.<@br> <@pre class='code'> {doors -default 3 -updateWidget car}<@/pre> } return "empty string" } @ Class instproc recreate { obj "obj to be recreated" ?args? "arbitrary arguments" } { description { Methods called upon recreation of an object. Recreate is called, when an object/class is created, but a same-named object/class exists already. "recreate" is not called, when an object is trying to be recreated as a class or vice versa. In these cases, recreating is realized via destroy+create. The Methods "recreate" performs standard object initialization, per default. May be overloaded/-written. It calls another method cleanup which handles actual cleanup of the object during next. That means, if you overload recreate, in the pre-part the object still contains its old state, after next it is cleaned up. } return "obj name" } @ Class instproc superclass { classList "?list of classes?" } { description { Specify super-classes for a class. "superclass" changes the list of superclasses dynamically to <@tt>classList. The method returns the current value of superclass, when it is called without arguments. } return "if <@tt>classList is not specified return superclass(es), otherwise empty" } @ Class instproc unknown { ?args? "arbitrary arguments" } { description { Standard unknown mechanism. This mechanism is always triggered when XOTcl does not know a method called on an object. Supposed that there is no method with the called name, XOTcl looks up the method "unknown" (which is found on the Class Object) and executes it. The standard unknown-mechanism of XOTcl calls create with all arguments stepping one step to the right; in the general case: <@pre class='code'> ClassName create ClassName ?args?<@/pre> Unknown can be overloaded in user-defined subclasses of class. } return "Standard unknown mechanism returns result of create" } @ Object instproc volatile { "" "" } { description { This method is used to specify that the object should be deleted automatically, when the current Tcl-proc/object-proc/instproc is left. Example: <@pre class='code'> set x [Object new -volatile] } return "empty string" } @ Class proc __unknown { "name" "name of class to be created" } { description { This method is called, whenever XOTcl references a class, which is not defined yet. In the following example: <@tt>Class C -superclass D D is not defined. Therefore <@tt>Class __unknown D is called. This callback can be used to perform auto-loading of classes. After this call, XOTcl tries again to resolve D. If it succeeds, XOTcl will continue; otherwise, an error is generated. <@p> This method is called on mixin/instmixin definition calls, istype, ismixin, class, superclass and parameterclass } return "empty string" } @ Class ::xotcl::Slot -superclass Object { description { A slot is a meta-object that manages property-changes of objects. A property is either an attribute or a role of an relation (e.g. in system slots). The predefined system slots are class, superclass, mixin, instmixin, filter, instfilter. These slots appear as methods of Object or Class.

The slots provide a common query and setting interface. Every multivalued slot provides e.g. a method add to add a value to the list of values, and a method delete which removes it. See for example the documentation of the slot mixin.

Parameters:

-name Name of the slot to access from an object the slot
-domain domain (object or class) of a slot on which it can be used
-multivalued boolean value for specifying single or multiple values (lists)
-defaultmethods list of two elements for specifying which methods are called per default, when no slot method is explicitly specified
-manager the manager object of the slot (per default [self])
-per-object specify whether a slot should be used per class or per object; note that there is a restricted usage if applied per class, since defaults etc, work per initialization

For more details, consult the tutorial.

} } @ Class Attribute -superclass ::xotcl::Slot { description { Attribute slots are used to manage the setting and querying of instance variables. Parameters:

-default specify a default value
-type specify the type of a slot
-initcmd specify a Tcl command to be executed when the value of the associated variable is read the first time; allows lazy initialization
-valuecmd specify a Tcl command to be executed whenever the variable is read
-valuechangedcmd specify a Tcl command to be executed whenever the variable is changed

Example of a class definition with three attribute slots:

<@pre CLASS="code"> <@tt>Class
Person -slots { Attribute name Attribute salary -default 0 Attribute projects -default {} -multivalued true } Person p1 -name "John Doe"

The slot parameters default, initcmd and valuecmd have to be used mutually exclusively. For more details, consult the tutorial.

} } #Class::Parameter instproc values {param args} #proc xotcl_mkindex #proc xotcl_load ./xotcl-1.6.8/doc/._logo-100.jpg000644 000765 000024 00000000430 12161600406 016533 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/logo-100.jpg000644 000765 000024 00000003252 12161600406 016323 0ustar00neumannstaff000000 000000 ÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ*f"ÿÄÿÄ7!1A"Qqa#2b¡²Ñ$B‘ÁDrt±ðÿÄÿÄ#!1Qa2A¡ÿÚ ?ÇŒž\dõ©Hˆ»&m§ ŒÓ…—|%¬wú¬»@!Ì#¨QͳŸ—j‡jšV®R-6Ïc À” nôÍ%W-±‘ “´¨éacopÒ,Šø«Œû{•¾ƒssmñB1m'~z{Õ¾¸[ŒÚÞ[‹¸cÆÄs…^g÷?Þ´+›ë ]!D6ÙGBžHÅQ*­òÄàBÌWi’ªµ³Ha‚«zV™>¢eH·1T.p:zUéL×òmÎÝØ¡Ål:m…¬t f¤C°'©Ïsó¬ÓÐ-b ØDîTLr{yàw!½NÃÇyÖ(÷nÁÀ­Zó…`ÔÎÑ㸱á¦ðµ´ñܫڥIe “ìk[Háºaîí3õK±¦4›D˜8'ð«6ZŽ=·E˜çÈ䜊Ò[GµXeˆF»dmÃËÒ„êü3–,Öè¤ƒË ÍEci-MÄ=Àv2Η*Ín¡X¸ÛÇ[ÇËûPžµšÞV‰‰* €Ç¿|Q÷#5ëi.-PÌ“ sÔ noøíú–º½¸&"º´Ä©çýK]\š¶Í³¢¯¬Â-înõI‚Þ^LêÎ>Û“Ìú yƒ!»D{­ð]ªs?xþÔG°kxÕŒGzô t>ôfââþ[ibø‰†ô+͈¨i¨îï 6ûD©t-OKøBЗ¶‚M¾2òܧ¿ø4Å«k‹' Ú_Áoõ’«DÌ<«úëS‚Ñ­4ùíLïðÒƒ½ŽÑJ6‘DuhìÚv{?1œrcš-S&˜ ¯ Éo˪Ü#µÄîTö^|Ï¿*xáOZAá©‘£;¶Ð0O~ô2ÿQ–ÒÒ5”bRÄù*G¥v³rú»Ba³¶±Ž4¤ ·¯°¢VÊìe¨d:êÓ÷0UlàŸ^†øüqÞÚ%ÀŠkØÙÜ4Œ±ÿ¥:ª]x¶š”8o¼0}é$ÙÉàíITMÔ’¹_Ƨa’Ù£¼…‰,—8Á#üPU½ˆoÓ ­hJçˆûµl²ˆ.]‡"èF3úùÔ¯µ>ÇXÒ¬ž \ê&Ù## ´Ï×9¥hôÈ-PÉzÞ$¯öcÒ=‡,Òî¯Ä×wØÃd¦$Hš7È Y\ŒžŸdtªÕ}„dñæA•3´Ö|K˜øq.Næ5æd€çž3ò¤µžéÆ|g«é–ï#¾} z=²8ÌÔ¸Q⤈½D·ÞZê[ú>7-Ä7 <¬ßÊ·S÷’º¸o<½X¯­bŠ#Y†G^ÕêÚÆž¬ÊgŒàdó ºÔ1%Âí>Ê(}Ê&%ò¯OJŸÌ³ˆ;+%ÄÜH—(¶6l_”’c·¥V¼_ðlᘈIu˜wnôTM í\ûUQÔûÔšçbIŒ =è¼M§ÜiqÛj8øˆ—ä@À‘Ò‰C©ØMâYd%p+fiטÏáU4mAdâ[˽ÉoQ-'¤ÛÕŽJä|†{â–¶+H7(8é‘QñÖmÖîÑ6áÎ3´þT;Ò; Š 6aûî-‡FÔ †§¥\Z\*‚ÈY[h##˜ùb¾/é¯.Óo"·,+ Iú۵Ƥ$™ŒŽcPYÎIÇÌÑD&âxdœ™\B3ùˆ É«U¾`4¤Õ~Žuë{þ"¸Š8]mŽÜŸ½u ú-q5Æú'ýi]A¬g91*€0'ÿÙ./xotcl-1.6.8/doc/._next-path-mixin-movement.gif000644 000765 000024 00000000430 12161600406 022144 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/next-path-mixin-movement.gif000644 000765 000024 00000005411 12161600406 021733 0ustar00neumannstaff000000 000000 GIF87a3»÷ˆˆˆðððøøøßX‹F@X€Fòÿ¿°¥Tˆ@<Ð0MNM›,ÿòñÿÿ@¿¿L «ñÿ@¿Ü¤ßv&‹ @@tXXóFFÿ¿ X°óFT”Ä4 TM@t^ócMÿ¿Ü°vTÛX~vF• @°"òÿ¿L «@¤X&F ä¼tÏòMÿ@¿¥hˆñÿ@¿€fLl\X~F•@¤"& HX óFÿ¿ÔÛòÿ@¿ø¥|KˆM@€HhLMñÿ¿\T˜òlÿ¿¤X&F @€¤ƒL& @@tX°6X" FøÄKT€ Lc°óÿ¿UX4EFüt]óñ ÿÿ¿¿¥Zˆs@$||ôMuÿ„€òÿàLj¤„ó&ñÿ ÿ¿@¿[XaFg X0ôFs$ÄÐôTöÿÿ¿¿„€ôÿX›F|;°4„TÄ€N¤Ð&ö ÿNИöRôóÿ¿)nHO°T#àÐòöÿÿ¿¿|Õüó¸@@>¤H&óOÿ °@TäHÏóÀËìßX‹F,3»þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H XÊ´©Ó§P£JJõiÒ«XÀµ«×¯`ÊK¶¬WYÓªUj¶­Û·pÑ®‹u+Ü»xñÊ¥Ëרݼ€‹ÝÛ·pп‚ &l¸1OÄ™rE YñWÆŽ3߬¬wòV΃cÖLZ&è·”HV­z©çÕ‘K˦yÚmêϯ]§^<»7ÌÚm]·fmWøäãÀÍŽöͼdrå«£·.®[tóë(Ÿ/¶}úë½;«-‰•úÐÃ嶺(½žŠÌ-²*÷E2T7<‘Ì ½lòÉ-jLqˬںàÌ4KtB3^lfÅ+ûü³ÐæY h0˜?†\OEßû ƒsœíu‡‚gáúX .&>#Ì ä>(£g:Ã!T^ÃCáüe‡þä‘a³£BVG*<4"nº 1†L4ŽdšXÄäp@áŒn–XœéHG‡]ì" wXÂï¡0Š9,!}Hœ/"‡‰odá`ÎØ™êx1ŒeäMàhÂQK#q*(F1¢Qޤ£™F5ò,‚üaks?½LÑ‚4¤K‡«ï=²‰¹™$ E "ò‰¡á¢©3Ê$rÑ‹8Œå]˜6*§œà¦hE(^0‰¤¥b4A—ñr“Cµò¹|š­(ÿDhAsP¢$Ô¡ ÍbCýÑŸ<”¢S¨=5ŠO†f¢iG%úQŒŽÔ¢õÉ@íÅÑ~4¤&ËJrÑ—žT¥µ©K=zÓžÌÔa jKÚÒŸ-¥>Í)OwJÒž>ÆeðT§ô¢ ½©R•yj¼PŠÐ­‚ŽNC§_Ü%;°’F5ˆW¿Ú¨µrè¬:UÚîüéÖÉnX*=ïzŹƎC|½J^Z¡Ç¤<|ÒaÏ“X˜²”S­šcX½Ís²Á™Z#;2ÌR‰Y•õÚeGf2¨U¯d«YÇöN«ä ´¡EþÜhY¯lÅK[^eÎ<±9K³Zl¢8ÚÔ– µ«íí}Š [Ôìµ6®ÏbôÙpŶR­€[SÌrKº¦¢Ow1¢]¤^×%¥éTqËZ. Œ¹¬eiE£k«ôv6b½5î>†Ûþu³¡o«¸ù3üìÀÿB˜‚™j/Þìµ·Eî€í«Ú`9GTý…n†;&1#ŠÀ`KR{‘‹_}­ÖgVÑy^C­ø*-~ñ‰ÔÔ\gN$îµ±l³ƒcÄIÊlŒäžù¸7E6²Öà3ä§xHÖ=2Kž e)oé»WÅ•EÊ·›¦É[pƒÀ,!*S²8 sõØÌ 1§YÍLrE¤Kæ ÖÂ!9”—á\ºÙ’wÏÑZTíÜ£ðà+Ï|nj û¯D“ÏÏÁm4£1æhѲ™³‹žô>+½f9ÿ5®±-®›ÉÇc½†ÖÄ C3©ÅåëB÷f7³^’c<èSµ¶¶ÕŸà˜œå罸Ä>.\«E¼;¶Õœ–ÔÞ ·k»þúÌ)³½×SWŦ®ìˆo.Ú9 5;}+=rS¶ÇÈ÷m][=M *ÛÉqLãíyÓ{l ¾7¾¹ªïÂ*ºß›ùé·N›jܰ½ÖÏÁÎð†;üá¸Ä'NñŠ[üâÏ8;./xotcl-1.6.8/doc/._next-path.gif000644 000765 000024 00000000430 12161600406 017172 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/next-path.gif000644 000765 000024 00000006663 12161600406 016773 0ustar00neumannstaff000000 000000 GIF87aUB÷°´°øüø -@pažth.ögÿi¿fã'È?@¿d„DõÂóÿÿ¿@¿Â@Ä]¤ó ÿ¿4töôÿÿ¿¿dPõóÿÿ¿¿¸¸ÐÌó ÿ@¿ÿàþÿtÿ!ÿ@@¸Œ”Ìô¥ÿ¿d_Põóÿÿ@¤Œ¸„! @@lùôžÿÿ¿¿¸öžÿ¿¸tPôó ÿÿ@¿¿dô¶ô¶ÿ|óÿ¿Èü¤óÿ¿\„ôÿ¿¸ˆõó€õô$þÂôtÿ@¿@@À¤õ¥ÿÈþˆ¤tóÿ\¥¸¸ô ÿ Ȥž¬¸õžÿ ¿@:ˆ žóÿ@¿@¤žȤôÿ¿èõÿ¿É¼¸_ôÿ ¿@\¬ü5òÀÄKøüoó娕k÷m÷lwî“£þOϰúçÍÁ}§¯»»ûëŒÅ“ŸÐ|ßëë¿ggΞ5üÅòÑ' @öñ…_ú­çÝÿÝ6àƒ ¸×ï!ƒNá†e¨W{ËYˆà~úeg‡( àá‡àåWasÞýöZŠ®ž3Ò!ŽòžŽ;ÚÆ¢Ÿù D– ‘²!™dgÄ ¶$“r9ùdŽ•¥¢–Tªfå•?n)¥–Sv\h¦©æšh‰éf\ešÙUœ?9'™xÒ)§UzÒEÐcJY™{jÕ'O°Á©â–ƒ¾yh¡B=ªS”\.(¤|>%^Ÿ¸Å…©R’¶Z ‹~ZT¨8¡êЦ¥ªMþ¯Bk«+Í:“­áJkGºÂÔ+EŠîZÓ¯.K©Æ +«¦°2ª¬LÉÖšê³·2K-fÑŽéµ'e›’·ÊíHàvi¥ãÎf-P¤¦ûQ¹&Á®³îr$/I÷Î[/¯ëî{f¿þ~•¯H›'¬0ºëXpÃ5Ç0Ä‘é&.FS\ÑÃDyŠ1ǘ‚¼-hxfé)—yм§Êì¢Ë*Êch'ËrÒܲÉ2; s¥k<‘Í>¹<³˜ í3Æ¥Ž3½&ó ´‘—=}3£K/MõÑ?w¨ôÐDçLoÏX+ÔiØûF'5ÙcÉw6Ú7´6Û[•ùvL‚ÂM0u¢yl·þGœfvñÞönì÷ܦ.¬÷\`~·ÅL+¾šÄ‰;þ®t„»[¹ämcžîåšsÅyçá.ú褗~8èÇíè«ÁŸ#êkë^Á>i±‘?+»¨š±®:êÝ>-ïHI¶éÄ‹®YñÈ—.à—`¨YóÐæ{dÑW_0óÕŸHöÙYl÷àw·|øW^O~÷Óßz~’æ¯}úк/dûòƒ ?Ýõ×Fþì?ZõÛßod àd(-îQ’ÿœ##÷ °BÉAŒÀã™ûù J’Ùε¢VðyxÁÐù“ ÉD!âÏH ‚%Œ!‰ ¥–¨.ÊO{Ô#"~'‡þ#â‡hBp‡>$ ƒ¾BÊPA ¢Èü¸‡þ!âJ„Ä'úp86L §£ QŒ/º"¤ÅøDñˆ$‘#À ÅñŽpôâ õhGïÍG‚o좿ˆ%–øG…x¤"´ÇE&’Ûà WHÃ9&'ŒT̤&W(Ç)6ñ‡û¡¤ÛÈ¿BÖj}–l ™XʲÒz„|Ò*[½bze´)[Ÿ[òR‘ü%_)ÌÓ처Ðñ%2µ÷Çe†‰–Î4æö’GÍ4¯šØdÓò¦­Lm›ßºÊ, N”ŒÓ çìfS®'Îé°Ê)ìôfÞ³UƳ*éþä²PVNsÉ35—²S?ãÕÎØì3K}Ü?ó–§?%_e(² ÏÜ-2 e˜=-ŠO/E-Q%WD§µ’®“£Tɧ9Cº¸Ž~³¢Å©ÒX•qµCÈFczÑØÕM";¥¥Lc禬ÁT¨=õ\N#DSu%5+ÁVS'÷TC…*¨ä¬*T?–Í®¦åš^ +[fÓòx¹ËéR‡V¶*We­ØQ’µTs–ì¬TZkÈõÓ×µ ¯Pëë¶øÊ±€ò-¯ìÝôú­†ò‹IŒÝ+¾b–»¨î²‚Ù¨ {×Çv®U(-{ضÕ¤Q¹k]—eZÖ¢*‘ÕþWkÝÆT©d+®”³”:—‚[‰Ñ¶[.ìmnäf×û w·A¡“·þ ZÅö&}‹e?†T­¶ZR•®ª,»Rç^ntÝÍÚ;¥•¢¿!en‘ílVË{ݼ´è„å–”YW¹n¼¿ƒœçZ¶¶ãþiºgñZÊâ¶;ŸÖshVk/¨ <'s-À^3ƒ•š³¯F8±´kX‡jÕ 'ªh‡ÒU-åWVÿâŒjp}Å–´ÝDÓyZÅçƒOÆ5 [ʼ¹zñ]j&ünLÇtä0˜{ _2Æåmq‘,=!“•ÉM~Dm·ZÞœ±Aj´¢õG7ºRë b›Ð•[8"17Ð5±ê,þ„«öÜ´R™Èõù"CùȽ1…,ìN)(¾ÐØÃ*ž2·êË39sð=yó ë\Iàì&Å:± Éú'+Žq†‹¥–c$HE‡ðц0ÓŒ7Š‘,„Xd7˜ê<ÎùB F1:%-Ò°¡Žá¾(ÄNÇ2ÍV-‚[z4+ß¹“$B6F`«8Á­5ÖŒÝê=WÏ7Ô`• k$×kÄt2ë lq ܨ4·¿Ð}¾Ü~Lé»ám u—Þõö¶å4¼a}‹Ôîµ÷¿Û¬XySúdSµï¹¥äû;dûèQ þíŒÞtâS1ñ©‹ÕŒëNo·-ëþÔœðS­¾!OmÙ~J²’wìÛ6nxRÜ]qc\ä¶v9Y†§ó‚û,å°åùÍUžó¡½è'}8fãôž[wÅ:u:»”5ÝUI]²»"8E“ÎãVá¸<üöªÀóz6;u¶¥Ù}+<´§}›nw-Üãnõ¶Óý·j¿ûªÂÎw±ÒjíTÕ»Nî7Á3ð¥5ü¬ïYÅŸXuŒ á1ZÇÇ<·[wüä 36ËÛ=¾žimCïN¼“žqu?}“Þ®zÉ•î‘?mvã¾ùŽö±¬çkÿ˜Ücê¥?½ÖW/|™“Ç÷”ØlyùÖ2}Ǧw¿FãPçžÝäCþ£ÿþ,ëH÷ßb/ #í´×§üC?ŠEm´c¥ý£T¿zeV~ >Vðÿ´ü)+ì ãíþÔ“}ötÏ6c'+UÇ[8€l3|ìâF™†FŸT>Š3K+‚Bg6$ØzøÓ# E›TfœVf;Ö9¾sÄmýaBš–Jég‚ ø€=B!4”j¾ÖK¨s)ÉtiEgT‚ Ã]t¹Öl‰TmAÖVØÂ±lŒvƒ0¦wèb˜gc¤‚Ê&„´÷&(€Ú'0ðuA †j6DH0 (ˆ3iø.kh†ƒƒ7Å|Ø>rP2†ëWq؆XTƒg‹â‚F–‡¢ÓÔ(i}bˆ36U¸:ŽX]LˆYwu“8{•˜‰ëµ‰œˆ\÷‰á剢èO\WŠ¢EЍ8i¼µŠet®Øx­‹Ò¦Š´x¶x‹²Šº˜x¹Ø‹²õ‹À<§8ŒÁ8‹ÆxY°˜Œæ‡ŒÌHŒÂøŒ²WŒÒ,ŒHMÕ˜Ú¸ÜØÞøàŽâ8ŽäXŽæxŽè˜Žê¸ŽìØŽîøŽð@;./xotcl-1.6.8/doc/._obj_class_system.gif000644 000765 000024 00000000430 12161600406 020625 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/obj_class_system.gif000644 000765 000024 00000005350 12161600406 020416 0ustar00neumannstaff000000 000000 GIF87aÓ÷ˆˆˆðððøøøßX‹F@X€Fòÿ¿°¥Tˆ@<È0MNM›,ÿòñÿÿ@¿¿L «ñÿ@¿Ü¤ßv&‹ @@tXXóFFÿ¿ X°óFT”Ä4 TM@tjócMÿ¿Ü°vTÛX~vF• @°nòÿ¿L «@¤Xk&F ä¼€ÏòMÿ@¿¥hˆñÿ@¿€fLl\X~F•@¤n& HX óFÿ¿ÔkÛòÿ@¿ø¥ˆKˆM@€HhLMñÿ¿\T˜òlÿ¿¤X&F @€¤ƒL& @@tX°6Xn FøÄKT€lLc°óÿ¿UXmEFüt]óñ ÿÿ¿¿¥Zˆs@$||ôMuÿ„€ò/ÿìLj¤„ó&ñÿ ÿ¿@¿[XaFg X0ôFs$ÄÐôTöÿÿ¿¿„€ô/ÿX›F|;°m„T¼€N/¤Ð&ö ÿNИöRôóÿ¿)n@O°T#àÐòöÿÿ¿¿|Õüó¸@@6¤H &óOÿ °@TäHÏóÀËìßX‹F,ÓþH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£JJµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊK·®Ý» àŨw¯ß¦}ÿN ,¸pQ†"N ˜%áÅ7!;¶ø¨dž/'Öœ ñ¾Ä7®»8rÝÊŸìrºðãËOCw®ýzôì-}þ«œþ}»yëäáVœ=ûöÊãƒ?=¾vú×át=~÷ݹ‡œ|óѧž€÷qg]ùgŸyÆýç ÛÉ!€õi5á}Úg¡…™íÇa[!>ç቙1¸UsØa÷^r·‹vx^zYÑØ"xäõÈ!tå©xUÍx#Œ…–$CB¾Õä’PF)å”TViåW.˜å–ãq‰¡—`†ô$]c†iæ—[–y¦™jÆÕæš^¾é$œtò¦œuæ©çž|öé矀*è „j衈&:莌âI‘£b6Úbd¼IêbØ  é¦œvÚé¥Õù”©§¤z*#Lòu\©¬n j•þĵ*ë¬À˜Rªƒ G뮦ڊ®ÅÊë°šúºYlÄ&ËjbÖ¤«²ÐrŠ#IÀ2 \´ØÖ:­]Ïfëm±ÛvT-BÝ~›-³âÆt­¹ß†ëÖºìÆ n³Õ ï½Hz4.söÞË®»h!ëïÀùj´ïwû 0n+ œ°¼÷§o¿qEã:\±ÂcV ïÆ_,Ô“ƒlñP%›ŒïÁ|©\1Ë ™²Ë E1Í ‹ÙÍ8¯Œr‘Ò» Ï=ŸŒÑEãÛÓÌIÇ«³M>ÈdÓ&?]/Õ[]ÖYÿu}"#ÍuÍP 2Ì¥‰mö¿hç–zBŸ¶öÙå5w×uë{7þÞT©½÷¿µé÷ßíæ3á/OÅ4â€Vã·VæàŸ«“¥Vžxn¥=ªyÎÁ’KÑçç$å¤GËZç§N°ãÙ†ºëÄjÝ0Æ´sì™è­ç1ç±æ;ÄPêùðNÏ$¿Ýé¸íìÈï €òË¿H £ûEŸ<ÔÇko®Õ!^(õ‰ìyÏvCáøŸúÆ™ßnm‹Ø»ûÞN;†)v(7ýõS¾ø2Qùøw.ÿ©KxÄÖô ¸#½ IÐK`©¦‡çao€TÖw3¿³­+‚.£`jh¯›0gð MÑL¸6΄6'T«Šõ· ŽH\!œa­xChQPyþ¶ë yˆ3Pˆ9#U³ø¡«eUûÔiµ8|51nYbý¤§E6ñ…HLb¯®Õ¢žaRÏì¥+6 LXUC£W¥Æ7’Q[ý‚£¯(É©Q‰:¤XèÄùÈìÒš¢ïhÆB>/‹ˆÜañˆ¬Að‹G VM¥Cm«‘_œÖ!7ùÉIjŒ…Uk¢#µųÍД¨¤! ù˜ÉÏÔ‘Œ±*ciÕÔh–fc4?º`*î™Ó<â+§ëg… XOTcl - Tutorial

XOTcl - Tutorial - Index

Version: 1.6.4

Introduction

 
Language Overview

XOTcl [Neumann and Zdun 2000a] is an extension to the object-oriented scripting language OTcl [Wetherall and Lindblad 1995] which itself extends Tcl [Ousterhout 1990] (Tool Command Language) with object-orientation. XOTcl is a value-added replacement for OTcl and does not require OTcl to compile.

XOTcl runs in the tclsh and provides a few extension commands. These are offered in a Tcl namespace ::xotcl, and can be imported into the current namespace to reduce typing and improve readability. All Tcl commands remain available (and are also applicable on the extension constructs).

A central property of Tcl is, that it uses strings solely for the representation of data. Internally it uses an dynamic type system with automatic conversion (which enables efficient type handling). For that reason all components (e.g. written in C) once integrated in Tcl automatically fit together and the components can be reused in unpredicted situations without change. The evolving component frameworks provide a high degree of code reuse, rapid application development, and ease of use. The application developer may concentrate on the application task solely, rather than investing efforts in fitting components together. Therefore, in certain applications scripting languages like Tcl are very useful for a fast and high-quality development of software (see [Ousterhout 1998] for more details).

Tcl is equipped with appropriate functionalities for the easy gluing of components, like dynamic typing, dynamic extensibility, and read/write introspection. OTcl is an object-oriented extension to Tcl, which encourages a Tcl-like programming style and is composed of language constructs with properties similar to Tcl. It offers an object-orientation with encapsulation of data and operation without protection mechanisms and single and multiple inheritance. Furthermore it enables to change the relationships dynamically, offers read/write introspection, has a three level class system based on meta-classes and offers method chaining. These abilities are integrated in XOTcl with only slight changes to OTcl visible to the programmer.

Extended Object Tcl aims at complexity and adaptability issues that may occur in context of large (object-oriented) software structures and in the context of component glueing. In particular we added the following support:

  • Filters as a means of abstractions over method invocations to implement large program structures, like design patterns.

  • Mixin Classes, as a means to give an object or a classes' instances access to several different supplemental classes, which may be changed dynamically.

  • Dynamic Object Aggregations, to provide dynamic aggregations through nested namespaces.

  • Nested Classes, to reduce the interference of independently developed program structures.

  • Assertions, to reduce the interface and the reliability problems caused by dynamic typing and, therefore, to ease the combination of components.

  • Forwarders, to delegate calls efficiently to other objects or classes.

  • Slots, to manage values of instance variables with a common interface.

  • Meta-data and Automatic Documentation, to enhance self-documentation of objects and classes.


  

Figure 1: Language Extensions of XOTcl

 
Introductory Overview Example: Stack

To give you an impression of the language before we go into the details of the extended language constructs, we present in this section a simple, classical example, familiar to many from introductory programming courses: the Stack example. In the later section, we will present the soccer club example, which focuses more on the dynamic features of the Extended Object Tcl.

In a first step, we define a class Stack. A new class is defined in XOTcl via the command Class create yourclass. The stack will have a constructor (in XOTcl, the method init) and the methods push and pop. Methods which are inherited to objects are defined via instproc. In the following example, all predefined commands (some from Tcl, some from XOTcl) are emphasized.

#
# Create a stack class 
#
Class create Stack 

Stack instproc init {} {
  # Constructor
  my instvar things
  set things ""
}

Stack instproc push {thing} {
  my instvar things
  set things [concat [list $thing] $things]
  return $thing
}
  
Stack instproc pop {} {
  my instvar things
  set top [lindex $things 0]
  set things [lrange $things 1 end]
  return $top
}

The definition of the class Stack is typically saved in a file (say stack.xotcl) and can be used e.g. in an interactive Tcl shell (tclsh) as follows. The percent sign indicates the prompt of the Tcl shell, the reminder of the line is typed in, the result of the command is shown in the line below. Comments are lines starting with a hash symbol #.

% package require XOTcl
% namespace import xotcl::*
% source stack.xotcl
  
# Create Object s1 of class Stack
% Stack create s1
::s1
% s1 push a
a
% s1 push b
b
% s1 push c
c
% s1 pop
c
% s1 pop
b
# Delete object s1
s1 destroy

In the session above, we load XOTcl into the current shell, import the names from the xotcl namespace and we load the file stack.xotcl. At this time, the class Stack is available in the scripting session. In the next step, we create an stack object named s1 and push into the stack the values a, b and c via separate push calls. Then we pop values from the stack and we destroy finally the stack s1.

 
Object specific methods

This definition is pretty similar to stack definitions in many other object oriented languages. The example below shows how to define purely object specific behavior. This way we can define an object stack without the need of a class Stack. Notice that the methods of the object stack are defined via proc and not via instproc in the example of the class Stack.

#
# Create an object named stack
#
Object create stack

stack set things ""

stack proc push {thing} {
  my instvar things
  set things [concat [list $thing] $things]
  return $thing
}
  
stack proc pop {} {
  my instvar things
  set top [lindex $things 0]
  set things [lrange $things 1 end]
  return $top
}

The object stack can be used in exactly the same way as s1 (the instance of class Stack) before.

 
Refining the behavior of objects and classes

So far, the definition of stacks were pretty minimal. Suppose, we want to define safe stacks, that check e.g. for stack underruns (more pop the push operations are issued). Checking safety can be done mostly independent from the implementation details of the stack (usage of internal data structures). With XOTcl, one can define stack-safety as a separate class using methods with the same names as the implementations before, and "mix" this behavior later into classes or objects. The implementation of Safety uses a counter to check for stack underruns.

#
# Create a safety class 
#
Class create Safety
Safety instproc init {} {
  my set count 0
  next
}
Safety instproc push {thing} {
  my incr count
  next
}
  
Safety instproc pop {} {
  if {[my set count] == 0} then { error "Stack empty!" }
  my incr count -1
  next
}

When we load the classes Stack and Safety into the same script, we can define e.g. a certain stack s2 as a safe stack, while all other stacks might be still "unsafe". This can be achieved via the option -mixin during object creation.

% Stack create s2 -mixin Safety
::s2
% s2 push a
a
% s2 pop
a
% s2 pop
Stack empty!
Note that the definition of Saftey can be used not only for instances of the class Stack, but for arbitrary objects supporting the same interface. Therefore we could as well make the stack object stack (that we created before) safe at any time by adding the safety at arbitrary times with the method mixin, and we can remove the safety as well at any time.
# Add Safety to the object stack
% stack mixin Safety
...
% stack push a
...
# remove Safety
% stack mixin {}
We can as well use Saftey to create a new class SafeStack. In this case, all instances of SafeStack have the safety property defined above.
#
# Create a safe stack class by using Stack and mixin 
# Safety 
#
Class create SafeStack -superclass Stack -instmixin Safety

SafeStack create s3

 
Stack of integers

The definition of Stack is generic and allows all kind of elements to be stacked. Suppose, we want to use the generic stack definition, but a certain stack (say, s4) should allow only stacking of integers. This behavior can be achieved by defining an object specific method for the stack s4 that checks the values to be pushed. In case the pushed value is ok, the push definition of Stack is called via next.

# 
# Create a stack with a object-specific method 
# to check the type of entries 
#
# s4 is a stack of integer 
 
Stack create s4
s4 proc  push {value} {
   if  {![ string is integer $value]} {
     error "value $value is not an integer"
  }
   next
}

 
Class specifc methods

In extended object Tcl, classes are objects as well (objects with different properties). We will come to this later in more detail. However, we can define as well methods of classes, which are not inherited to the instances, by defining class-specific methods using proc. This happens exactly like defining objects specific methods as shown before. In the following example, we will define a class-specific method available_stacks that returns the number of the currently existing stack instances.

Class create Stack
# ...
Stack proc available_stacks {} {
   return [llength [my info instances]]
}

Stack create s1
Stack create s2

puts [Stack available_stacks]

 
Introductory Overview Example: Soccer Club

In our second example, we will focus on an application example where one can benefit substantially from the dynamic language constructs of XOTcl, the soccer club example (the full code can be found in the xotcl/src/scripts/soccerClub.xotcl file. All the persons and characters in this example are fictitious, and any resemblance to actual persons, living or deceased, is coincidental.

Before we start, we introduce an instrument for making the documentation of programs more easy. In order to document source code files, we can use the @ object, which is used generally to provide any kind of information, meta-data, and documentation on a running program. Here, we just give a file description. Then the makeDoc.xotcl tool can automatically document the program file later for us.

  @ @File {
    description {
      This is a simple introductory example for the language XOTcl. 
      It demonstrates the basic language constructs on the example of
      a soccer club.
    }
  }

All things and entities in XOTcl are objects. A special kind of objects are classes. Classes define common properties for other objects. For a soccer club, we firstly require a common class for all kinds of members.

Common to all members is that they have a name. Common properties defined across all instances of a class are called 'parameter' in XOTcl. In this example the instance variable name will be initialized by default with an empty string.

  Class ClubMember -parameter {{name ""}}

A special club member is a Player. Derived classes can be build with inheritance (specified through superclass). Players may have a playerRole (defaults to NONE).

  Class Player -superclass ClubMember -parameter {{playerRole NONE}}

Other club member types are trainers, player-trainers, and presidents:

  Class Trainer -superclass ClubMember
  Class President -superclass ClubMember

The PlayerTrainer uses multiple inheritances by being both a player and a trainer:

  Class PlayerTrainer -superclass {Player Trainer}

Now we define the SoccerTeam class:

  Class SoccerTeam -parameter {name location type}

We may add a player. This is done by a method. Instance methods are in XOTcl defined with instproc. All club members are aggregated in the team (denoted by :: namespace syntax).

  SoccerTeam instproc newPlayer args {
    # we create a new player who is part of the soccer team
    # "eval" is needed to pass the provided arguments to the call of new
    eval Player new -childof [self] $args
  }

A player can be transfered to another team. The player object does not change internally (e.g. the playerRole stays the same). Therefore we move it to the destination team.

  SoccerTeam instproc transferPlayer {playername destinationTeam} {
    # We use the aggregation introspection option children in order
    # to get all club members
    foreach player [my info children] {
      # But we only remove matching playernames of type "Player". We do
      # not want to remove another club member type who has the same
      # name.
      if {[$player istype Player] && [$player name] == $playername} {
        # We simply 'move' the player object to the destination team.
        # Again we use a unique autoname in the new scope
        $player move [set destinationTeam]::[$destinationTeam autoname player%02d]
      }
    }
  }

Finally we define two convenience to print the members/players to the stdout with puts.

  SoccerTeam instproc printMembers {} {
    puts "Members of [my name]:"
    foreach m [my info children] {puts "  [$m name]"}
  }
  SoccerTeam instproc printPlayers {} {
    puts "Players of [my name]:"
    foreach m [my info children] {
      if {[$m istype Player]} {puts "  [$m name]"}
    }
  }

Now let us build to example soccer team objects.

  SoccerTeam chelsea -name "Chelsea FC" -location "Chelsea"
  SoccerTeam bayernMunich -name "F.C. Bayern München" -location "Munich"

With addPlayer we can create new aggregated player objects

Let us start some years in the past, when "Franz Beckenbauer" was still a player.

  set fb [bayernMunich newPlayer -name "Franz Beckenbauer" \
    -playerRole PLAYER]

playerRole may not take any value. It may either be NONE, PLAYER, or GOALY ... such rules may be given as assertions (here: an instinvar gives an invariant covering all instances of a class). In XOTcl the rules are syntactically identical to if statements:

  Player instinvar {
      {[my playerRole] == "NONE" ||  
       [my playerRole] == "PLAYER" || 
       [my playerRole] == "GOALY"}
  }

If we break the invariant and turn assertions checking on, we should get an error message:

  $fb check all
  if {[catch {$fb set playerRole SINGER} errMsg]} {
    puts "CAUGHT EXCEPTION: playerRole has either to be NONE, PLAYER, or TRAINER"
    # turn assertion checking off again and reset to PLAYER
    $fb check {}
    $fb set playerRole PLAYER
  }

But soccer players may play quite different, orthogonal roles. E.g. Franz Beckenbauer was also a singer (a remarkably bad one). However, we can not simply add such orthogonal, extrinsic extensions with multiple inheritance or delegation. Otherwise we would have either to build a lot of unnecessary helper classes, like PlayerSinger, PlayerTrainerSinger, etc., or we would have to build such helper objects. This either leads to an unwanted combinatorial explosion of class or object number

Here we can use a per-object mixin, which is a language construct that expresses that a class is used as a role or as an extrinsic extension to an object.

First we just define the Singer class.

  Class Singer
  Singer instproc sing text {
    puts "[my name] sings: $text, lala."
  }

Now we register this class as a per-object mixin on the player object:

  $fb mixin Singer

And now Franz Beckenbauer is able to sing:

  $fb sing "lali"

But Franz Beckenbauer has already retired. When a player retires, we have an intrinsic change of the classification. He *is* not a player anymore. But still he has the same name, is club member, and is a singer (brrrrrr).

Before we perform the class change, we extend the Player class to support it. I.e. the playerRole is not valid after class change anymore (we unset the instance variable).

  Player instproc class args {
    my unset playerRole
    next
  }

Now we can re-class the player object to its new class (now Franz Beckenbauer is President of Bayern Munich.

  $fb class President
  # Check that the playerRole isn't there anymore.
  if {[catch {$fb set playerRole} errMsg]} {
    puts "CAUGHT EXCEPTION: The player role doesn't exist anymore \
         (as it should be after the class change)"
  }

But still Franz Beckenbauer can entertain us with what he believes is singing:

  $fb sing "lali"

Now we define some new players for Bayern Munich:

  bayernMunich newPlayer -name "Oliver Kahn" -playerRole GOALY
  bayernMunich newPlayer -name "Giovanne Elber" -playerRole PLAYER

If we enlist the players of Munich Franz Beckenbauer is not enlisted anymore:

  bayernMunich printPlayers

But as a president he still appears in the list of members:

  bayernMunich printMembers

Now consider an orthonogal extension of a transfer list. Every transfer in the system should be notified. But since the transfer list is orthogonal to SoccerTeams we do not want to interfere with the existing implementation at all. Moreover, the targeted kind of extension has also to work on all subclasses of SoccerTeam. Firstly, we just create the extension as an ordinary class:

  Class TransferObserver
  TransferObserver instproc transferPlayer {pname destinationTeam} {
    puts "Player '$pname' is transfered to Team '[$destinationTeam name]'"
    next
  }

Now we can apply the class as a per-class mixin, which functions exactly like a per-object mixin, but on all instances of a class and its subclasses. The next primitive ensures that the original method on SoccerTeam is called after notifying the transfer (with puts to stdout):

  SoccerTeam instmixin TransferObserver

If we perform a transfer of one of the players, he is moved to the new club and the transfer is reported to the stdout:

  bayernMunich transferPlayer "Giovanne Elber" chelsea

Finally we verify the transfer by printing the players:

  chelsea printPlayers
  bayernMunich printPlayers



Object and Class System

In XOTcl every object is associated with a class over the class relationship. Classes are special objects with the purpose of managing other objects. ``Managing'' means that a class controls the creation and destruction of its instances and that it contains a repository of methods (``instprocs'') accessible for the instances. Object-specific methods are called ``procs'', instance methods are called ``instprocs''.

The instance methods common to all objects are defined in the root class Object (predefined or user-defined). Since a class is a special (managing) kind of object it is managed itself by a special class called ``meta-class'' (which manages itself). Meta-Classes are used to define classes and to provides methods for these. Most classes are defined by the predefined meta-class Class. One interesting aspect of meta-classes is that by providing a constructor pre-configured classes can be derived. Meta-classes can be used to instantiate large program structures, like some design patterns (see [Neumann and Zdun 1999a] for more details), where the meta-class may holds the generic parts of the structures. Since a meta-class is an entity of the program, it is possible to collect these entities in pattern libraries for later reuse easily (more details about meta-classes are given in a later section).

XOTcl supports single and multiple inheritance. Classes are ordered by the relationship superclass in a directed acyclic graph. The root of the class hierarchy is the class Object. A single object can be instantiated directly from this class. An inherent problem of multiple inheritance is the problem of name resolution, when for example two super-classes contain an instance method with the same name. XOTcl provides an intuitive and unambiguous approach for name resolution by defining the precedence order along a linear ``next-path'' incorporating the class and mixin hierarchies, which is modeled after CLOS. A method can invoke explicitly the shadowed methods by the predefined command next. When this command is executed a shadowed method is ``mixed into'' the execution of the current method. Method chaining without explicit naming of the targeted method is very important for languages supporting a dynamic class system, because one cannot always predict which classes are currently participating in the inheritance hierarchy at design time (often necessary in inheritance models, like C++).

An important feature of all XOTcl objects is the read/write introspection. The reading introspection abilities of XOTcl are packed compactly into the info instance method which is available for objects and classes. All obtained information can be changed at run-time dynamically with immediate effect. Unlike languages with a static class concept, XOTcl supports dynamic class/superclass relationships. At any time the class graph may be changed entirely using the superclass method, or an object may change its class through the class method. This feature can be used for an implementation of a life-cycle or other intrinsic changes of object properties (in contrast to extrinsic properties e.g. modeled through roles and implemented through per-object and per-class mixins [Neumann and Zdun 1999c] ) . These changes can be achieved without loosing the object's identity, its inner state, and its per-object behavior (procs and per-object mixins).

  

Figure 2: Object and Class System

Basic Functionalities

 
Objects

Initially XOTcl offers two new commands: Object and Class. They represent hooks to the features of the language. This section discusses both of them in detail and shows how they function in the context of XOTcl. Note, that even if most of this is compatible to OTcl, a few changes occur. For this reason, this section is no introduction to plain OTcl. The Object command provides access to the Object class, which holds the common features of all objects, and allows us to define new objects. Objects are always instances of classes, therefore, objects defined with the Object command are (initially) instances of the Object class. But since they have no user-defined type, they may be referred to as singular objects. As all other objects they may be specialized by object-operations and -data.

The object command has the following syntax:

  Object objName ?args?

A command of this form is a short-cut for a message to the create instance method (forwarded automatically by the unknown mechanism, which is invoked every time the message dispatch system discovers an unknown message):

  Object create objName ?args?

It creates a new object of type Object with the name objName (in fact it invokes a create call on the Object class). objName becomes a new command, which allows us to access the created object. Similar to the Object command it may be used like a normal Tcl-command (using sub-commands to access the object's methods). Therefore, this form of access is called object-command approach. A simple example is an object which holds the information of a kitchen. It is created by:

  Object kitchen

An object creation calls the constructor init of the object's class. The destruction of an object is handled by the destroy instance method. The general syntax of destroy is:

  objName destroy

E.g. the kitchen object is destroyed by:

  kitchen destroy

To invoke a user-defined destruction process, it is possible to overload this instance method in every class derived from object.

Note that the destruction of an object is performed by the method destroy of Object (since every object is an instance of Object, every object can call destroy). When an application class overloads destroy, this method should contain a next in order to reach the base class and to actually destroy the object.

Data on Objects

The Object class provides a range of operations to manage objects, including those to manipulate data-structures on the objects. They are similar to the same-named Tcl-commands:

  objName set varname ?value?
  objName unset v1 ?v2 ... vn?

The set instance method with given value option allows us to manipulate an object-variable's value or to create a new one, if the variable varname does not exist on the object so far. Without value option the set operation queries the variable and returns it's value, if the variable exists, otherwise it produces an error message. The unset operation deletes one or optionally a set of variables from an object. For example the kitchen object can store information on the color of the wall-paper by:

  kitchen set wallPaperColor white

Similar to Tcl-variables the object variables are dynamical; they may be set at run-time when they are needed and unset when they become obsolete. E.g. the persons in the kitchen may be stored in an array. If there are no persons in the kitchen the array is deleted:

  # Peter enters the kitchen to cook
  kitchen set persons(cook) Peter
  ...
  # Marion enters the kitchen to take one of the seats
  kitchen set persons(seat1) Marion 
  ...
  # Both Peter and Marion leave the kitchen
  # the array is deleted by unset
  kitchen unset persons

Since XOTcl variables are internally realized through Tcl-variables they may be treated like all Tcl-variables. For that reason they have all Tcl-variable abilities, including the possibility to handle them as lists or arrays (as seen in the last example). The array command of Tcl is mapped to an XOTcl-command directly. An object-oriented call to an object of the form

  objName array option arrayName args

forwards its arguments to an array Tcl-command for the object´s instance variable arrayName. It could be used like the same-named Tcl-command, e.g. the command

  kitchen array names persons

returns all indexes currently stored in the persons array.

Similarly Tcl´s incr command is mapped to the object system. A call with the syntax:

  objName incr varName ?value?

increments varName with the given value (or without given value with 1).

Methods for Objects

Methods in XOTcl resemble Tcl-procedures. On objects one can define object-specific methods, called procs. Instance methods which are defined on classes are called instprocs. A new proc is defined using the proc instance method of the class Object:

  objName proc name args body

The arguments of the proc instance method specify the name, the arguments as a Tcl-list, and the body of the new proc. All of them must be given, only one of args and body may be empty. An example proc would be a method to let persons enter the kitchen:

  kitchen proc enter {name} {
    [self] set persons($name) [clock seconds]
  }

Here the predefined self command is used in one of three possible ways, which allow us to access useful information when working with XOTcl-methods, these are in particular:

  • self: returns the name of the object, which is currently in execution. This command is similar to this in C++. It is automatically generated on each object. If it is called from outside of an XOTcl method, it produces the error message "Can't find self".

  • self class: the self command with the argument class returns the name of the class, which holds the currently executing instproc. Note, that this may be different to the class of the current object. If it is called from a proc it returns an empty string.

  • self proc: the self command with the argument proc returns the name of the currently executing method (proc or instproc).

The method enter can be written in XOTcl as well with less syntactic overhead by using the predefined primitive my instead of [self]:

  kitchen proc enter {name} {
    my set persons($name) [clock seconds]
  }

Note, that there is a difference to the realization of these object informations to OTcl. XOTcl uses commands in order to make XOTcl-methods compatible to Tcl-procedures and accessible via namespace-paths. OTcl uses the three variables self, class and proc, which are filled automatically with proper values by the interpreter each time a method is called. To gain backwards compatibility XOTcl can be compiled with -DAUTOVARS to provide these variables additionally. By default this option is turned off.

Each XOTcl-method has its own scope for definition of local variables for the executing method. In most cases when a method uses object-variables, it is likely that the programmer wants to make one or more of these variables part of the method's scope. Then the Tcl-command for variable handling, like set, lindex, array, ... work also on these variables. The instvar instance method links a variable to the scope of an executing method. It has the syntax:

  objName instvar v1 ?v2 ... vn?

It makes the variables v1 ... vn, which must be variables of the object, part of the current method's scope. A special syntax is:

  objName instvar {varName aliasName} ...

for one of the variables. This gives the variable with the name varName the alias aliasName. This way the variables can be linked to the methods scope, even if a variable with that name already exists in the scope. Now the enter method can be adapted slightly and a leave method can be added, which uses Tcl's info command to check whether the named person is in the object's persons array. To demonstrate the alias-syntax this is done with the persons array and the alias p.

  kitchen proc enter {name} {
    my instvar persons
    set persons($name) [clock seconds]
  }

  kitchen proc leave {name} {
    my instvar {persons p}
    if {[info exists p($name)]} {
      puts "$name leaves after [expr {[clock seconds]-$p($name)}] seconds" 
      unset p($name) 
    } else {
      puts "$name is not in the room"
    }
  }
A method defined via proc can be deleted by proc using an empty argument list and an empty body. The following example deletes the method enter:
  Room proc enter {} {}

Information about Objects

XOTcl offers reading and writing introspection. The reading introspection abilities are packed compactly into the info instance method which is available for objects and classes (there are special info options for object aggregations, nested classes, mixins, filters, meta-data and assertions, which are explained separately in the following sections).

Options for the info method on objects

objName info args methodName

Returns the arguments of the specified proc (object specific method).

objName info body methodName

Returns the body of the specified proc.

objName info class ?className?

Returns the name of the class of the current object, if className was not specified. Otherwise it returns 1 if className matches the object's class and 0 if not.

objName info commands ?pattern?

Returns all commands defined on the object if pattern was not specified. Otherwise it returns all commands that match the pattern.

objName info default methodName arg var

Returns 1 if the argument arg of the specified proc has a default value, otherwise 0. If the default value exists it is stored in var.

objName info precedence ?pattern?

Returns all classes in the precedence order from which the specified object inherits methods. The returned list of classes contains the mixin and instmixin classes as well as the classes of the superclass chain in linearized order (i.e., duplicate classes are removed). If the pattern is specified, only matching classes are returned.

objName info vars ?pattern?

Returns all variables defined on the object if pattern was not specified, otherwise it returns all variables that match the pattern.


For example on the kitchen object

  kitchen info procs

returns enter and leave as a Tcl-list since these are the procs defined on the object.

Classes

Creating Classes and deriving Instances

There are different ways to create a class in XOTcl. They have in common that they derive the new class from a meta-class. Initially the Class command provides access to the meta-class Class, which holds the features common to all classes. It also allows one to derive new meta-classes. The common way to create a new class is:

  Class className ?args?

Similar to the object short form, this is a short form of a call to the create instance method of the meta-class Class, which is also executed by the standard unknown mechanism. This mechanism is always triggered when XOTcl does not know a method called on an object. Supposed that there is no method with the name className, defined on the class-object of Class, XOTcl looks up the method unknown (which is found on the Class Object) and executes it. The standard unknown-mechanism of XOTcl calls create with all arguments stepping one step to the right; in the general case:

  Class create className ?args?

This may also be called directly. Besides the indirection when using unknown, in most cases there is no difference in the action performed: Firstly the memory is allocated, using the alloc instance method; as the next step the constructor init is called on the creating object, which is in this case the class-object of the meta-class Class. In seldom cases the programmer may want to suppress the init call. To do so the alloc instance method may also be called directly:

  Class alloc className ?args?

As seen in the preceding section objects are created in the same way. The difference was, that the command Object, which accesses a class, instead of the command Class, which accesses a meta-class, was used. The user-defined classes may also be used in the same way to create new objects:

  className objName ?args?

Resembling the creation of classes this creates an object objName of type className using the unknown mechanism. That means the create instance method of the class is called. If there is no other instance method defined on the class-path so far (which would mean, an user defined creation process is invoked), the create instance method of the class Object is invoked. This method is similar to the create method of the meta-class Class. It firstly calls the alloc instance method on its (of the Class class) which allocates memory for the object, and makes it an instance of it's class. Afterwards a call to the constructor init is invoked.

Now we can specify the object for the kitchen by the class to which it belongs. In this case a kitchen is an instance of a room.

  Class Room
  Room kitchen

A set call on a class creates an instance variable on the class-object. This variable is unique for all instances, therefore, it may be referred to as a class variable.

Methods Defined in Classes

Methods which are defined in classes and which are provided to the instances of these classes are called "instprocs". The syntax for defining an instproc is:

  className instproc procname args body

It is similar to the definition of procs on objects, but uses the keyword instproc to distinguish between the methods defined on the class-object and those defined on the class. Since all rooms (in the modeled world) have ceilings, we may want to define a simple convenience instproc, which is able to set the color:

  Room instproc setCeilingColor color {
    my set ceilingColor $color
  }

A special instproc, the constructor init, was mentioned already. Now we are able to define such an instproc. Defined on a class it is responsible for all initialization tasks, which needed to be performed, when constructing a new instance object of the class. The constructor of the Room can initialize a variable for the color, in which the ceiling is painted, to white as default, since this is the color of ceilings without painting.

  Room instproc init args {
    my setCeilingColor white
    next
  }

After this definition, all instances derived from the Room class have an instance variable ceilingColor with the value white. The args argument used here is a special argument in Tcl which allows us to use a list of arguments which may change its length from call to call.

An instproc can be deleted by the method instproc as well. If instproc is called with an empty argument list and an empty body, the specified method is deleted, as the following example shows:

  Room instproc setCeilingColor {} {}

Information about Classes

Resembling to objects, information on classes may be gained through the info instance method of the meta-class Class. Note that this instance method does not only support the class info options, but also the object info options, since the accessing command refers to the class-object, which itself is an object and, therefore, offers its informations. The following table summarizes the additional info options available on classes.

Options for the info method on classes

className info heritage ?pattern?

Returns a list of all classes in the precedence order of the class hierarchy matching pattern or a list of all classes, if pattern was not specified.

className info instances ?pattern?

Returns a list of the instances of the class matching pattern or of all instances, if pattern was not specified.

className info instargs methodName

Returns the arguments of the specified instproc (method provided to objects).

className info instbody methodName

Returns the body of the specified instproc.

className info instcommands ?pattern?

Returns all commands defined on the class, if pattern was not specified, otherwise it returns all commands provided to objects that match the pattern.

className info instdefault methodName arg var

Returns 1 if the argument arg of the specified instproc has a default value, otherwise 0. If the default value exists it is stored in var.

className info subclass ?className2?

Returns a list of all subclasses of the class, if className2 was not specified, otherwise it returns 1 if className2 is a subclass and 0 if not.

className info superclass ?className2?

Returns a list of all super-classes of the class, if className2 was not specified, otherwise it returns 1 if className2 is a superclass and 0 if not.

The full list of info options is provided in the language reference.

Inheritance

Besides encapsulation of operations and state in objects, a second central ability of object-orientation is inheritance. XOTcl supports single and multiple inheritance with a directed acyclic class graph. Automatically each new class created by the instance methods create and alloc of Class inherits from Object. Therefore, it is ensured that all instances of the new class have access to the common features of objects stored in the class Object.

To specify further inheritance relationships the instance methods superclass of Class is used:

  className -superclass classList

E.g. in the example a kitchen may be seen as a special room:

  Class Room
  Class Kitchen -superclass Room

Now all instances of Kitchen are able to access the operations stored in the Room and in the Kitchen class. Note the transition the kitchen was going through: firstly it was a singular object, then it was an object with a user-defined class, and now it is a class. This is possible (and not senseless) because of the per-object specialization ability and the dual shape of a class, which is at the same time object and class. Both lead to a seamless connection of the run-time properties (the object features) and their descriptive properties (the class features). It is possible to avoid the strict distinction between them, known from static typed languages, like C++, Java, etc.

Moreover, since the syntaxes of constructs expressing the same concern are nearly identical, we can re-factor a solution with very few changes to the alternative. We will see similar "ease of refactoring" throughout the XOTcl language. E.g., we can also easily re-factor the class hierarchies or exchange class hierarchies against mixin solutions with only slight changes in the code.

Besides single inheritance, as seen, XOTcl provides also multiple inheritance. This is syntactically solved by giving the superclass instance method a list of classes instead of a single class as argument.

  Class Room
  Class 4WallsRoom -superclass Room
  Class CookingPlace
  Class Kitchen -superclass {4WallsRoom CookingPlace}

Now the kitchen class is specialized a bit more. It is a special room which has four walls and it is a cooking place. Multiple inheritance, as seen here, is as simple to apply as single inheritance.

Most often when the disadvantages of multiple inheritance are discussed, the name resolution along the class graph is considered as the biggest problem. The question is, which method is to be chosen and which path through class graph is to be taken, if more then one method of the specified name exist on the class graph.

In the example such questions would arise for an object of the Kitchen class, if two same-named methods are defined on CookingPlace and 4WallsRoom or if a method of the class Object is called, which is reachable through two paths (along CookingPlace or Room).

Often - e.g. in the inheritance model of C++ - the path through the graph is not clearly determined and/or the rules are too complicated to be understood on the first glance. The programmer often can only determine by trial which method is found firstly. Than an explicit naming of the class is necessary, which means storage of non-local information in sub-classes. Often different compilers of one language behave differently. All these issues make code reuse difficult. Moreover understandability and portability are reduced.


Figure 3: The example classes and the following next-path


XOTcl goes an intuitive and unambiguous way to solve this problem. It resolutes the precedence order along a ``next-path''. Firstly the class of the object is searched, which is Kitchen in example. Then the super-classes are searched in definition order, which means at first 4WallsRoom, then CookingPlace. Each branch is searched completely, before changing to the next branch. That means, Room is searched, before the CookingPlace branch is visited. At last the top of the hierarchy, the class Object, is searched.

The usage of next in XOTcl is different to OTcl: In OTcl, next is defined as a method, in XOTcl it is a primitive command. Furthermore, in OTcl, it is always necessary to provide the full argument list for every invocation explicitly. In XOTcl, a call of next without arguments can be used to call the shadowed methods with the same arguments (which is the most common case). When arguments should be changed for the shadowed methods, they must be provided explicitly in XOTcl as well. In the rare case that the shadowed method should receive no argument, the flag --noArgs must be used.

Destruction of Classes

Classes are destroyed by the destruction of the class-object using the destroy method of the Object class. The destruction of super-classes does not destroy the sub-classes. The super-class is simply removed from the sub-classes' super-class lists. All classes have the super-class Object, if no super-class is specified. Therefore, if all super-classes are destroyed or removed, the new super-class is Object, not: no super-class. The destruction of the class of an object does neither delete the object nor leave it without class. In XOTcl a deleted class leaves it's instances with the class Object.

So all empty class- and superclass-relationships are automatically reseted to Object. Note, that this are differences to OTcl, where the destruction of an class destroys all instances and an empty super-class list remains empty.

Method Chaining

A special feature of XOTcl is the method chaining without explicit naming of the ``mix-in''-method. It allows one to mix the same-named superclass methods into the current method (modeled after CLOS). The previously described next-path is the basis for this functionality. At the point marked by a call to the next primitive of XOTcl the next shadowed method on the next path is searched and, when it is found, it is mixed into the execution of the current method. When no method is found, the call of next returns an empty string, otherwise it returns the result of the called method. The syntax is:

  next ?arguments|--noArgs?

As stated earlier the usage of next in XOTcl differs from OTcl, since the next call without arguments in OTcl means per default that no arguments are passed. But most often all arguments are passed through to the shadowed methods (since these will most likely have the same signatures). When all variables should be passed through, in OTcl it is necessary for correct variable substitution to use:

  eval $self next $args

To avoid such difficulties, we made the passing of all arguments the default case; a simple

  next

performs the task of passing all arguments to the shadowed methods. These arguments are called the standard arguments. If the standard argument feature should not be used, optionally arguments can be given or the flag --noArgs could be set as sole argument, which means that the shadowed method is called with no arguments.

E.g. the following next call ignores the standard arguments and sends the arguments 1 and 2 instead:

  next 1 2

As an example all classes involved in the previous example should get a constructor instance method, which simply sets an instance variable on the object:

  Room instproc init args {
    my set roomNumber 0
    next
  }    
  4WallsRoom instproc init args {
    my set doorPosition 0
    next
  }
  CookingPlace instproc init args {
    my set stoveType electric
    next
  }
  Kitchen instproc init args {
    my set cookName -
    next
  }

After creation an object of class Kitchen gets automatically four instance variables cookName, roomNumber, doorPosition and stoveType set up with default values in this order (since this is the order of the classes in the next-path). Note, that the order is important, because one missing next call, in one of the init methods, means that succeeding init methods will not be executed. This mechanism functions equally on all kinds of instprocs, not only on constructors.

The constructors use the args argument, which allows us to give a list of variable length as arguments. To ensure reusability of our classes the constructors should use args in most cases, since they may pass through arguments for constructors further up the class hierarchy.

If a proc with the searched name exists on the object it shadows all instprocs. A next call in a proc leads to the normal next-paths search, starting with the object's class.

By the way, an observant reader might notice that the example above can be rewritten without explicit constructors, just by using parameters with default values.

  Class Room -parameter {{roomNumber 0}}
  Class 4WallsRoom -superclass Room -parameter {{doorPosition 0}}
  Class CookingPlace -parameter {{stoveType electric}}
  Class Kitchen -superclass {4WallsRoom CookingPlace} -parameter {{cookName -}}

If an instance of a Kitchen is created it will contain instance variables for doorPosition, cookName, roomNumber, and stoveType, as the following statements will show.

  Kitchen k
  puts [k info vars]

Dynamic Class and Superclass Relationships

Another property of XOTcl that distinguishes it from statically typed languages are dynamics of class relationships. The realization of the definition of super-classes as seen above with the superclass method suggests already, that it is not only available at the class definition time. In the above example its appended to the class definition with "-superclass" as a short syntax for method invocation at definition time (all other available methods can also be called with a preceding dash ("-") appended to definitions).

At any time the class graph may be changed entirely using the superclass method. Suppose the rooms and kitchens created in modeling of a house should be displayed to a screen, but it is not determined, whether the user of the system has the possibilities for graphical outputs. Two classes TextOutput and GraphicalOutput may be defined, which handle the output. Both have an instproc paint which does the painting of the virtual world on the chosen display type. The common output requirements are handled by a derived class VirtualWorldOutput which calls the paint method of the superclass using next. In statically typed languages it would need more sophisticated constructs to change the output class at run-time. E.g. a delegation to another object handling the intrinsic task of the output object would be introduced solely for the purpose of configuring the output form. With a dynamic class system we can use the superclass method to do so easily:

  Class TextOutput
  TextOutput instproc paint args {
    # do the painting ...
  }
  Class GraphicalOutput
  GraphicalOutput instproc paint args {
    # do the painting ...
  }

  # initially we use textual output
  Class VirtualWorldOutput -superclass TextOutput
  VirtualWorldOutput instproc paint args {
    # do the common computations for painting ...
    next; # and call the actual output
  }

  # user decides to change to graphical output
  VirtualWorldOutput superclass GraphicalOutput

Sometimes, such a change to new intrinsic properties should not happen for all instances of a class (or the class hierarchy), but only for one specific object. Then the usage of a dynamic super-class relationship is a too coarse-grained means. A second form of such dynamics is the changing of the relationship between object and class. This means, objects can also change their class dynamically at run-time. This feature may be used to model a life-cycle of an object, without loosing the object's identity, inner state or per-object-specializations through procs. The class instance method enables this functionality.

An example would be an agent for the virtual world. Agents may be placeholders for persons, who interactively travel the world, or programs, which act automatically. When a person decides at run-time to give a task it has performed formerly by hand to an automatic agent, the agents nature changes from interactive agent to automatic agent, but the identity and the local state (that means the parts of the task, that are already fulfilled by the person) stay the same. This is a scenario for changing class relationships, e.g.:

  Class Agent
  Class AutomaticAgent -superclass Agent
  Class InteractiveAgent -superclass Agent

  # create a new agent for a person
  InteractiveAgent agent1

  # the person does something ...
  # and decides the change to an automatic agent
  agent1 class AutomaticAgent

Meta-Classes

Meta-classes are a special kind of classes. Similar as classes are managing objects (where managing means: control the creation and destruction of instances, know what instances exist, provide methods), meta-classes are managing classes. So, meta-classes are used to define classes. In other words, every Class in XOTcl is created by a meta-class, in most cases by the meta-class named Class. New user-defined meta-classes can be defined as subclasses of the predefined meta-class Class, or by adding an instmixin class (see below) containing Class to the precedence chain of the class. By defining Object instmixin Class one can even change the object system of XOTcl in in a way such that every created Object is a meta-class.

Since the concept of a meta-class are sometimes confusing to people of a background of some other programming languages, we explain meta-classes slowly with the analogy of classes and objects.

When a class Foo is created via the command

   Class Foo
it has no private variables and no special methods. This is somewhat similar as creating an object via Object:
   Object foo
This plain object foo can be configured directly, or one can create a class that configures the object. Instead of writing
   Object foo 
   foo set x 1
   foo proc hi {} {puts "hello"}
one can use
   Class C -superclass Object
   C instproc init {} {my set x 1}
   C instproc hi {} {puts "hello"}
and create an instance and call the method.
   C c1
   c1 hi
The same holds for meta-classes and classes as well: Instead of writing
   Class Foo
   Foo set x 1
   Foo proc hi {} {puts "hello"}
the following can be used:
   Class MC -superclass Class
   MC instproc init {} {my set x 1}
   MC instproc hi {} {puts "hello"}
The instances of meta-classes are classes which can be defined the usual way:
   MC Bar
   Bar hi
   Bar b1
Now we have a class names Bar which has a class-scoped variable named x with the value of 1 (set via the constructor); the class Bar has as well a class-method named hi which prints, when called, the string "hello". The class Bar can be used to create instances of the class like b1, b2 and so on.

Note that the command Class is a predefined definition of the most general meta-class in XOTcl. Each time we are creating a class, we use this meta-class. In order to define a specialized meta-class, we can do this the traditional object-oriented way: we subclass. Therefore, in to define a specialized meta-class, we can use:

  Class myMetaClass -superclass Class

This defines a new meta-class myMetaClass, which has all the abilities of meta-classes. That means that the programmer is able to specify new class features or override old ones. Later she/he may instantiate these into new classes.

This is a very powerful language feature, since it allows one to give some classes further abilities than the others (or to restrict classes). This way large program structures, like certain design pattern parts, may be instantiated. Meta-classes hold the common abstract parts of the structures. They allow one to form libraries of such structures very easily.

Example 1: Overloading the info method of classes

As a simple example we can derive a new meta-class NoClassInfo from Class. Later we override the info method of Class. Thus the classes created with NoClassInfo, have an info option that only produces an error message. All classes created with NoClassInfo, like Agent in the example below, are not capable of accessing the class info method anymore:

  Class NoClassInfo -superclass Class
  # redefine info ability
  NoClassInfo instproc info args {
    error "No class info available"
  }
  # derive agent class from meta-class, which
  # can not access class info
  NoClassInfo Agent
Now a call like:
  Agent info superclass

triggers the error message.

Example 2: Defining Classes that Count Their Instances

Meta-classes are frequently used to define some bookkeeping about the number of instances on the class level. In the following example we define a meta-class named CountedClass which defines classes that count their instances:

  Class CountedClass -superclass Class -parameter {{counter 0}}
  CountedClass instproc create args {
    my incr counter
    next
  }
  CountedClass instproc instdestroy args {
    my incr counter -1
    next
  }
  CountedClass Dog

  Dog piffie
  Dog idefix
  puts "nr of dogs: [Dog counter]"

  piffie destroy
  puts "nr of dogs: [Dog counter]"
Note that the behavior introduced by meta-classes can be orthogonal to the behavior of the classes. One can define Dog as a specialization of Animal or defines a special kind of dog such as Poodle using the method superclass as usual.

Example 3: The Singleton Meta-Class

Finally, a small example, which is more practical. Some applications have the requirement that only one instance of a class might be defined at a certain time. Such a behavior is frequently called a "Singleton". In XOTcl we can define a class singleton by overloading the create method of Class: when create is called and there exists already an instance of the singleton it is returned instead of a new instance.

  Class Singleton -superclass Class
  Singleton instproc create args {
    expr {[my exists instance] ? [my set instance] : [my set instance [next]]}
  }
If someone wants to have a class e.g. Manager to be a singleton, you can create it by e.g.
  Singleton Manager -superclass FOO

Create, Destroy, and Recreate Methods

XOTcl allows since version 0.84 for a flexible destroy and recreate scheme. create and alloc are both Class instprocs handling creation for their instances. I.e.:

 className alloc [self]
and
 className create [self]

are used for creating an instance. A similar method instdestroy exists on Class that handles physical destruction of an object. The method destroy on Object which lets an object destroy itself in fact has the following behavior:

  Object instproc destroy args {
   [my info class] instdestroy [self]
  }

However, this behavior is not implemented in XOTcl, but in C. create distinguishes between the following situations:

  • Create a new object: By default create calls alloc and then doInitializations.
  • Recreate an existing object: When the specified object exists, it is recreated through the recreate method:
      givenClass recreate [self]
    

    The method recreate can be customized like all other XOTcl methods (e.g. by overloading or interception). By default recreate calls cleanup followed by doInitializations.

    Note, that recreate is not called, when a someone tries to recreate a class as an object or an object as a class. In these cases, destroy + create are used.

        Class c
        Object c ;# here, "c" is downgraded to an object, no "recreate" is called
    

For create and recreate, the method doInitializations is called automatically from C and has the following default behavior:

  • Search for parameter default values,
  • Call parameter initialization methods,
  • Call the constructor init.

Each step has a method call that can be changed, intercepted, etc. Of course, cleanup, recreate, instdestroy, etc. can also be overloaded or intercepted.

Consider a typical case for overloading recreate: a structure preserving recreate that cleans up the class but preserves the existing class hierarchy (subclass and instance relationships):

  Class StructurePreservingRecreate
  StructurePreservingRecreate instproc recreate {cl args} {
    if {[my isclass $cl]} {
      set subclass [$cl info subclass]
      set instances [$cl info instances]
    }
    next
    if {[my isclass $cl]} {
      foreach sc $subclass {
        $sc superclass $cl
      }
      foreach i $instances {
        $i class $cl
      }
    }
  }
  Object instmixin add StructurePreservingRecreate

Now the following code does not change the superclass or instance relationships of C:

  Class A
  Class B
  Class C -superclass {A B}
  Class D
  Class E -superclass {C D}
  C c1
  C c2

  # recreate -> is structure preserving
  Class C -superclass {A B}
  C c2

  # test
  puts superclass=[C info superclass]
  puts subclass=[C info subclass]
  puts instances=[C info instances]
  puts class=[c1 info class]
  puts class=[c2 info class]
Starting with XOTcl 1.4.0, xotcl provides also a user-friendly way for a structure-prevering recreate implemented in C. Since this version, one can configure "softrecreate" as follow.
::xotcl::configure softrecreate true
This command causes that recreates are structure-conservative.

Methods with Non-Positional Arguments

So far we have introduced methods only with positional arguments: that is, the position of an argument in the argument list determines to which local variable the argument is bound, when the method is invoked. Sometimes non-positional arguments -- arguments that carry both a name and a value when the method is invoked -- are useful. Before a non-positional argument can be used, it must be defined in the method definition using the following syntax:

 className instproc methodName ?non-pos-args? args body ?assertions
 objName proc methodName ?non-pos-args? args body ?assertions

The non-positional arguments are defined with the following syntax:

 {-name?:checkoption1, checkoption2, ...? default value} \
     {-name?:checkoption1, checkoption2, ...? ?default value?} ...

Only the name of the non-positional argument is really required, all other parts of this syntax are optional.

Let's consider a simple example, where a method with two non-positional args is defined; one has only a name ("a"), and one has a name and a default value (b):

 Object o
 o proc someproc {-a {-b {1 2 3}} x y} {
     puts "$a $b $x $y"
 }

We can invoke this method as follows:

 o someproc -b {4 5} -a 1 3 4

Here, the order of a and b can be changed; hence the name non-positional arguments. As b has a default value, we do not need to provide a value for it. In the following invocation b has the value "1 2 3":

 o someproc -a 1 3 4

The ordinary arguments start after the last non-positional argument (here: "3 4"). We can explicitly end the non-positional arguments by using "--". This is useful if we want to provide arguments that contain dashes ("-"), e.g.:

 o someproc -a 1 -- -b -c

Sometimes we want to check or control the non-positional arguments. For instance, in the above invocation, we might want to check that a is not forgotten, because otherwise the method cannot execute properly. This is the role of the checkoptions. There are three predefined checkoptions: required, boolean and switch. required checks whether a non-positional argument is given, boolean checks that a non-positional argument is of boolean type. For instance:

 Class P
 P instproc someproc {-a:required {-b:boolean true}} {
     puts "$a $b"
 }
 P p

This method requires a, and b needs to be of type boolean (is has the default value true). This invocation is valid:

 p someproc -a 1 -b 0

This invocation is invalid, because a is missing, and b is not a Tcl boolean type:

 p someproc -b " a b v"

The checkoption switch is similar to boolean except it does not require an additional argument. If the default value is false, the switch can be turned on, if the default is true it can be switched off.

The checkoptions are extensible. In fact, they are defined in an object ::xotcl::nonposArgs. We can extend this object with new methods. A check option method has the following syntax:

 someobject|someclass proc|instproc methodName {?optional nonpositional arguments? argName arg} {
  ...
 }

argName is here used to denote the name of the argument, and arg is the provided value.

Of course, the non-positional arguments can also be introspected. The following info options return the non-positional arguments of a method:

 objName info nonposargs methodName
 className info instnonposargs methodName

Message Interception Techniques

Even though object-orientation orders program structures around data, objects are characterized primarily by their behavior. Object-oriented programming style encourages the access of encapsulated data only through the methods of an object, since this enables data abstractions. A method invocation can be interpreted as a message exchange between the calling and the called object. Therefore, objects are at runtime only traceable through their message exchanges. At this point the message interceptors can be applied to catch and manipulate all incoming and outgoing messages of an object.

Generally interceptors can be applied to attach additional or extrinsic concerns to an object or a class or a class hierarchy. For instance roles or aspects can be implemented this way on various levels of scale.

We have already discussed some interception techniques implicitly. E.g., the unknown mechanism intercepts messages that have not be found on the object. It can be used as a very useful programming technique, e.g., the define a default behavior for an object. The interceptors presented in this section have a different character: They are applied before/after the original method even if the method is defined for the target object. Thus these interception techniques may be applied

We will discuss the message interceptors in this section in detail. The table below gives an impression, when which interceptor may be applied.

Message Interceptors Overview

Applied When

Primary Target Structure

Coverage

Per-Object Filter

before/after a call

object hierarchies

all methods

Per-Class Filter

before/after a call

class and class hierarchies

all methods

Per-Object Mixin

before/after a call

object

specific methods

Per-Class Mixin

before/after a call

class and class hierarchies

specific methods

Unknown Mechanism

after method was not found

object

all unknown calls


Filter

The filter (see [Neumann and Zdun 1999a] for more details) is a language construct to implement broader extensional concerns either for a single object or for several classes or class hierarchies. This way large program structures at the scale of several classes or class hierarchies can be managed. It is a very general interception mechanism which can be used in various application areas. E.g. a very powerful programming language support for certain design patterns is easily achievable, but there are also several other domains which are covered, like tracing of program structures, self-documentation at run-time, re-interpretation of the running program, etc.

A per-class filter is a special instance method that is registered for a class C. A per-object filter is a special instance method that is registered for a object o. Every time an object of class, C or the object o respectively, receives a message, the filter method is invoked automatically.

Usage of Filters

All messages to a filtered object must go through the filter before they reach their destination object. A simple example would be a sole filter on the class of the object. To define such a filter two steps are necessary. Firstly an filter method has to be defined, then the filter has to be registered. The filter method consists of three parts which are all optional. A filter method has the following form:

  className instproc FilterName args {
    pre-part
    next
    post-part
  }

When a filter comes to execution at first the actions in the pre-part are processed. The filter is free in what it does with the message. Especially it can (a) pass the message, which was perhaps modified in the pre-part, to other filters and finally to the object. It can (b) redirect it to another destination. Or it can (c) decide to handle the message on its own. The forward passing of messages is implemented through the next primitive of XOTcl. After the filter has passed its pre-part, the actual called method is invoked through next.

After the call of next is processed, the execution returns to the point in the filter, where the next call is located and resumes execution with the actions of the post-part. These may contain arbitrary statements, but especially may take the result of the actual called method (which is returned by the next-call) and modify it. The caller then receives the result of the filter, instead of the result of the actual called method.

The pre- and post-part may be filled with any ordinary XOTcl-statements. The distinction between the three parts is just a naming convention for explanation purposes.

The filter uses the args argument which lets us use a list of variable length as arguments, since it must filter a lot of different calls, which may have different argument lists. Furthermore, it may pass through arguments to other filters and the preceding filters may change the argument list.

Since any proc/instproc may be a filter, a registration of the filter is necessary, in order to tell XOTcl, which instprocs are filters on which classes. The filter and instfilter instance methods are able to handle this task for per-object filters and per-class filters respectively. Similar to the XOTcl language introduced so far, the filter registration is dynamic at run-time. By supplying a new list of filters to filter/instfilter, the programmer can change the filters registered on a class at arbitrary times. The filter instance method has the syntax:

  className instfilter filterList
for per-class filters and:
  objName filter filterList
for per-object filters.

Now a simple example should show the filter's usage. In the preceding examples we have defined several rooms. Every time a room action occurs it is likely that the graphical sub-system has to change something on the output of that particular room. Therefore, at first we need a facility to be informed every time an action on a room happens. This is quite easily done using filters:

  Class Room
  Room r1; Room r2;       # just two test objects

  Room instproc roomObservationFilter args {
    puts "now a room action begins"
    set result [next]
    puts "now a room action ends - Result: $result"
    return $result
  }

  Room instfilter roomObservationFilter

Now every action performed on room objects is notified with a pre- and a post-message to the standard output stream. We return the result of the actual called method, since we don't want to change the program behavior at all. E.g. we can set an instance variable on both of the two room objects:

  r1 set name "room 1"
  r2 set name "room 2"

The output would be:

  now a room action begins
  now a room action ends - Result: room 1
  now a room action begins
  now a room action ends - Result: room 2


  

Figure 4: Cascaded Message Filtering



All classes may have more than one filter. In fact they may have a whole filter chain, where the filters are cascaded through next. The next method is responsible for the forwarding of messages to the remaining filters in the chain one by one till all pre-parts are executed. Then the actual method is executed and then the post-parts come to turn. If one next-call is omitted the chain ends in this filter method. As an example for an additional filter we may register a filter that just counts the calls to rooms.

  Room set callCounter 0;  # set class variable
  Room instproc counterFilter args {
    [self class] instvar callCounter
    incr callCounter
    puts "the call number callCounter to a room object"
    next
  }
  Room instfilter {roomObservationFilter counterFilter}

Filters are invoked in registration order. The order may be changed by removing them and adding them in new order. Filters are inherited by sub-classes. E.g. in the preceding example for the next path, an OvalOffice was derived from the Room class. Without a change to the program each OvalOffice object automatically produces the same filter output as rooms.


  

Figure 5: Filter Inheritance


Filter chains can also be combined through (multiple) inheritance using the next method. When the filter chain of the object's class is passed, the filter chains of the superclasses are invoked using the same precedence order as for inheritance. Since on the subclass there may also be a another filter chain, without sophisticated computing in the pre- and post-parts one can produce easily a powerful tracing facility. E.g. if we want to distinguish an OvalOffice from other rooms we may want to add a filter solely for rooms of the type OvalOffice:

  Class OvalOffice -superclass Room
  OvalOffice o1;  # test object
  OvalOffice instproc ovalOfficeObservationFilter args {
    puts "actions in an oval office"
    next
  }
  OvalOffice instfilter ovalOfficeObservationFilter

A simple call to the o1 object, like:

  o1 set location "Washington"

produces the following output:

  actions in an oval office
  now a room action begins
  the call number 3 to a room object
  now a room action ends - Result: Washington

As seen already, filter registrations can be added dynamically at runtime. But they may also be removed. Perhaps the counting on rooms should stop after a while, then a simple call of the instfilter method is sufficient:

  Room instfilter roomObservationFilter

Filters can be removed completely by giving an empty list to the registration method:

  Room instfilter {}

Per-object filters operate on a single object. E.g. if we only want to observe a single Room object room1, we can use the filter method to register the roomObservationFilter only for this particular instance:

  room1 filter roomObservationFilter

As a filter we can register any method in the precedence order of the class or object. Thus we can also register procs as per-object filters. Additionally, meta-class methods may be registered as per-class filters. Filters are linearized so that each filter is only executed once, even if it is registered multiple times.



Introspection on Filters

In order to gain information about the currently registered filters on a certain object/class, the object info option filters and the class info option instfilters may be queried. It returns a list of the currently registered filters:

  className info instfilter
  objName info filter

A special call-stack info option for filters is self filterreg. It returns the name of the object or class on which the filter is registered. Since the filter may be registered on other objects/classes than the one on which it is defined, this may vary from self class in the filter. The command returns a list of the form:

  objName filter filterName
or:
  className instfilter filterName
respectively.



Example: A Simple Trace Filter

The trace example primarily demonstrates the inheritance of filter chains. Since all classes inherit from Object, a filter on this class is applied on all messages to objects. The Trace object encapsulates methods for managing the tracing:

  Object Trace
  Trace set traceStream stdout

  Trace proc openTraceFile name {
    my set traceStream [open $name w]
  }

  Trace proc closeTraceFile {} {
    close $Trace::traceStream
    my set traceStream stdout
  }

  Trace proc puts line {
    puts $Trace::traceStream $line
  }

  Trace proc add className {
    $className instfilter [concat [$className info filter] traceFilter]
  }

First we define the object and set a variable for the stream to which we send the trace outputs (here: stdout). With a method for opening and a method for closing a file we can redirect the trace stream to a file. puts is helper method for the filter to print an output to the selected output stream. In add the traceFilter is appended to the existing filters of a specified class. The actual filter method (see below) displays the calls and exits of methods with an according message. The calls are supplied with the arguments, the exit traces contain the result values. We have to avoid the tracing of the trace methods explicitly.

  Object instproc traceFilter args {
    # don't trace the Trace object
    if {[string equal [self] ::Trace]} {return [next]}
    set context "[self class]->[self callingproc]"
    set method [self calledproc]
    switch -- $method {
      proc -
      instproc {::set dargs [list [lindex $args 0] [lindex $args 1] ...] }
      default  {::set dargs $args }
    }
    Trace::puts "CALL $context>  [self]->$method $dargs"
    set result [next]
    Trace::puts "EXIT $context>  [self]->$method ($result)"
    return $result
  }

As trace message we write the callee´s context (class and proc), the invoked method (using calledproc), and the given arguments. In the switch statement we avoid to print whole method bodies.

With

  Trace add Room

messages to all rooms, including all instances of Room´s sub-classes, are surrounded with a CALL and an EXIT output. With

  Trace add Object

messages to all objects in an XOTcl environment are surrounded with a CALL and an EXIT output. In general, it is possible to restrict the trace to instances of certain classes, or to produce trace output for only certain methods. This requires registration methods and a more sophisticated implementation of the filter method.



Mixin Classes

Per-object and per-class mixins (see [Neumann and Zdun 1999c] for more details) are another interception technique of XOTcl to handle complex data-structures dynamically. Here, we use mixin as a short form for mixin class. All methods which are mixed into the execution of the current method, by method chaining or through a mixin class, are called mixin methods. Mixin classes resembles the filter presented in the preceding section. While the filters work on all calls to all methods of an object/class hierarchy, the mixin classes are applied on specific methods. The filter is defined in a single method, while the mixin is composes several method in a class.

Supplemental Classes

Mixin classes cover a problem which is not solvable elegantly just by the method chaining, introduced so far. To bring in an addition to a class, the normal XOTcl way is to define a mixin method and chain the methods through next, e.g.:

  Class Basic
  Basic instproc someProc  {
    # do the basic computations
  }
  Class Addition
  Addition instproc someProc {
    # do the additional computations
    next
  }

In order to mix-in the additional functionality of the supplemental class Addition a new helper class (sometimes called intersection class) has to be defined, like:

  Basic+Addition -superclass {Addition Basic}

This is even applicable in a dynamical manner, every object of the class Basic may be changed to class Basic+Addition at arbitrary times, e.g.:

  Basic basicObj
  ...
  basicObj class Basic+Addition

Now consider a situation with two addition classes. Then following set of classes has to be defined to cover all possible combinations:

  Class Basic
  Class Addition1
  Class Addition2
  Class Basic+Addition1 -superclass {Addition1 Basic}
  Class Basic+Addition2 -superclass {Addition2 Basic}
  Class Basic+Addition1+Addition2 -superclass {Addition2 Addition1 Basic}

The number of necessary helper classes rises exponential. For n additions, 2n-1 (or their permutations if order matters) artificially constructed helper-classes are needed to provide all combinations of additional mix-in functionality. Furthermore it is possible that the number of additions is unlimited, since the additions may produce other additions as side-effects. This demonstrates clearly that the sub-class mechanism provides only a poor mechanism for mix-in of orthogonal functionality. Therefore we provide an extension in the form of object mixin classes, which are added in front of the search precedence of classes.

Per-Object Mixins

The mix-ins methods extend the next-path of shadowed methods. Therefore, per-object mix-in methods use the next primitive to access the next shadowed method. Consider the following example:

  Class Agent
  Agent instproc move {x y} { 
    # do the movement
  }
  Class InteractiveAgent -superclass Agent
  # Addition-Classes
  Class MovementLog
  MovementLog instproc move {x y} { 
    # movement logging
    next
  }
  Class MovementTest
  MovementTest instproc move {x y} {
    # movement testing
    next
  }

An agent class is defined, which allows agents to move around. Some of the agents may need logging of the movements, some need a testing of the movements, and some both (perhaps only for a while). These functionalities are achieved through the additional classes, which we will apply through per-object mixins.

Before we can use the per-object mix-ins on a particular object, we must register the mixins on it with the mixin instance method. It has the syntax:

  objName mixin mixinList

For example we may create two interactive agents, where one is logged and one is tested:

  InteractiveAgent i1; InteractiveAgent i2
  i1 mixin MovementLog
  i2 mixin MovementTest

At arbitrary times the mixins can be changed dynamically. For example i2's movements can also be logged:

  i2 mixin MovementTest MovementLog


  

Figure 6: Per-Object Mix-ins: Next-Path for the Example



The mixin option of the info instance method allows us to introspect the per-object mixins. It has the syntax:

  objName info mixin ?pattern?

It returns the list of all mix-ins of the object, if pattern is not specified, otherwise it returns the matching per object mixin classes.

The inverse operation of info mixin is mixinof finds out, into which objects an per-object mixin class is mixed into.
  clsName info mixinof ?pattern?

Note, that the constructors (init methods) of per-object mixins (and per-class mixins) are only called, if the mixin is registered already during object initialization (when init is called). For per-object mixins, one can achieve the initialization of a mixin via an idiom like

  Object o -mixin M -init
that registers the mixin before init is called. When a mixin is registered after object creation and it needs initializations, it is necessary to define special methods for this. Note, that the behavior described here is introduced in version 0.84 to ensure consistent behavior of intrinsic classes, per-object and per-class mixins, and to achieve predictable behavior for dynamic registration for all kind of mixins, and as well during recreations of objects having mixins registered. Older versions used heuristics for the initialization of per-object mixins.

Per-Class Mixins

Per-class mixins are exactly identical in their behavior to per-object mixins, but they operate on classes. Thus they are the class-specific variant of the per-object mixins, like instprocs are a class-specific variant of procs. Therefore, in the language the per-class mixins are called instmixins.

In general a per-class mixin is a class which is mixed into the precedence order of all instances of the class and all its subclasses it is registered for. It is also searched before the object's class itself is searched, but after per-object mixins.

Per-class mixins are linearized according to the precedence order like classes on the superclass hierarchy. I.e. from the full list of per-object mixins, per-class mixins, and intrinsic classes (and all the superclasses of all these classes) always the last occurrence is used.

From the point of view of language expressibility instmixins are not required, because they cannot express anything that per-object mixins cannot express already (like procs can express any instproc feature). As alternative to instmixins, we could simply register the per-object mixins in the constructor of the class.

But there at least the following reasons for instmixins as an additional language construct:

  1. we can at runtime determine with info mixin and info instmixin whether it is a class- or object-specific mixin. Thus we get a better structuring at runtime.
  2. We have not to 'pollute' the constructors with per-class mixin registrations. Therefore, the constructors get more understandable.
  3. If it is required to add (and remove) dynamically interceptors to a set of objects, which are instances of a certain type, per-class mixins are much easier to handle (e.g. add an instmixin to Object to intercept e.g. all calls to certain predefined methods).
  4. The language is more 'symmetrical', since any object-specific feature in XOTcl has a class-specific variant.

The mix-ins methods of per-class mixins extend the next-path of shadowed methods in the same way as per-object mixin methods. Before we can use a per-class mix-in on a particular class, we must register the mixin on it with the instmixin instance method. It has the syntax:

  className instmixin mixinList
The inverse operation of info inmixin is instmixinof finds out, into which objects an per-object mixin class is mixed into.
  className info instmixinof ?-closure? ?pattern?

Now consider that in the given per-object mixin example all interactive agents should be tested. We could either build a subclass TestedInteractiveAgent or register the per-object mixin in the constructor of the interactive agent class. The subclass solution leads to the same combinatorial explosion of intersection classes as discussed in the previous section, if more supplemental classes are added. The per-object mixin solution pollutes the constructor and does not prevail the structural semantics that the 'tested' property belongs to the interactive agent class at runtime

Here, we can use a per-class mixin:

  Class Agent
  Agent instproc move {x y} {# do the movement}
  Class InteractiveAgent -superclass Agent
  Class MovementTest
  MovementTest instproc move {x y} {
    # movement testing
    next
  }

  # now register the instmixin
  InteractiveAgent instmixin MovementTest

The per-class mixin now operates on all interactive agent including the instances of subclasses. E.g. for interactive agents i1 and i2 we automatically have movement testing. i2 is also logged, since it has the logging class as object-specific mixin:

  InteractiveAgent i1
  InteractiveAgent i2 -mixin MovementLog

  i1 move 3 4
  i2 move 1 2 

At arbitrary times the instmixins can be changed dynamically.

The instmixin option of the class info instance method allows us to introspect the per-class mixins. It has the syntax:

  className info instmixin ?className2?

It returns the list of all instmixins of the the class, if className2 is not specified, otherwise it returns 1, if className2 is a mixin of the object, or 0 if not.

Per-class mixins are applied transitively. That means the per-class mixin A of a per-class mixin B is also applied for an object in in B's scope. This is exactly the same as how superclasses are applied for instances. Consider the following example

  Class X11 \
     -instproc test args {
	puts [self class]
	next
     }
  Class X12 \
    -instproc test args {
	puts [self class]
	next
    }
  Class X \
    -instmixin {X11 X12} \
    -instproc test args {
	puts [self class]
	next
    }

  Class Y \
    -instmixin X

  Y create y -test
  X create x -test

Here the application as a superclass (for x) yields the same result as the application as an instmixin (for y):

  ::X11 
  ::X12 
  ::X

Precedence Order

The precedence order is composed by the precedence order of the superclass hierarchy (as explained earlier) and the message interceptors. In general, filters precede mixins and the superclass hierarchy. They are applied in the order of the next path of the object. Thus per-object filters are ordered before per-class filters.

Mixins are processed after the filters. Again, they are applied in the order of the next path of the object. Thus per-object mixins are ordered before per-class mixins.

Finally, the object's own heritage order comes in the order: object, class, superclasses.

The three precedence order lists (filters, mixins, and classes) are pre-calculated and cached.

Filters as well as classes (mixins and ordinary classes) are linearized. That means, each filter and each class can be only once on a precedence order list. If a filter or class can be reached more than once, than the last occurrence is used.

For instance, consider a class A is superclass, per-class mixin, and per-object mixin. On the precedence order lists only the last occurrence as a superclass is used after linearization.

Guards for Filters and Mixins

Message interceptors, such as filters and mixins, are applied for potentially huge number of messages. In many cases it is possible to reduce the effective number of cases in which interceptors are applied. Interceptor guards offer this functionality: they are boolean conditions with which you can specify in which cases a registered interceptor should be applied.

Filter Guards

A filter guard is a set of conditions that determine whether a filter is to be executed upon a certain invocation or not. Syntactically we can append a filter guard to the filter registration, or it can be registered using the methods filterguard for filters and instfilterguard for instfilters.

Each filter guard is an ordinary condition. A filter guard is executed in the call frame of the filter to be executed, if the filter guard returns 1. Thus, the call-stack information are already set to the values of the targeted filter - and these values can be used in the filter guard.

Let us consider a simple program:

Class Room
Room instproc enter {name} {puts [self proc]}
Room instproc leave {name} {puts [self proc]}
Room instproc loggingFilter args {
    puts [self calledproc]
    next
}
Room instfilter loggingFilter

Now consider we only want to apply the logging filter for enter and leave, not for any other message sent to Room instances. In the following example, for instance, we do not want to log the set message:

Room r 
r enter Uwe
r leave Uwe
r set roomName "Office"

In this example a filterguard can be applied to restrict the application of the filter to those two methods:

Room instfilterguard loggingFilter {
  [self calledproc] == "enter" || 
  [self calledproc] == "leave"}

Here we limit the filter application of the logging filter on rooms to calls to enter and leave. All other calls are not filtered at all. Note that the same syntax can also be applied for filterguard. Also, there is a short form to register filter guards directly during filter registration. The following code has the same semantics as the filter and filter guard definitions above:

Room instfilter {{loggingFilter -guard {
    [self calledproc] == "enter" || 
    [self calledproc] == "leave"}}}

The filter guard language construct is registration centric. It only applies for the class or object on which a filter is registered, not for all applications of the filter method. That is, if we use loggingFilter on another class we may give no or completely different filter guards.

If no filter guard is given for a filter, we assume that it is to be applied on all methods (equivalent to the filter guard '1' which is always true).

There are introspection options for filter guards. In particular, we can use info filterguard and info instfilterguard for getting the filter guards for a particular filter or instfilter respectively. For instance:

puts [Room info instfilterguard loggingFilter]

This prints out the content of the above guard definition. We can also append -guard to info filter or info instfilter to obtain a filter definition with guards:

puts [Room info instfilter -guards]

If we call a method from within a filter guard, as for instance callsMethod, we might require some parameters from the guard's context, such as calledproc. These parameters can be passed as references, as in the following example:

  Room instfilter loggingFilter
  Room instfilterguard loggingFilter {[my callsMethod openURL [self calledproc]]}

This example works because the filterguard is already set to the scope of the guard. Now we can use this dynamic calledproc context in the called method:

  Room instproc callsMethod {method calledproc} {
    return[string match $calledproc $method]
  }

We simply check whether the called method matches the given method name or not.

Mixin Guards

Similar to filters, there are mixin guards, defined with mixinguard and instmixinguard, or with -guard during mixin registration. Consider a simple example: there are a number of birds who have two mixins: Fly and Sing. For Fly there are limitations: a bird can only fly if it is at least two years old and is not a Penguin. Such problems are be solved with mixin guards:

  Class Fly
  Fly instproc fly {} {puts "[my signature]: yippee, fly like an eagle!"}

  Class Sing
  Sing instproc sing {} {puts "[my signature]: what a difference a day makes"}

  Class Animal -parameter age
  Animal instproc unknown args { puts "[my signature]: how should I $args?"}
  Animal instproc signature {} {
    return "[self] [my info class] ([my age] years)"
  }

  Class Bird -superclass Animal
  Class Penguine -superclass Bird
  Class Parrot -superclass Bird
  Class Duck -superclass Bird

  Parrot tweedy -age 1
  Penguine pingo -age 5
  Duck donald -age 4
  Parrot lora -age 6

  Bird instmixin {{Fly -guard {[my age] > 2 && ![my istype Penguine]}} Sing}

An invocation like:

foreach bird {tweedy pingo donald lora} { $bird fly }

yields the following result:

::tweedy ::Parrot (1 years): how should I fly?
::pingo ::Penguine (5 years): how should I fly?
::donald ::Duck (4 years): yippee, fly like an eagle!
::lora ::Parrot (6 years): yippee, fly like an eagle!

There are similar introspection options for mixin guards as those for filter guards. In particular, we can use info mixinguard and info instmixinguard for getting the mixin guards for a particular mixin or instmixin respectively.

Querying, Setting, Altering Filter and Mixin Lists

The methods mixin, instmixin, filter and instfilter are system slots having the same query and update interface.
  • If one of those methods is called without argument, it returns the current setting.
  • If it is called with one argument, the argument is used to set the specified list as indicated in the above examples.
  • If these methods are called with more than one argument, the first argument is used to specify the action. Possible values for the action are set, get, add and delete. See below for commonly used examples.

obj mixin same as: obj info mixin
obj mixin {C1 C2} same as: obj mixin assign {C1 C2}
obj mixin assign {C1 C2}sets the mixins for obj
obj mixin add C3 adds the mixin C3 on front of the mixin list
obj mixin add C3 end adds the mixin C3 at the end the mixin list
obj mixin add C3 3 adds the mixin C3 at the 3rd position
obj mixin delete ::C3removes the mixin C3 from the mixin list. Use absolute class names. delete supports an optional flag -nocomplain that does not produce an error, when the specified class is not in the list.

Note, that the list of possible actions can be extended by extending the class ::xotcl::Relations.

Querying Call-stack Information

Since the presented interceptors are normal XOTcl instprocs they can access all XOTcl introspection abilities introduced so far. In instprocs all recent information is accessible within their scope. But the interceptors are mechanisms, which cover more then their sole scope. The meaningful usage of the meta-programming abilities often requires to go further and to get information from the caller's and the callee's scope (e.g for delegation decisions). Therefore, we introduced rich call-stack informations for the interceptors. Note, that these are also available for ordinary methods, but the "called..." info options return empty strings.

All call-stack information are packed compactly into the self primitive as additional options. Note, before XOTcl version 0.84 these were implemented as a part of the info method. They are part of the self command for conceptual integrity: introspection options in info can be expected to produce the same result, when they are not explicitly changed. In contrast, all information provided by self are call-stack dependent.

Querying Call-stack Information via self

self activelevel

Returns the stack level from where the current command was invoked from, or where the last next was called (whatever is closer to the invocation). If the current command was invoked from an XOTcl method the absolute level is returned (e.g. #4) which can be used in the uplevel or upvar Tcl command or XOTcl method. If the current command was not invoked from an XOTcl method, the value 1 is returned.

self calledproc

Returns the name of the method which was invoked in the original call.

self calledclass

Returns the name of the class which presumably (if no dynamic class change occurs afterwards) is invoked in the original call.

self callingclass

Returns the name of the class from which the call was invoked (if one exists, otherwise an empty string).

self callinglevel

Returns the stack level from where the current command was invoked from. In contrary to activelevel next-calls are ignored in the computation. If the current command was invoked from an XOTcl method the absolute level is returned (e.g. #4) which can be used in the uplevel or upvar Tcl command or XOTcl method. If the current command was not invoked from an XOTcl method, the value 1 is returned.

self callingproc

Returns the name of the method from which the call was invoked (if one exists, otherwise an empty string).

self callingobject

Returns the name of the object from which the call was invoked (if one exists, otherwise an empty string).

self filterreg

In a filter: returns the name of the object/class on which the filter is registered. Returns either 'objName filter filterName' or 'className instfilter filterName'.

self isnextcall

Return 1 if this method was invoked via next, otherwise 0

self next

Return the "next" method on the path as a string, i.e. the method which will be called by [next].


Note, that three options with the prefix calling represent the values of self, self proc, and self class in the scope where the original call was invoked. In the following section we will show a simple program in which all of the info options have different values.


Filter Call-stack Information Example

Now we discuss a simple example that shows that all filter introspection options may have different values:

  Class InfoTrace
  InfoTrace instproc infoTraceFilter args { 
    puts "SELF:                [self]"
    puts "SELF PROC:           [self proc]"
    puts "SELF CLASS:          [self class]"
    puts "INFO CLASS:          [my info class]"
    puts "CALLED PROC:         [self calledproc]"
    puts "CALLING PROC:        [self callingproc]"
    puts "CALLING OBJECT:      [self callingobject]"
    puts "CALLING CLASS:       [self callingclass]"
    puts "REGISTRATION CLASS:  [self filterreg]"
    puts "CALLING LEVEL:       [self callinglevel]"
    puts "ACTIVE LEVEL:        [self activelevel]"
    next
  }

  Class CallingObjectsClass
  CallingObjectsClass callingObject

  Class FilterRegClass -superclass InfoTrace
  Class FilteredObjectsClass -superclass FilterRegClass 
  FilteredObjectsClass  filteredObject 

  CallingObjectsClass instproc callingProc args {
     filteredObject set someVar 0
  }    
  FilterRegClass instfilter infoTraceFilter

The invocation of callingObject callingProc produces the following output:

  SELF:                ::filteredObject
  SELF PROC:           infoTraceFilter
  SELF CLASS:          ::InfoTrace
  INFO CLASS:          ::FilteredObjectsClass
  CALLED PROC:         set
  CALLING PROC:        callingProc
  CALLING OBJECT:      ::callingObject
  CALLING CLASS:       ::CallingObjectsClass
  REGISTRATION CLASS:  ::FilterRegClass instfilter infoTraceFilter
  CALLING LEVEL:       #1
  ACTIVE LEVEL:        #1

The filter reports for self the value filteredObject, since this is the object on which the set call is invoked; infoTraceFilter is the method of the filter, and therefore, the actual proc, while the actual class is InfoTrace, the filter's class. The class of the actual object is FilteredObjectsClass.

The called procedure is set. While the program stays in a XOTcl-instproc all calling-info-options are set, the calling procedure is callingProc, the calling class is the class, where the method is defined (namely CallingObjectsClass), and the object from which the call invoked is callingObject.

In this example, the calling level is equal to the active level, both are #1.

Slots

A slot is a meta-object that manages property-changes of objects. A property is either an attribute or a role in an relation. In a nutshell, a slot has among other attributes:

  • a name (which it used to access it),
  • a domain (object or class on which it can be used) , and
  • can be multivalued or not.

We distinguish between system slots (predefined slots like class, superclass, mixin, instmixin, filter, instfilter) and attribute slots (e.g. attributes of classes).

System Slots

System slots are predefined slots defining e.g. some relations between classes, or between objects and classes. The predefined system slots are:

  • superclass: every class in XOTcl has one or more superclasses. The name of this slot is superclass, the domain is ::xotcl::Class, the slot is multivalued, since one object might have multiple superclasses.

  • class: every object has a class; therefore, the domain of the slot is ::xotcl::Class, the property is not multivalued.

  • mixin: every object in XOTcl can have one or more mixin classes. The name of this slot is mixin, the domain is ::xotcl::Object , the slot is multivalued.

  • instmixin: same as above, but the domain is ::xotcl::Class.

  • filter, instfilter: similar to mixin and instmixin.

The system slots were introduced earlier with their semantics. Here we just point out, that they have all the same interfaces for querying, setting, adding and removing of slot values.

Every slot can be used set and query the property from its domain. The syntax for setting values is

  object property newValue
and for getting its values is
   set x [object property]
where property denotes the slot name. Every multivalued slot provides the methods add and delete. Here are a few examples for using the system slot mixin which we have introduced already in the section of the mixins
  Object o; Class M; Class N
  o mixin ::M      ;# replacing the per-object mixins of o with M
  o mixin reset ::M  ;# same as before
  o mixin add ::N   ;# add N to the front of the mixin list
  o mixin delete ::M ;# delete M from the mixin list
  puts [o mixin]   ;# query the current mixin list
Every system slot (e.g. superclass) has the exact same interface.

Attribute Slots

Attribute slots are used to manage the setting and querying of instance variables. We define now a person with three attributes name, salary and projects.

  Class Person -slots {
    Attribute name
    Attribute salary -default 0
    Attribute projects -default {} -multivalued true
  }

These attributes might have a default value or they might be multivalued. When an instance of class Person is created, the slot names can be used for specifying values for the slots.

  Person p1 -name "Joe"	

Object p1 has three instance variables, namely name, salary and projects. Since slot projects is multivalued, we can add a value to the list of values the add subcommand.

  Project project1 -name XOTcl \
     -description "A highly flexible OO scripting language"

  p1 projects add ::project1
  p1 projects add some-other-value

The value of the instance variable project of Person p1 is now the list {some-other-value ::project1}.

Attribute slots are implemented via dynamic object aggregations (see below), where the Class objects contain the slot objects with the information like default etc. In order to prevent name clashes between the slot objects and the methods of a class (like e.g. create), an intermediary object named slot is used as a container of the slot objects. In the example above we create an object structure of the following form:

  Person
  Person slot name
  Person slot salary
  Person slot projects

This object structure can be used to to query and modify the slot properties or to add additional methods to the slot objects. One application is for example to used slot-specific methods for checking slot values, as shown in the next section.

  Person info vars  ;# results in the list of variables of ::Person
  Person slot name info vars ;# list of variables of the slot object ::Person::slot::name
Since slot objects are ordinary XOTcl objects, they can have their own slots as well (such as default, name etc.). The following example sets and queries the default of the slot name of Person:

  Person slot name default "gustaf"
  ? {Person slot name default} gustaf

However, due to the current implementation, it is necessary to re-init the slot object when the slot properties (such as e.g. default) are changed. This can be achieved by calling the method init of the slot object.

Note that a statement for creating a slot object like

  ... {
    Attribute name
    ...
  }

is a short hand notation for

  ... {
    Attribute create name
    ...
  }

This is exactly the same situation like every where else in XOTcl, when an object/class is created. One has to use create explicitly, when a name of a slot object conflicts with a method of the class (e.g. one has to use "Attribute create class" if a slot named class is created).

One cannot define on a meta-class an attribute named slot or slots and use then "... MetaClass Foo -slots { ::xotcl::Attribute x}... to create the slot objects. To handle this naming conflict, one has to create the slot objects outside of the aggregation and to provide the values for the properties of Attribute (domain, manager, .... ) by hand.

Setter and Getter Methods for Slots

When a slot is called via its name, the call is delegated to the slot object. Per default, the slot value is read via the get method of the slot and it is set the assign method. By redefining these methods, it is possible to provide custom setter and getter methods. The following example redefines the setter methods assign to check, whether an attribute value is within the range between 1 and 99.

  Class create A -slots {
    Attribute foo -default 1 -proc assign {domain var value} {
      if {$value < 0 || $value > 99} {
        error "$value is not in the range of 0 .. 99"
      }  
      $domain set $var $value
    }
  }

  A create a1
  ? {a1 foo 10} 10
  ? {a1 foo} 10
  ? {catch {a1 foo -1}} 1

For the most common simple cases with single valued attributes, where neither setter or getter are redefined, XOTcl optimizes the slot access function and replaces the delegation to the slot object by the the C-level implementation of instparametercmd.

Note that it is possible to subclass Attribute (e.g. in order to store more properties for attributes, like when attributes are stored in a relational database) or to register mixin-classes or filters.

Backward-compatible Short-Hand Notation for Attribute Slots

XOTcl provides a short-hand notation for creating attribute slots, which is backward compatible for the most important options of XOTcl verison prior to 1.5.0. Instead of writing

  Class Car -slots {
    Attribute owner
    Attribute doors -default 4
  }

one can use as well

  Class Car -parameter {
    owner
    {doors 4}
  }

The various features of the prior implementation of parameter are deprecated and will be removed in future versions.

Experimental Slot Features

Value Checking

Attribute slots can have types assigned which are tested whenever the instance variable is altered. The slot salary is defined as integer whereas projects is defined to be a list of instances of the class ::Project (a list of instances, since projects is defined as multivalued).

  Class Person -slots {
    Attribute name
    Attribute salary -default 0 -type integer
    Attribute projects -default {} -multivalued true -type ::Project
    ...
  }

  Person p2 -name "Sue"	-salary 1000

It is as well possible to define custom value checkers and to normalize the input values. We extend the previous example and define "my sex" as value for type. If the value checker consists of multiple words, the type check compiler assumes that the value is a Tcl command, to which the actual value is appended as additional argument before invocation. my refers to the slot object. In the example below, we define for the slot object an object specific method that returns 1 or 0 depending on the success of the check. This method (a) checks the values via switch and (b) normalizes and resets the value via uplevel.

  Class Person -slots {
    ...
    Attribute sex -type "my sex" -proc sex {value} {
      switch -glob $value {
        m* {my uplevel {$obj set $var m}; return 1}
        f* {my uplevel {$obj set $var f}; return 1}
        default {return 0}
      }
    }
  }

The slot values are actually checked via Tcl variable traces whenever the associated variable gets a new value assigned. This means that the values are enforced now matter how the variables are set. Therefore, the checks are performed in the following two commands as well, although the slot values are not accessed via the slot names. The checks will throw an error in the second command, since 1100x is not an integer.

  p2 incr salary 100
  p2 append salary x

Similarly the second command below will throw an error, since some-other-value is not an instance of ::Project.

  p2 projects add ::project1
  p2 projects add some-other-value     

When a check throws an error, the instance variables are reset to the previous value. To restore the original value, an associative array __oldvalue() is kept as instance variable in the object.

In general, checking of variables can be turned off globally by

  ::xotcl::Slot instmixin add ::xotcl::Slot::Nocheck

This mixin replaces the methods check and checkall as well as mk_type_checker by no-ops. When the mixin is active and the Attribute definitions are loaded, the specified type has no effect.

Value checking can be turned off also selectively for each slot via using ::xotcl::Slot::Nocheck as per-object-mixin; if attributes are subclassed, it is possible to register the Nocheck mixin on a subclass of Attribute.

Init Commands and Value Commands for Slot Values

An init command (initcmd) of a slot is similar to a default and is a command to be executed when the value of the associated variable is read the first time. That means that when an object is created the associated variable has no value. On the contrary, when a default is used, the variable is set to the default value, when the object is created.

The primary advantage of slot init commands is Lacy initialization: When an object has many slots and the initialization of all slots is costly (e.g. the value of each slot is fetched from a relational database), and not all of the values are needed for each instance, only the relevant variables of the object are initialized on demand.
  Class C -slots {
    Attribute x -initcmd {puts {init}; set _ 101}
  }

  C c1
  c1 info vars  ;# ==> returns ""
  c1 set  x     ;# ==> puts init, returns 101
  c1 info vars  ;# ==> returns "x"

The initcmd is executed only once, when the variable is read the first time. For later reads of the variable contents, the values are returned.

A value command (valuecmd) of a slot is similar to a a init command, except that it is executed whenever the value of the variable is read. A value command can be used e.g. to implement live updates for variables or for abstracting from sql sequences or the like.

Finally the value changed command (valuechangedcmd) can be used to specify the behavior, whenever the value of the variable is altered. This option is used to implement the value checking described in the last section.

The slot parameters default, initcmd and valuecmd have to be used mutually exclusively.

Nested Classes and Dynamic Object Aggregations

Most object-oriented analysis and design methods are based on the concepts of generalization and aggregation. Generalization is achieved through class hierarchies and inheritance, while static aggregation is provided through embedding. Since version 8.0 Tcl offers a namespace concept which can be used as a mechanism to provide dynamic aggregations.

A namespace provides an encapsulation of variable and procedure names in order to prevent unwanted name collisions with other system components. Each namespace has a unique identifier which becomes part of the fully qualified variable and procedure names. Namespaces are therefore already object-based in the terminology of Wegner. OTcl is object-oriented since it offers classes and class inheritance. Its objects are also namespaces, but an object is more than only a namespace. Therefore, two incompatible namespace concepts have existed in OTcl in parallel.

In XOTcl every object and every class is logically implemented as a separate Tcl namespace. The biggest benefit of this design decision aside from performance advantages is the ability to aggregate objects and nest classes. Contrary in OTcl every object has a global identifier. Through the introspection abilities of namespaces nested classes are also traceable at runtime and can be changed dynamically. In XOTcl objects are allowed to contain nested objects, which are dynamically changeable aggregates of the containing object.

Nested Classes

The notation for nested classes follows the syntax of Tcl namespaces by using ``::'' as a delimiter. For example the description of a oval carpet and a desk can nest inside of the OvalOffice class:

  Class OvalOffice
  # general carpet
  Class Carpet
  Class OvalOffice::Desk
  # special oval carpet - no name collision
  Class OvalOffice::Carpet -superclass ::Carpet

Nested classes can be used exactly like ordinary classes, a user can sub-class it, derive instances, etc. The information about the nesting structure of classes is available through the info instance method:

  className info classchildren ?pattern?
  className info classparent

The classchildren option returns a list of children, if one or more exist, otherwise it returns an empty string. classparent results in the name of the parent class, if the class is nested. Since nested classes are realized through namespaces, all functionality offered by Tcl's namespace command is usable from XOTcl as well.

Dynamic Object Aggregations

The nested classes only provide an aggregation of the descriptive not of the runtime properties of an object. We have pointed out the difference of object and class in XOTcl. Because of the splitting of a class into class and class-object it is possible to give each object its own namespace. The internal implementation of objects enable them to contain nested objects, which are aggregates of the containing object. In XOTcl these can be changed dynamically and introspected through the language support of dynamic object aggregations [Neumann and Zdun 2000b]. Suppose an object of the class Agent should aggregate some property objects of an agent, such as head and body:

  ClassAgent
  Agent myAgent

  Class Agent::Head
  Class Agent::Body

  Agent::Head ::myAgent::myHead
  Agent::Body ::myAgent::myBody

Now the objects myHead and myBody are part of the myAgent object and they are accessible through a qualification using ``::'' (or through Tcl's namespace command). But in the common case they will be accessed, as introduced so far: the explicit full qualification is not necessary when such variables are being accessed from within XOTcl methods, since the object changes to its namespace.

The information about the part-of relationship of objects can be obtained exactly the same way as for classes through the info interface:

  objName info children ?pattern?
  objName info parent

Relationship between Class Nesting and Object Aggregation

The classes Head and Body are children of the Agent class. It is likely that all agents, interactive or not, have properties for head and body. This implies a static or predetermined relationship between class nesting and object aggregation. Such predetermination do not exist in XOTcl, but are simply build, when specifying the relationship in the constructor, e.g.:

  Agent instproc init args {
    ::Agent::Head [self]::myHead
    ::Agent::Body [self]::myBody
  }

Now all agents derived from the class have the two property objects aggregated after creation. But still they are changeable in a dynamical manner, e.g. with:

  Agent myAgent
  myAgent::myHead destroy

The agent turns into a headless agent. In companion of the introspection mechanisms such constructions could be very useful. Suppose, that in the virtual world the agents heads may be slashed from their bodies. The graphical system simply needs to ask with info children on the agent's object, whether it has a head or not and can choose the appropriate graphical representation.

Simplified Syntax for Creating Nested Object Structures

To ease the generation of nested structures, one can use the predefined method contains. In essence, contains changes the namespace, where objects are created to the object, on which it is executed. In the example below, we create three nested rectangles, where two of these contain two more points. The outer rectangle is r0 containing rectangle r1 and r2.
  Class Point -parameter {{x 100} {y 300}}
  Class Rectangle -parameter {color}

  Rectangle r0 -color pink -contains {
    Rectangle r1 -color red -contains {
      Point x1 -x 1 -y 2
      Point x2 -x 1 -y 2
    }
    Rectangle r2 -color green -contains {
      Point x1
      Point x2
    }
  }

  ? {r0 color} pink
  ? {r0 r1 color} red
  ? {r0 r1 x1 x} 1
  ? {r0 r1 x2 y} 2
  ? {r0 r2 color} green

Every object in XOTcl is realized as a Tcl command. If nested objects are created, these commands are available as object specific methods. So, instead of calling the contained rectangle r1 via the fully qualfied name ::r0::r1, one can use r0 r1. This is exactly the same situation as it arises, when e.g. a global Tcl proc proc o1 {} {...} and an XOTcl object o1 (created via Object o1) is created. Both commands cannot coexist in the same namespace.

Copy/Move

Often an object has to be copied/moved. This is a very useful functionality when XOTcl should be used as a prototyping language. The XOTcl method move provides this functionality. Another common behavior is implemented by the copy method which clones the actual object to a destination object via a deep copy operation. The two methods have the syntax:
  objName move destination
  objName copy destination

Copy and move operations work with all object/class information, i.e., information on filters, mixins, parameters, etc. are automatically copied. Copy and move are integrated with class nesting and object aggregations. All copy/move operations are deep copy operations: all nested objects/classes are automatically copied/moved, too. E.g. if we want to reuse an imperial march object of star wars for star wars 2, we can just copy the object:

  starWars::imperialMarch copy starWars2::imperialMarch
Note that move is implemented in current versions of xotcl as a copy plus subsequent destroy operation.

Method Forwarding

As you have seen from many previous examples, XOTcl's primary command for method forwarding is the next primitive. next calls the same-named method of the current object, usually with the same argument list. However, frequently method forwarding is required between different objects as well, commonly referred to as delegation.

In general, delegation can be achieved in XOTcl without any special construct using simple methods containing a few lines. However, In several situations, forwarding is as well needed to plain Tcl commands, for example, if object oriented stubs are implemented on base of non-oo function calls. These functions might access instance variables of the objects. XOTcl uses this functionality in various situations, such as for instance in the implementation of the set, unset, append, array methods among others.

The fowarding functionality is suppored by XOTcl be the methods forward and instforward that address these requirements and provide an efficient implementation for these tasks.

The forwarding command specifies that whenever methodName is called, this invocation is delegated to callee, where the actual argument list (from the invocation) is appended to the argument list specified in the forwarding command. Like for procs and instprocs, we can distinguish between forward and instforward, depending on we want to the method available for a single object of for the instances of a class.

The general form of the forwarding commands is:

  obj  forward methodName ?options? callee ?arglist? 
  cls  instforward methodName ?options? callee ?arglist? 
where valid options are -objscope, -methodprefix, -earlybinding and -default. The option -objscope is used to specify that the command should be executed in the scope of the calling object (i.e. instance variables apprear as local varibales), -methodprefix means that the called method should be prefixed with the specified string (to avoid name clashes), -earlybinding means that the function pointer of the specified command (callee) is take at invocation time (should only be done for (builtin) commands inplemented in C), and -default provides a means for providing default methods when none are specifed.

Each of the arguments after the method name (including callee) can be be substituted an invocation time, or they are taken literally. The arguments to be substituted are starting always with a percent sign. These arguemnts can be %self, %proc, %1, %argclindex, or % followed by a Tcl command, and it can be prefixed with a positional prefix %@. We will introduce the usage of these options and argument substitutions based on examples.

In our first example we define an object dog and an object tail. If the dog receives the call wag it delegates this call to the tail and returns its result. In this introductory example, the method tail simply returns its arguments.

In this example, forwarding is achieved through the method forward that creates a forwarder command. This method receives as first argument the name, under which the forwarder is registered, followed by the object that receives the delegation (the "callee"), followed my the (optional) method name and optional arguments. More about this later. Here we register the forwarder under the name wag, the callee is tail, and the method is defined to have the name of the forwarder. We could have written here dog forward wag tail wag as well, be we use %proc which refers to the name of the forwarder. Using %proc is slightly more general in cases the forwarder is renamed.

  ###########################################
  # trivial object delegation
  ###########################################
  Object dog
  Object tail
  tail proc wag args { return $args }
  dog forward wag tail %proc

With these definitions a call to "dog wag 100" calls actually "tail wag 100" which returns the result of 100.

The following command shows the delegation to a Tcl command (instead of delegation to an object). We define a simple forwarder that forwards a call to the Tcl command expr with some arguments.

  ###########################################
  # adding 
  ###########################################
  Object obj
  obj forward addOne expr 1 +
The invocation obj addOne 5 returns 6 as value.

In our next example we want additionally that the Tcl command should to be evaluated in the context of the current object. This means that the method can easily access instance variables of the delegating object. We define a forwarder for the class X with the name Incr (to avoid confusion with the already defined method incr), we use the -objscope option and specify incr as the callee. Since the forwarder is defined via instforward the forwarder is available to all instances of the class.

  ###########################################
  # evaluating in scope 
  ###########################################
  Class X -parameter {{x 1}}
  X instforward Incr -objscope incr
  
  X x1 -x 100
  x1 Incr x
  x1 Incr x
  x1 Incr x
After the three calls to Incr the call x1 x returns the value 103.

In our next example, we show the usage of the %-substitution more advanced argument handling. This example sketches the implementation of the mixin add, mixin set methods as shown above. In order to obtain extensible subcommands (such as mixin add, mixin delete, etc.), we define an object for which the subcommands are defined as methods. We will use this object as callee for the appropriate methods. So, we define an object named mixin and define a forwarder with the name Mixin (again we capitalize Mixin to avoid name clashes with the already defined methodmixin ).

  ###########################################
  # mixin example
  ###########################################
  Object create mixin
  mixin proc unknown {m args} {return [concat [self] $m $args]}
  obj forward Mixin mixin %1 %self
We define here the method unknown to see what arguments are passed. The following invocation will lead to the call in noted in the comment.
  obj Mixin add M1       ;# calls ::mixin add ::obj M1
You see that %1 was substituted by the first argument of the invocation (here add) and %self was substituted by the name of the current object (here ::obj). The second argument of the invocation (here M1) was appended as usual. However, in calls like
  obj Mixin
we have to deal with cases, where the used argument (%1) is not given at the invocation. In this case we get either an error message, or we can specify a default argument via the option -default:
  obj forward Mixin -default {getter setter} mixin %1 %self
This definition means that if no argument is specified in the invocation we call the method getter, if one argument is given the method setter, in other cases we use the specified arguments. Therefore the following three invocations are delegated as indicated in the comments.
  obj Mixin              ;# calls ::mixin getter ::obj
  obj Mixin M1           ;# calls ::mixin setter ::obj M1
  obj Mixin add M1       ;# calls ::mixin add ::obj M1

When we implement subcommands by delegating to other commands (as shown in the last example), there can be situations where naming conflicts might arise. For example, if we want to implement a subcommand method class we might not want to implement a new method class on the callee, since this would overwrite the standard definition of class. To overcome such difficulties, we provide the option -methodprefix. The following example shows how to prefix every called method with the prefix @.

  ###########################################
  # sketching extensible info
  ###########################################
  Object Info
  Info proc @mixin {o} {
    $o info mixin
  }
  Info proc @class {o} { ;# without prefix, doing here a [Info class] would be wrong
    $o info class
  }
  Info proc @help {o} { ;# define a new subcommand for info
    foreach c [my info procs] {lappend result [string range $c 1 end]}
    return $result
  }
  Object instforward Info -methodprefix @ Info %1 %self 
With this definitions, the following call is rewritten as indicated in the comment.
  x1 Info class          ;# ::Info @class ::x1

When a forwarder is defined, the callee (the target command) can be omitted. When the callee is not specified, the method-name is used instead. When the method-name has a namespace prefix, the method name is the tail and the callee is the fully qualified name.

  ###########################################
  # optional callee
  ###########################################
  obj set x 2
  obj forward append -objscope
  Object n; Object n::x
  obj forward ::n::x
With this definitions of the forwarder append and x, the following calls are rewritten as indicated in the comment.
  obj append x y z        ;# ::append x y z ... returning  2yz
  obj x self              ;# ::n::x self    ... returning  ::n::x

The forwarder append forwards the call to the Tcl command append, which accesses the instance variable x and appends the specified values.

The list of tokens executed by the forwarder might contain Tcl commands executed during every invocations. This makes it for instance possible to pass instances variables to the callee. In the next example the object has the instvar named x which is multiplied by a factor of 10 when the method x* is invoked.

  ###########################################
  # command substitution
  ###########################################
  obj set x 10
  obj forward x* expr {%my set x} *
With this definitions, the following call is rewritten as indicated in the comment.
  obj x* 10               ;# expr 10 * 10 ... returning  100

In certain situations it is necessary to insert arguments always at the same position (e.g. at the second to last position). The positional addressing can be achieved by prefixing the arguments of the forward specification by %@POS , where POS is either a positive (argument positing from the beginning) or negative integer (argument counting from the end) or the constant end (denoting the last position). After POS a single space is used as a delimiter for the rest of the argument, which might be some other %-substitution or a constant. The positional arguments are evaluated from left to right and should be used in ascending order.

The following examples show a few usages of the positional arguments in the forwarder. The forwarders f1 to f5 are created, followed by one or more usages. The first argument of the usage is the call to to forewarder, the second argument is the result.

  ###########################################
  # forwarding with positional arguments
  ###########################################
  Object obj
  obj forward f1 list {%@end 13}
  ? {obj f1 1 2 3 } [list 1 2 3 13]

  obj forward f2 list {%@-1 13}
  ? {obj f2 1 2 3 } [list 1 2 13 3]

  obj forward f3 list {%@1 13}
  ? {obj f3 1 2 3 } [list 13 1 2 3]
  ? {obj f3} [list 13]

  obj forward f4 list {%@2 13}
  ? {obj f4 1 2 3 } [list 1 13 2 3]

  obj forward f5 {%@end 99} {%@0 list} 10
  ? {obj f5} [list 10 99]
  ? {obj f5 a b c} [list 10 a b c 99]

The construct %argclindex LIST can be used to substitute an argument depending on the number of arguments when the forwarder is invoked. For example, it is possible to call forward to a different method depending on how many arguments are specified. The number of arguments is used as an index in the specified list. When the number of arguments is larger than the number of elements in the specified list, an error is generated.

  ###############################################
  # substitution depending on number of arguments
  ###############################################
  obj forward f %self [list %argclindex [list a b c]]
  obj proc a args {return [list [self proc] $args]}
  obj proc b args {return [list [self proc] $args]}
  obj proc c args {return [list [self proc] $args]}
  ? {obj f} [list a {}]
  ? {obj f 1 } [list b 1]
  ? {obj f 1 2} [list c {1 2}]
  ? {catch {obj f 1 2 3}} 1

Finally, the concluding example defines a class chan to use the I/O-commands in an OO-manner. The proc open is used to create a chan instance. For the channel object we provide the method close (to close a channel and to destroy the channel object), puts (to write on a stream), blocked (to check whether last command exhausted all input), and fconfigure (to configure the stream). Note that for puts we specified that the actual stream should be inserted as the second to last argument.

  Class chan -parameter stream
  # create stream and object
  chan proc open args { 
    set stream [eval open $args]
    my create $stream -stream $stream  ;# make an object
  }
  # close stream and destroy object
  chan instproc close {} {
    close [my stream]
    [self] destroy
  }
  # handle other subcommands (methods) via unknown
  chan instproc unknown {m args} {
    set valid [lsort [chan info instcommands]]
    stderr puts "unknown chan method '$m' $args called; 
      	defined methods: $valid"
  }
  chan create stdout -stream stdout   ;# define standard stream
  chan create stderr -stream stderr   ;# define standard stream

  chan instforward puts puts {%@-1 %my stream}
  chan instforward blocked fblocked {%my stream}
  chan instforward fconfigure fconfigure {%my stream} 

  set c [chan open /tmp/junk w]
  $c puts -nonewline "hello"
  $c puts -nonewline " world"
  $c puts ""
  $c xxx                                       ;# trigger unknown
  # The stream instances denote the currently open streams
  stderr puts "currently open streams: [chan info instances]" 
  $c close
  stderr puts "currently open streams: [chan info instances]"

Assertions

In order to improve reliability and self documentation we added assertions to XOTcl. The implemented assertions are modeled after the ``design by contract'' concept of Bertrand Meyer. In XOTcl assertions can be specified in form of formal and informal pre- and post-conditions for each method. The conditions are defined as a list of and-combined constraints. The formal conditions have the form of normal Tcl conditions, while the informal conditions are defined as comments (specified with a starting ``#''). The lists containing the pre- and post-conditions are appended to the method definition (see example below).

Since XOTcl offers per-object specialization it is desirable to specify conditions within objects as well (this is different to the concept of Meyer). Furthermore there may be conditions which must be valid for the whole class or object at any visible state (that means in every pre- and post-condition). These are called invariants and may be defined with following syntax for class invariants:

  className instinvar invariantList

or for objects invariants:

  objName invar invariantList

Logically all invariants are appended to the pre- and post-conditions with a logical ``and''. All assertions can be introspected.

Since assertions are contracts they need not to be tested if one can be sure that the contracts are fulfilled by the partners. But for example when a component has changed or a new one is developed the assertions could be checked on demand. For this purpose the check method can be used either to test the pre- or the post-conditions. The syntax is:

  objName check ?all? ?instinvar? ?invar? ?pre? ?post?

Per default all options are turned off. check all turns all assertion options for an object on, an arbitrary list (maybe empty) can be used for the selection of certain options. Assertion options are introspected by the info check option. The following class is equipped with assertions:

  Class Sensor -parameter {{value 1}}
  Sensor instinvar {
    {[regexp {^[0-9]$} [my value]] == 1}
  }
  Sensor instproc incrValue {} {
    my incr value
  } {
    {# pre-condition:} 
    {[my value] > 0}
  } {
    {# post-condition:} 
    {[my value] > 1}
  }

The parameter instance method defines an instance variable value with value 1. The invariant expresses the condition (using the Tcl command regexp), that the value must be a single decimal digit. The method definition expresses the formal contract between the class and its clients that the method incrValue only gets input-states in which the value of the variable value is positive. If this contract is fulfilled by the client, the class commits itself to supply a post-condition where the variable's value is larger than 1. The formal conditions are ordinary Tcl conditions. If checking is turned on for sensor s:

  s check all

the pre-conditions and invariants are tested at the beginning and the post-condition and invariants are tested at the end of the method execution automatically. A broken assertion, like calling incrValue 9 times (would break the invariant of being a single digit) results in an error message.

In assertions we do not check methods that modify or introspect assertions. These are check,info,proc,instproc,invar, and instinvar. The reason for this is that we want to be able to recover a malicious action in a catch error handler, like:

  ...
  if {[catch {my assertionBreakingAction} errMsg]} {
    puts "CAUGHT ERROR: $errMsg"
    # remember checking options, for turning them on later again
    set check [my info check]
    my check {}
    # recover from broken assertion
    ...
    # turning checking on again 
    $fb check $check
  }

Meta-Data and Automatic Documentation

To enhance the understandability and the consistency between documentation and program it is useful to have a facility to make the documentation a part of the program. There are several kinds of meta-data which are interesting for a class, e.g. the author, a description, the version, etc.

Older versions of XOTcl have contained a special meta-data command metadata. This command is now (from version 0.83) deprecated and replaced by an integrated solution with XOTcl's API documentation functionality. The object @ is used for documentation and metadata issues. Per default it is not evaluated at all. Everything that is send to @ is simply ignored. That way we do not waste memory/performance at runtime, if we do not require to parse the metadata/documentation.

If we have to know the meta-data/documentation, as for instance in the xoDoc component and the makeDoc tool, that handle XOTcl's internal documentation, we have to re-define the documentation object. Alternatively, we can partially parse the source code for @ commands.

With @ the meta-data/documentation is handled by first class XOTcl objects. By defining alternate @ implementations - as in xoDoc/makeDoc - we can evaluate the meta-data/documentation arbitrarily. xoDoc/makeDoc are only an HTML back-end, but the basic idea is to provide support for several other usages as well (e.g. XML, RDF, on-line help, documentation of dynamic structures, etc).

The object@ handles comments via its unknown method. xoDoc adds the appropriate instprocs to t@ to produce HTML output. The appropriate command is:

  tclsh src/lib/makeDoc.xotcl DOCDIR DOCFILES

The source of a documentation is structurally very similar to the XOTcl constructs being commented. E.g. one can copy an instproc and add comments at the right places, like:

    Class C
    C instproc m {a1 a2} {
       return [expr {$a1+$a2}]
    }

can be commented as follows

    @ Class C { description { "my sample class"} }
    @ C instproc m {a1 "first number" a2 "second number"} {
       description "add two numbers"
       return "sum of a1 and a2"
    }

One can do essentially a copy+paste of the source and add the comments via attribute value pairs. Every basic language construct can have a "description". If you want to include other properties to the description, you can add them like:

    @ C instproc m {a1 "first number" a2 "second number"} {
       author "GN+UZ"
       date "Feb 31"
       description "add two numbers"
       return "sum of a1 and a2"
    }

This way, author and date are added automatically to the generated HTML file. In addition, there is a @File hook for a per file description, like:

@ @File {
  description {
    This is a file which provides a regression test
    for the features of the XOTcl - Language. 
  }
}

Additional Functionalities

Abstract Classes

In XOTcl a class is defined abstract if at least one method of this class is abstract. The instance method abstract defines an abstract method and specifies its interface. Direct calls to abstract methods produce an error message. E.g. a Storage class provides an abstract interface for access to different storage forms:

  Class Storage
  Storage abstract instproc open  {name}       
  Storage abstract instproc store {key value}
  Storage abstract instproc list  {}         
  Storage abstract instproc fetch key        
  Storage abstract instproc close {}         
  Storage abstract instproc delete {k} 

All kinds of storage have to implement every method from the interface. E.g. a GNU Database Access, a relational database access, and several other storage forms may be derived by sub-classing (therefore, all conform to the same storage access interface).

Checking Commands for being Objects, Classes, or Meta-Classes

Since XOTcl is a hybrid language containing several Tcl commands, sometimes its necessary for applications to distinguish between Tcl commands and object commands for XOTcl. method of the Object class looks up an objName and returns 1 if it is an object and 0 if not:

  objName1 isobject objName2

If one can be sure that a command represents an object, it might be unsure if the command is only an object or also class or even meta-class. The two instance methods isclass and ismetaclass check in the same manner, whether a class or meta-class is given (since ever XOTcl class is an object, they also return 0, when objName is not an XOTcl object).

  objName1 isclass objName2
  objName1 ismetaclass objName2

Exit Handler

A task for a programming language, sometimes of similar importance as object creation, is the object destruction. XOTcl ensures that all objects are destroyed and their destructors are invoked when XOTcl applications terminate. For that reason objects and classes are destroyed in the order objects, classes, meta-classes. Sometimes further destruction order is of importance. For these cases, the XOTcl language provides an exit handler, which is a user-defined proc, which invokes user-defined exit handling just before the destruction of objects, classes, meta-classes is invoked. For instance, the exit handler lets the user specify objects which have to be destroyed before all other objects.

The exit handler is defined as a proc of Object, which is per default empty:

  ::xotcl::Object proc __exitHandler {} {
    # clients should append exit handlers to this proc body
    ;
  }

There are some procs of the Object class pre-defined, which let us specify an exit handler conveniently:

   Object setExitHandler body
   Object getExitHandler
   Object unsetExitHandler

setExitHandler lets us specify a proc body that actually contains the user-defined exit handling:

   Object setExitHandler {
     aObj destroy
     puts "exiting"
   }

destroys the object aObj before all other objects and prints the message existing to the screen. With getExitHandler the exit handler can be introspected. E.g. if we just want to append the destruction of object bObj to an existing exit handler, we use getExitHandler:

   Object setExitHandler "[Object getExitHandler]; bObj destroy"

unsetExitHandler deletes the exit handler.


Automatic Name Creation

The XOTcl autoname instance method provides an simple way to take the task of automatically creating names out of the responsibility of the programmer. The example below shows how to create on each invocation of method new an agent with a fresh name (prefixed with agent):

  Agent proc new args {
    eval my [my autoname agent] $args
  }

Autonames may have format strings as in the Tcl 'format' command. E.g.:

  objName autoname a%06d

produces

  a000000, a000001, a000002, ...

Integrating XOTcl Programs with C Extensions (such as TK)

Because all XOTcl commands are in the ::xotcl namespace, it is usually no problem to integrate XOTcl with other Tcl extensions. Most often it works to import the XOTcl commands (like Object, Class) into the current namespace because there are no name-clashes with the commands defined by other extensions.

Consider you want to perform a deeper integration of an other extension and XOTcl because you want to benefit from XOTcl's object system. For instance, you might want to introduce composite TK widgets (sometimes called mega-widgets) as classes and inherit from these classes. Here, you have two options: you can change or extend the C code of that other extension to provide XOTcl classes or objects, or you can write an XOTcl wrapper in Tcl. For the first alternative, there are some examples provided in the XOTcl distribution. XOTclGdbm provides an OO Tcl interface to the GDBM database, for instance. XOTclSdbm does the same for SDBM, and the TclExpat wrapper provides a class-based interface to the TclExpat XML parser.

Consider you do not want to change the C code of a Tcl extension. Then you can write an OO wrapper in XOTcl for the commands of the other extension. For stateless commands, you can simply write forwarder methods. If the extension maintains some state, you typically associate the state handle with an XOTcl parameter, acquire the state in the XOTcl constructor, and align the XOTcl destructor with the stateful instance.

Consider you want to wrap the Tk button widget. You can acquire the widget in the constructor, and maintain the widget ID in a parameter. You now can forward invocations to this widget ID (e.g. when using "pack"), or register command callbacks (like buttonPressed). Note that we let the "self" command be replaced in the scope of the current method so that TK receives the correct object ID for the callback. In the destructor we destroy the widget as well (we use "catch" because sometimes widgets can destroyed by other means as well (e.g. by their parent widget, when a widget/object hierarchy is destroyed at once).

  Class MyButton -parameter {button}
  MyButton instproc buttonPressed args {
    puts "pressed [my button]"
  }
  MyButton instproc init args {
    set ID [namespace tail [self]]
    my instvar button
    set button [button .$ID \
      -text "My Button $ID" \
      -command [list [self] buttonPressed]] 
    pack $button
    next
  }
  MyButton instproc destroy args {
     catch {destroy [my button]}
     next
  }

  # a test -> 3 buttons, destroy one of them
  foreach b {a b c} {
    MyButton $b
  }
  b destroy

The "trick" to substitute "self" within the current method scope works for all kinds of command callbacks. Extensions such as TK, however, often work with bindings to (global) variables as well. Using global variables is frowned upon in the OO community. Instead you should use instance variables of objects. As Tcl can only bind to existing namespace variables (and XOTcl acquires the namespace of an object on demand), you have to make sure that the namespace of an object exists before binding a variable. That can be done with "requireNamespace":

  GUIClass instproc buildEntry win {
    my requireNamespace
    entry $win -textvariable [self]::entryValue
    my set entryValue {Init Value}
  }

Note that in the above example we have used to tail of the object ID as ID for the widget. Usually, it is a good idea to the object name, if possible, for TK (and other extensions) IDs as well. Another option is to use a autoname to get a unique name for the ID.

Sometimes you want to simply send all invocations, not implemented by XOTcl, to the wrapped command. Here, it is tedious to write a wrapper for each of these methods. Instead you can use "unknown" to handle automatic forwarding. Consider you want to wrap TK commands like pack and replace XOTcl object names with their TK widget ID, so that you can use both IDs synonymously. You can rename the respective TK commands in the following way:

  foreach tkCommand {bell bind bindtags clipboard event 
    focus font grid image lower option pack place raise 
    selection send tk tkwait winfo wm} { 
    rename ::$tkCommand __tk_$tkCommand
    TkCommand ::$tkCommand
    ::$tkCommand set wrapped __tk_$tkCommand
  }

The XOTcl class handling the ID substitution for the TK command might look as follows:

  Class TkCommand -parameter wrapped
  TkCommand instproc unknown args {
      my instvar wrapped
      set args [Widget replaceWithWidgetIDs $args]
      # now call the command
      eval $wrapped $args
  }

References

[Zdun, Strembeck, Neumann 2007] U. Zdun, M. Strembeck, G. Neumann: Object-Based and Class-Based Composition of Transitive Mixins, Information and Software Technology, 49(8) 2007 .

[Neumann and Zdun 1999a] G. Neumann and U. Zdun. Filters as a language support for design patterns in object-oriented scripting languages. In Proceedings of COOTS'99, 5th Conference on Object-Oriented Technologies and Systems, San Diego, May 1999.

[Neumann and Zdun 1999b] G. Neumann and U. Zdun. Implementing object-specific design patterns using per-object mixins. In Proc. of NOSA`99, Second Nordic Workshop on Software Architecture, Ronneby, Sweden, August 1999.

[Neumann and Zdun 1999c] G. Neumann and U. Zdun. Enhancing object-based system composition through per-object mixins. In Proceedings of Asia-Pacific Software Engineering Conference (APSEC), Takamatsu, Japan, December 1999.

[Neumann and Zdun 2000a] G. Neumann and U. Zdun. XOTCL, an object-oriented scripting language. In Proceedings of Tcl2k: The 7th USENIX Tcl/Tk Conference, Austin, Texas, February 2000.

[Neumann and Zdun 2000b] G. Neumann and U. Zdun. Towards the Usage of Dynamic Object Aggregations as a Form of Composition In: Proceedings of Symposium of Applied Computing (SAC'00), Como, Italy, Mar 19-21, 2000.

[Ousterhout 1990] J. K. Ousterhout. Tcl: An embeddable command language. In Proc. of the 1990 Winter USENIX Conference, January 1990.

[Ousterhout 1998] J. K. Ousterhout. Scripting: Higher Level Programming for the 21st Century, IEEE Computer 31(3), March 1998.

[Wetherall and Lindblad 1995] D. Wetherall and C. J. Lindblad. Extending Tcl for Dynamic Object-Oriented Programming. Proc. of the Tcl/Tk Workshop '95, July 1995. ./xotcl-1.6.8/doc/._tutorial.pdf000644 000765 000024 00000000430 12161600406 017131 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/tutorial.pdf000644 000765 000024 00001026417 12161600406 016732 0ustar00neumannstaff000000 000000 %PDF-1.4 %âãÏÓ 1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>stream x¤¸T”mó?NJƒ€4ÈÒ!°ìÒÝÝÒR.°4»twKHw—”€ )Ý(‚”” "%!ù[Ÿç}Ô÷9çÿ=ç8g—¹®¹çškæ3Ÿ™{™è4µ9¥,áæPy8ÌÄÅ- PƒÃà®N (ÄâÃfb’…[¸;BanÚîNN¶PˇPW¸»‹ÔU`…xêö„®Ž­›ôØLzPW[8Lø¿Öd\ 7Ä‚,Ä ¡¨cãаp€ na>na0ææþyì_Špa€£­=›Iîäíbkmã& øç_«ÛOu€¹7@ÚÖÍÕ aÜ‘ ³àH98þ|À€ðêâµäúÍ @jÑsXØ@`ÖPWÄ °…œÜÍl-–pGˆ- ›  …A]ÞZþ<ågœäá.ÖпÜqƒ¬6nnNÂ@àÏ`XýÜârµâ‚AÝ€lˆ[ÈÁ,eàŽ?ÃçŠýóaY[¨…ÜÅxh{ÜæûË‚•-Ìò¯ØZº;ua¶ÎîP%YÀßjˆ%ìÛ5k¨€ÄÏ/È @P/ àÏct¼ €Ÿ›-C`–þ¾Np'€ÄÁêokE|aûºB< 7w¨¿ï¯¿KØ ÀÒ‘#s¨5" ·ÖËP«¿e5ˆ›‹­Àˆ›‹›››WP,pÿüûC6AäÇsð¾}TâürõlJKý¾œ n!⃇âáÀ €ÿïfþ Ðñ— MDúþ÷íiJ0+8à¿BDò?—=þ†)€õ'èÙ¿ªÃÝlÁz‹n ÄÇ_pý?ãϘþ? î§Ú>0ýÿBýÿ ê ¼»ƒÃ_ù`ý›¸Ð8Ú:xÿiéCV€U·ÿ_Ú¡óï´€JnDÁIÁ¬ ÈüÌhë*oëµÔ´u³°ù ¡ÿY×…YB]laPM¸«íOp"ñ禎­…= êê !Êâo‹W D@||ü­@a–¿g(³€[Ú¬`„ ÄÅâð‘`>>€/âQ“P¯¿* ä‚ÁÝvdáæ`AìŸXâÿ&NÄêß <@DA:@êý½Â tv‡#¸ÄÜávsw4ÿ @ëŸôóM~ %ÜÁâr»"t‚"xq‹”GÄ¢+¢Ào…þ>ÃqDHÿ«ËË tBPÌjuk€ô÷â_Ìz« B\Ý .¶®ö·k<@'w×[™h 6ÈíÐÆÛÉz{^þŸÛÂo]ãº:@\mnú@]à·²»õ™èæy»ËºÙ¸@Ù#X×ý6D|<@+[§ý÷Î|¼@W/ý#ò]¡¿xÈÇü¨ÿhatÝ>!ˆ¸¥fÿ(!L8Úþ¾ÈÏ tø‰¶ÿ*ñƒ€PgwÈmŠùÁ@k¥ Bz«ÃƒÈÔõ/ ÿó/r›~> Ô­:?PúVÊÜ ‚@Ù[A(÷ À ”¿@@…[ T¼x€J·/PùVàªÜ ü@Õ[A¨v+Õo! Æ?‚ 7PóVµn0ðá­ÀÔ¾x:·P÷VàêÝ @ý[Ahp+ ÿ„¸nÐÜbaE )¿hŽXý™B<ÿÕý½6„9rµ°µµ°uAŒE·¦ù€î?¹ÉÕŽ#þ›P!~DÞ6Ù€·#$4¿ÝZü#€¸¹·Uƒ˜2€·&@ÜÐÿ¢É´þEâÞˆ›hûË?ÐîIx[Ü nAà-Z-x{3ˆx‹¼-H tºµ B`ú‰x wQ{¿ìño ÝÙzü" =o%07ð¶œA`Ðû—=0ÐçéïüAË4Ì‹Hõ/^ùþÊ2‚¥~¶«ÿf æÿ;Én¶–¿DQç08ÌQÉönýëA?‹þ/²·D s·¦¥ÿeƒøy€?¹ÑÄ~É?‚MÝ]ìlñË…àý Y!¦<„³p{(ì·+ð#81Qþì…ÿøÏ/´´…º@]m‰9?aÿ¢oU$w±´BpÚoÄ­Ým Žðß«$:À­m- ˆ&ø‹!Ľ¬Üþh sãÏ#èà:B,\~õYÑð –ü%ÞˆŽ‡è9×~i< ÁŸMÁÕý¯ÞòK.„þîÿ»ƒ !ˆ…»Û/–A@Ç_ 'ˆ€1Ä‚¨U§_ÊGÑòþê_?ø»ÿ‚ˆ|A-á¹­f ßÏÞõ/§óÿŒ°#‚5ÜN.·A¸ ñüi ÑC\~í Á¿Ú£ Äá@0Ü_Mñ?Ê¿$\ôO‹ù““ú—@º“ú#F¦“ú›å¬ƒÏ?¹Bô¥? ÁsRÿ 8! ”Ëo0G0ž”Ü/–„€2†ñ:”ûÝ90‚ÿä~wŒ A¹qÌÍ”ûOÀܼ@¥?mò•þ´ÉTúW›@¥±)”s»E Ašê¿‡Œ`N?ŽEЧÆÇ"8TãߎE°©ÆŸyÿë ‚ZÝÜlïUÿÍÄÔø½£4«û§;‚@Ý?Ýêþ›;êÕýß³lø‡0¨cw¹¥#0Ñ£ .Žˆ!ÕÜáŸ`ÿ,¹_Ú#ÁÇ?Í!¸ø_ýA´Ò?ÂFŒÃÿâ¢ò Á<>¸­C0hñ?0D ó6úÍ9Ä8ÿ‡s<¼@è¿9ÇÃDÐà æáÚþiShû§MAঋßêÌ#´ý_›ˆ±ú+ =ì°ð‚ð?ŽååÂÿ8–—ÿ·«ð"híOƒFûOMÇÃö—† æEÐØ äºÿá bÊwÿÃĤïþoÎðîÿ{2bì÷þÓ/‚!¢›þöèoïøw_·¿~è@¼bÿG¶²E¼AA¡^P l²“ªîu#´üòÝ{$ÍéÆÉõÀåðsÿ× !ø1âd¸äµJã+>:¬58L÷Òh°bŽLлgÃŽGü†è[Á>½jByÕÓf_}H†áêùb˜’G>-ŠXTíYUÑl^\"»z˜Zü]¯Õê3‘Å$‚T×ì´»YŒ<ѱUÚ†–Z&æëžE½_8œ×Ò€xâ,³ íµYmilûçÆçòí\i®±ißj€ùHõ O‰jªSPœö” 7Çö•°×‡vHµè{YÂ&·Ëí\ 1ó5™]"ð}|r.¾\ôÔ A¾¾Òä¯ëpôU]WSg^ûß_4+†ÒSÍÑ)NT d0»¼WýHa•=Ú'ÁðF@Â꺴‚Pt¥½S¹†XWï:¬RõQ‚S‡çæTVÊ+gÚåui~X>ËúÁ /Ý“ÞOqùRûJ)ªÔ?ˆÙ‘•øº8Ô1Šù>i’ö´\⊓ˆbTu¿À]A^:‚ÄíVf:'åsrÉ|^ïÙubñ1ÕÀJf z1è[SVNû6ÜÕr½-]‰¬WMËAù“|– ª·ÅÐ>ÖS1@1ðà`¿€He¿3±¶cÐ,1©™ÁÎVúŠ8j”…5„¾&•9tU[ìs_î¾È9Ê3¾žÖTP(\ðd_*©ÌÚ}!4Npg#3²?m(Ÿ}yø2Ë yêañ'*X±^Ð]v9%{]¾×ð.4"$õqh<ë™Ü÷ûì6e‚¥†[Ÿ»Þ¸‡uWœ×5N gêb†[$‹d)›k0½½3Ì(ÊE*m­Ýº‹†ÚÄ=GûF óa ðVð‚6øÀA-†ähdz™_—.³ÓxÒïÊ\—¢[~“Wz­¦ïhaKñY­§dgd¤2k|½—ÖžmŒ>%J€~d›Ü+=;Vz[i1s5ÂØò Á¬d êØÕE díé–7Ñå2½½vÏÙœÖùÒ=ß°s¢dzĂѵÏS¨à'ÝÝ8‰D¸ÌйiØþPÕ˜ºÍ4›sæ ÅënT™+ž`xX»âp}Í)@Róö †EáS~]ƒŽîÑ¿<"ã<>a¢’Vð½~2ì÷:ý!V«Þ9)}~µ´åÚž×Ã}¶Ï€:ûáëq@µñPVµdÃïÃ?¶©º].¸Ê¢tð] "l:ËÃÇIoœ¼Z‰82¤†¨ÉÄW!¯ŠÙzÙ ü°Uéõ¯]G5‡½ý[¤\Àsú"¼WyLå'*NuÞÖlgrÓzNLÕÅ“`^ã¢ÖÅŽóÖ–“ôõ=N1Âüà8|®@ø¹+-ÿMˆÚ稫,ü@Vâ’ÊPܧg²ÆUŸ‘“Ƀï¤ÒéßćDô|s"‘>Á?W¯± }–h"dvÕªÄpÌOÊž”Õ ­·×ÿ²9&ZùྠpIº mªb¸¯!ì´ØZÖ¿ßí÷i&cÄ>jP‚—ëÉ9ÕVd’íüyÿ©dßÓŠòò{ìCoÈ=¹¿óM\£„å„éλr5÷ z–¸ëœ7ë7MÅ—uÛ[g»@¦*ƒóD,E*™ðЮèBaš+Þ—\‰ýÇÔôéiV,VO£T¶;ÃgÁ%ý¦ïž]wÞL­)Ò”§×+…:ªnÑPi]ÛR-ˆâ¯IÖ¬"O]D3ð?Ζ¥ìHˆ£Aë¶tO”stŠ$ ®×Ó@ÞZÅÞwÍõÕ+­ŠÎ‘ãr™€ìa› Êèþq+{À=_÷òu–bú“‘Ô=&xÏ&¡×4¿N«Ðï/xüè9«Ï3šÉá]Cª'¯œ™mÓñü•¶”çíÇHk?kÆ0m™hãeåûnF à•|t`¤Àxº(ëÃ.³ë{°‚§÷f®H{‘ѳ¡"1A‹»Þ²ë¡“$Töý:Ì>WÿÐ^›>CφºljïýÛcWÂa—QŽö£9‹Ól¯±.Å%p2® á™ãÑùh¤1ߨ2Ì:®6-¿{àû™bøCóZvÛ¦âÖ&Š4ƒèÛ'Y›”"‚häzÊU$ëo›:…“Ùâ¢d*ýYýà m.´iŸ¥¼ùÔ:ëGì‚’Ù#¦Ù0SÅnôf#izQ½¦z ²‰(cõ&ÊÛ üd×à«MqÆ#ÍÄK×›ßþÏ꟢çñÚ&9Æ‚Çù‹/è^'ÃÀ€úc˜]àÀ€Ÿ²ÊÅÆ3¥z|½W)ç±rã:t¼Þxô'8/¨Ó(G"‡ n¯â™”MìÉî_¡&|ýà)»Þ–õJºÿí õÊ^˜*^‹Òý5n~Räè’×T R¹ ë¾àË8žq·´©o´Ûq/†U Ÿa,Ä=W(0(gÒQ¥ÒPí¸šÏBk³%×)Âöä“](Î롺7lIOàö–ôMQ¡ö¢¬@EEšûîûYþZÂHºxf†Óq#Úk«H·OÃ#ëîpks!“‹Gs† íÄèÌ¥©qx¡¬¤T©MÃã>pMÕò(w|Ý.z"Ö“²ðÊS)–9‚vÏEŸÊÈJÁËÜ’ŠJPj!®P¯Òbðàšbò”ApCgVËíŸÀ÷<ÍKJÝ;oÀn\¼™Ý¥že‘¼¯> ºÐ:÷ÞÍ«.ú+®-Ü”ê;}›§†>!«{‡.‡—³ì_Wñ´P^E„ÈRUÝ›?ŸUЯx¬õà ¸Ù<Ûqäx”%£nx0i—ÜäH9Q¡÷°Ž—¥€9G;NUæ^ÂCý­ë—´K øcGß‹œ¾¼ö/µôëÐAìºÙ‘ÂÉI¶·¬4gçWt¶<98š!ø°n£^`úÒ0¶q I0‰õêøˆ„æ³$› ³f‡§pT¦\!üFé[º¿±Üjõ*¿ËÅ šæ„´åT[4îzÿ¹îÇYÍr½‚_á®u#!¼ÞjKy”R6ÔÝhüœõ¾ÑiÛ¯ƒOÃbUJ¿Žùµx756ËaŸ›=sÎzºÏ7ãRÈ_­$%ôÔ3 £½t1:÷JªJ×™Ô¯Á>ŠÆš8gª4ㆠÔ²¶2í.N)Ôœκö»›ñ8»‰ÑÇqR¹CÄká¾ReíIÚ¤¶-¼×¿ø½\ä4Ë(ï·kÏS9]_×"£Ç>½éÀ%ó¨:¾H¿!óY¬‚¼ßgöEzC¢”Ö¼B[ÄšþÀ¯à%–`âåjžpŸÐÙ͈Ý*,ZÈvM.vr*ÿ™²N‰©òœZ•$‡eª+\`æ¼Ðà)×á¬8˜Ñ¯y‡ýñwê¾@¶?ŽŒÎj× ®ÅЬÜ>¦‰‹„ãÅÆžJ|ÍiO–+RÑMìA¢ñ~«ï­9àÚØ›úJÌ8zÍ Lšý,üOåª|›B^O­Öò->Á¤ #«X,>Jw‘™ô\)láYó“Élòï% ½»Ë¦üê]ÚñÁéVáSãèÔ±ûôjm7#*£iL;K‡Þ&ïÅ‚#J¿­=iøâ†R§ö äå|á1’wMVÁ‹Ò;d–Å`¼¬†ÆwÔ*o*U_&ÙÉ ùæÆ‹é}V¸Ež&ÂPUµ˜^Z6­xËx}ê&·Ž É¡¹Ú´í³|«Ó#·¬œþ ¹¡Y"þ~7¦ÖÑùǧú]ýÄ¥î=ïBúC*UëØ#3vƒäjá²Ú¹ÄªÁ‚{ßH—6â Çr|ÆÊ€¼Üa* y2T^ ¬T#»G ¥8Wo·(H÷ŽÚ Hàï®ÞÎs4€í²®\_lJZDìäwŒÌ-‡X8¿ÎûhpIÈ\±$UMQM-Â>6fS©=ï=ô*ì™j‘*ãc:"ÔTÝÖŽ}/ªáL«’Œ‰ö 0ÄXkò³³ öžakJRM«4NH•ÀÃÜ_7Ríõ3Ðí®3ièÆ¯ñè»Y¾côX¹ƒqâŽ>©tr%w9Ƕ¿3;¤Eæ!~õÝíQû›\/ÀÞÞ”©m`Îã~} tºðQã‹T*  wx\Šž)á¹Æž ãÑ<ˆ&Ф&C*/ïçJÚ{ý `ßCÌ×28Íì &ÊP5¯ð⑬Ú:Ú0ÏÄüêoœUMÒtp_ftp– Š[faÜ#Qw™—¼IPÐÊ!u;^¡žÖMEë¿'ñYiOƒf£1*R¸°0ËÇ2úŽêB`Ê¡¬–ªuWì u fnŸ^e­@;#EÚ‚4MHß«å~N`~G³õ±cÝeßz·á®Ã.îë.ô‡¡ÏÞ²×*^–-„§ÿ0m‹‡\ôŸÔ¿EEÏ`¦ ×ùÓûáî¥nÁïåÍ4SgeÂbx¾1,_¯'!iByj¶»ˆ½1P›žgˆ¦™Q?œìÄÙò˜.¿\qyÿ>¬Žãð]b‡`Þ |(Y¥â„¢îlץДTÕ<òº_á}‚9¸ÿ^‘ú{ôóíÓ¾4š¬{š®VTß Z\ëìÜÄ~“ÿû#ù§~¾–þ£”}/_›Ò<[@¶WZŒi…wc©:d9‰Díø…¸) ¤Ë´¿I7töˆX#DÚüO·ûÖÒI[ÿ¿Rh÷%ng".E2tä#a¿ ,Rl]Ã{¬ÙsW®µœˆØ><å ÓwÑ1é«|úz2rÂÞÂèÝ øu©ž â"<6nΆ¸;ÄZ2èJÇNa}4H¡‰í¹mõŠØg?´V>*Ð'ŠR|WWÌùQŽâÖ ú ·t€l˜NÚÑèœ\O©ºû ö:º«½ @tÿƒ-nm=E©þá’øŒfzª¦œÛÞbG@y Îþ›´<®z1“vN —}ñx1ŠDq¸'å 1‰{¥­Í[} áÞ‡¸X5 8…c3½Ôgíå3¥B‡œ×¨ ÄÊåäÔ/c^œäó‘U W‘š±Ó–¸­X›;gJ:2GݲÚÀšêË¢ŒUù‘«&ŸÄõÅýtg‰§XÀíPŠ“è49òúY2Ù»d‚´¨¯./—'›ñkL¶ýPKGút·Jýøçkã*Œ”¹½¡Ò²Íôžœ,L=^Jí +CuMï6 Öþa·s´bøBº˜‰r§öC‚µOÀÃá< E­–ŠNMSI¯åȲTè—ˎwj™Ÿ ŠŸ‰2q _}ay›®’Èœ_•ð’hÈâ¶™Cûðùó.›ÑW$…qÁCBbBþb*ËÜ)“˜÷<­J†EœžÝ‘"õДëõusNK,àn ¹ä[wõ;Iá‘ËŒC"<î<‹µÃ§Ó{Ø¢ªö!Û]ÅëG„0dÚKå'Í.ï^Ðç:êG› ~îI…$Û¤aÌÌ–„Zãù=Ì36¦Ǽ/ §~S¾c¬ÖAñ£TÏ*ew¡)C É8$Ó¢ÂL¼þ +°ã”Y!46Fé£py Ü]›ì‚,|•sÁù‡¬ÒÔćîë—Þ ó3;'çÄe«7ME;ïÝ•Ä+iOˆÄ¹{ò©§[*“iH/ÔÕ0ôîEãud!&HÉ!›cQÏo´à(ª5±QX°+BWš~ |ô#ჸ'P¼TµÁ¦Z¶… nµâ­¥lk[òñÂólãâsÕð¹AH4C3>X/³ËÇ_>»ÒÂ=RÜwpAsÅzW”iA=%Ž/«¿Į̀p' þf¾âŽM¡îvé{¶ÂA}²z½4‘Õ™aÉĸ¼ê©Ëã3m Œ9Uk &RÕÂVNÉúÃq„Æ‘%^›Šô¤ˆãE3D¿U¹Jž´sÿø¨ ?yÛôÅÒÅt–Õ3š`5NÔo) ØLgƒf£XY”†›ýò,‘¡›9ÃuEúô1æWòtا³Õ†žÀpßÐU+zr§}Þ¨(æ—Itz°ö>dϼt7°q¬^‹5Šx”Ùb-áÂ_œÛÈsj½záÄ.‡EŽ©³EßÐNº;¾—ZµÜ–ÖÆxÜ1wn÷e ÿ¸#Z™û›¾îPÉì€æ¾PÎXK`sð[Ü+í®À>ž¨¥íºÚ Ê€êëP€hBήԊ[ïÛûë?5ñpÿPÆrÙÝúT}8uˆ¶—{"-m±³nïvP4b=¸1b /õ{± }rHQïÙ™ɇ¬² Ivàñ|6Á'j E÷èº9^ŸãÞ~úª3)C†69J:³ëø,š{H€Iè#úÖÛܹ2Åá»òÌ‘ƒ­ÍFÜÆÂ vp!=¿ÉŽn-ÜñA…|ˆB;¦öæ=uùÊÍ•Ù!XLáÃ'»ÜX2Çkf蔓½;‹Jà‰ oR¸ãh€G—UêK§›w¡½¢éyj h­"KÆÙ§Ft¦Åh«lviÉûÐd¬IYO÷Y ‚Qã Ê=‡ kcndtoBžÊËŒB]g†Õ>¥d¿˜„ëÔtu/.µ·&2§XsWrü}RwÞS<¨|æC¼Ð¾tÒL‚úš!íQÇ|˜2ӱ܊³ ÊC¥¤oD÷°ó}Í«ÀÉü@À»OôäHƒãùk´©— öVæu½ŠYl–sßL+‡}¢‡OM#ùâ>ìåµ=l… Œ¶pƼ5‰–T+R¸ìC›%E¶é縟Ҕ®¿8š$¦!ì°•.@¾àÍ/¤2kÈ]Ta·”)OfïHMVƒLÅÔÔ…lL•“a>TâivÊ9œJyÌ”+;†li42ÚÛ–5¬›ìABÊìx¢`Ô VtZŒU£‡ $ÿìTdTHO¼ãŸ}bòpTñŸÈ ÇýQSJ?Ío2,>4&D*Çi«Yl½ª *„(OÄ|+¤—ÃgîŒâ$Xdÿ¢£_ûeêñá“ïÔh^ YµÁoÎÌUQ»9ÈÐw©ÆœmÍ¢£ám„ýCŸ}š:·íj¨bÏÕ‘:¦X6æëý¸¶l:¿mpj³}=GîNw±¸YùøŽªD…°R’éO¼"׫‹;oÜÚn-ë¯Å+¶Tò.nTÉЗd¬Û¾Iív?&'½¦ôÜü^ݺ>¦¶¬AôÍÁ…νE0_èL*¸çÉÁ«‡y¹qaÍkÖ =Ç~Ÿ½·#Æq ¾Ý8Ó%+^êŒç(ڙ䔟ÚD¾S \£Óï÷¯ŸÎs k4LǵH”û1ŠÉ ‘tØ/?ôê¢&ÅÂàö0±©&#Å]žÈ.ÓI4µJp›>ª(< ôwÁ|¿jâ*™œ¢R®Œ?3øÖß$ÊĎتþzKÇ9š³§mZ ÿVp,ùP.‹`hÈü GHžEI:VT¸:cr/lx”›Ó2óž m€6Õ×ðGÆSÜ>cH½yºûöU$»4´V›–1ï1ñä…›&Ï6j„(cÙYI Þ ›åÁTeÒgœ¯i¾«>Ÿ·ýZžÆ™oZ?ŽÿЧëÈ“l‰ îZ(òrˆÂ0t¹öÕϼ|“Ò±>]Î’bBè6&ìŸeùx’&jŸ÷ÁƒïZ£$s!êrÎàF‚xJE»Oµ•uŒ;q‚>Ê“"º¬¨lñ U<óP…ÕÖ«oüäüÙ‘ù: útj&ØãÔ1qñ3Tá\ö—IÁ¯siù‘À¼ù a],Lö†ÔµŠ5ìɺZÂñS75ݤ„ðxñ޲áÔäi»–xu4­ÉðÀ æòÐ_m·M‡‘Ýïñ‘{FËÑæ&è­}Ÿ½ùÛ.I7"XŒ˜#Ʋ(¹O#NXã¸ßî·èjÖëòGtƒôØH̃Š(w¢|ÈÚë²UÙÆhÔ1óµ’ɨ‹§v)‰" *Nª´µxSõ#u½Ô~æú½¯4GvÊr³™Q Û±ú‰Ð>•ù&MU„Y~!€wm1uRòéT°Ä“ÙûVöÞ}B0Ó™=W˜Ë&IôÓûEI×]t @1¹ÈâÆŽˆfrøó›¥ež³¦³¹ñ‰ª'/ü/‹3ï`o2ˆú˜Í-\{·Àø0††6HÔ­s“!E¯hwtÉ0õÙ”ïm®Â–ó‹w1üÓÁñK„ìN,hÓdÍÉ ¯D•©m:Þ>?sŒSÕQÞ²X-ÊáŽw#0™”¨šXd¥qaJ0W«ÜQ&Ì7c¡–&MŠœ[óçÝ­¶Q/Â=ÌÛS±/™1•ÚÞêÈ;S3j/… T¢?&Û<SŠBÔ‚ñRWL*úw¡ò¢ÖÀ£Ç+w5 Êrý„òÑ£sìÙ¢?1¯ÀÙ" ÛðOVk¾gv®ÃÙçˆÒ¬XӰ↴Mï‘l¶ã Ê®aùÌnìîÕø`f8~Mu…?R`p0æs¥ÉtÆk±Øá•}}†J쀬0Äo0IþjòÙR®99Äkƒ%ú!ØŠ;Ø@såûKñ“Vûç‹y5NWcRDé…Ö^nÙ§i¿>XR7ǽk©ÌʾZöâ†WÔÄÎò³¯†yÛ°2=¶ý.@F)ï5Ø£ãkªžÅwW†eèaF•泂ɯ—œò˜VYÉ£"uû N‹vÍCn“L±ê±:ïÔ{¯ wmýbž7„¯/ø¹_<¼ÆšM÷¢¬ô[Z¢’K|ö¤ÑbŠüÆ„9«kŠ%–×ì1+‘Ÿ5‡˜X°¾Ð(áMØV¬È!E eOËƒÕ îòñû=Ñ¡ íø(2HÌf«ÙvF'®Þ_ØçŸvZ¶´3àŽ™Z‡h©É»Ú'hHO„‘íaghÑ•×évÃhðçÚÄ·’˜çA¯Ë Ž·0C2†¸x¿0½éK{à`àÝTSøƒfóæ‡œDÆ m}]¦*^ËâH” ‹Èì¼åNy ð¢ß±á"~©1 ›”cæäÕ¾€¯ÌÆbîtÊ3™÷%ÅÑŠ÷ëˆbÆ¿ 8d/ h>N`¥*ݯ t®¹·F pkÖz^农¼rRò(*j퓳>™un[©ÓN³8“ W3ü!Ú´SúVìÄÛ³™>÷x3n-±FHÅùq¦·ï;‚~žÄ¥Ç؉û ^¡6þÕ‹?ܤ² ~„ Î_¢Z¸6¾ùô¶ÙVJ䛿¡•JXÐ*ƒv¤2E:6ð[÷«2¢Œ\3ê—¶@Óµ‚{§¤ÓuÒçÄvsr§Á=±÷ßàØßµÍºZ‰)ÐN^'îzƒ­e¿#;^™Hé-W/;ªzÝ­éOò¦)`ˆ·Î-7Ô§†‘\بKÆ€ÁM}¨ìЖjjŸ+r"þZq»Së…ß.ý3Ôû+ên?Âð<Šî´•Ã'2-_R>ÉøÞ>i˜õ„ú¤T/ÆæIÑ£Ïj©!+F¤Ä¹ûtùkŽആøR/”§×!ʪèôæä+ɦ(÷k¢ÐbÐÙ—Qâó]éÒâ2åûÍÒ¡Oâb˜M ^ò¥¿Û2k4Ò{ŽR¦Ë÷\ÙÍùÚ&òˆÊߨ»öÍ¥êìN#&'òÂ'%LˆoD Ëtk¨Šj¹ù.á˜]tó1±Åb«Ï©Ÿ1õ~&<’çUR^.øè¼ëîÜö†°rP ¦NÌÁ,j¨TŒþë^²´KSb¬o3Øs:e×”5‚Lq‰Ì> éq(ç²,3‚/Uݳ»²Š–¯)×Õì/›Wr_ «À¯ÝE˜’Hì½ååMh´†¯nH[—-¯Èïí,¯ùQ4áÔFß ¾ë‡ ð–B1©>¸ÇмŸ¬×ùs¢w}%7´C·¡tJ~õn,z‹Ìòåšµm =úBÞ/ÙÙFÅ©}x4_¯ºD©–KoÞAÆbJ–$lÓ`Ü*EÿÖ(ä&‡L¦Y`Èlüî²éóÓ±ƒmz—ü†‘Q0E"’×A E„ꨋݜTgõ Ç *ŽÊÊ<Âcš?4†©oVœ|ˆþìÃÌÛ~£_¯è Ì6ãÊù¡s÷>ýÀ}KoŠ×oÏ(ê fèŸ÷èÜKåî öÅûž`dº HÌ®pSÄ[Sí¶1eÌ‘÷N $6{|÷PŠ÷ÂU0ø…|H› 5wgÖ²¹ð¤eògiP ‡ûµkÖ³ü‹N¥kDéVóí:Ì)b{|„AÊäÓî1it@Å$<›*•þν¼I¹P&q®—×ÊÇØ¥€«.å‡- Ó ô6÷ŠÞ}\;ARL›øÈœ$‹i"Ÿ$¹%tÔ—.+*9\x/ ”Xã47A['êîÅž9‘J Z¯Ä女ƒÂ"ˈÞvËÔö^Ⱥx}Iá¸{?É8uÙ2ŽÅ8ŽZ2q~OÕ_ßXm¿·´äói4Íý)#|K& Ä 8.ä|>é{¶’ ê^Ôeƒ¤¨ýôcéù’ W8‡ÝI^DâÛÚøüH§Ý&-b1,bÓ2Ùv™Ó/)}ªÕ)¶­®ÔÄ[©iF&T ZPØ÷æ·ÕÊ.óü‡ÔZµ’ÖÍR£§îøïõ.6SúÜgH<··¸ÓLùáhf‡Dvßs-.ùõ.aý˜ùÔ¶¤å5âÇ.óWË+Îíš.²ÖµÞÇ/V©gË6K3ÝâŽÒëïÑÏÂu¬Œâ6‹Öøžaêl’Ĩ£pº“5V~öpßÔŠµ»·%xcX sqÎæ£Å¦ãO$úÀçI­Þ±ÊÕǯª„¬5PTw9âH"WÝ ?~fæì…]d¡©n½zjo‹Wò“'äÛNß ä&WR§¯Z´Î[þñ¹ž¦@Ë¢˜‘äó=&ÖÄh[þ}CÅ.Þ ù”÷'–•f{mG²7Ðc! sšÖÏÒ¥2m•§î$³ß.µ"vÍò†”Ó¯H-(LR¨güKéü〈Z‹;P‹:í{ê·:ýQºi^(gjü™Þ_Ê''¤f8.mŽü°Pœ`šÎZ N™a¬¡pÒ j<QqHÑ9É—®’'\ÓX|2|÷\Òê[²îÉk•‹¼­Ýäô -¸;%^O÷t¸ƒfyUî>QNëûÕ'iÝ+Dá›™ßÝEK#ó#Ø=ŒlYfkâܶHÓ1W§ðY‚JNžˆË/HFJq[ŠïV´Ýq¯cN£N¯8,³Çb†úU}b 3#è4¨Å%¯qúŠïŒ›^øN™àL»–¼K¹lÁÄèá˜ÐŽg¶{˜Ä½MW ‹: ±Ò`7jº¹Eæ ‹~Xú°‘©¦wðpÒ¿_"‘^Ÿ¢Ó'iªDí´‘GÔ²•ÕÜÝÄ$Õj覒O§J3„ò1H¤àÜÅŽßqÇÐÖA⎈Uùsšù=<³VëÖºP±Xëý¦*vð>à\kKªëÙ.ª¾·6¬éÛKÜf­a§›Èvü&ÆËØ–iLîÖkó«òãrH’ê{FÑÇf-K®G…i yCÈô»ú[½8«¯™’^®ëŽ.î¡ù*©ÒeÊõñ(›ÝÊGƒY%;§‹ö'Ýil+©;÷ù?õ„Æ~m1vÅ£#¬ïD¶ôQ7¹)ÔõrFñŸ]6ãàKÂó{øÏùT}&ååV†I-¥fYÌ›´b`åG$O"”&%áÝ~šgh¯‰XÕ fÂÊ÷Šß›}š× ‰Ý*áâ™OBíí |îƹG$ØÙæò¸Â1]äט˜töž¯EƒòšõcG ¶²ÔÇÜgîžæ Ÿ›ë厶mdáêÒ茱 àÄ©~èa|Íã¤Ê”oúÙQ¨(·é|ßÝìßô|­¥qÂ8‡s­wšS!Þá¦2…§õ>€ÂB:2Šzï€ï+ù® «¡ƒ_šÞKª5RÝC ,^%®ÕKqÙÖÇ”sßWÍûô …×7Óñ€ó춬Võ­™NÀ©7ÙCDe½Î"¦Ág²;œGßhAmè]ú¾ˆyÑcNTY©Ú¶Op®Rü9s5Õó¼x¯,ù¡DºkxLÈÀÏŽÞ’òäùÃÞAítFd8/‹…“¦o½ÍWßæ¯¼g$¦y 20z.ð®ÈºÕêcf®ˆd=Š1×ü0ÄušLkÆ7cr-¡Tž¨â;BµöóF¼=h8#¡}FÃÞ¦Úþ`@!ðQ‰aô%É¶ÔÆ*cíî‘ñf°æÖ ïK}ÃöÕì < šËHÝ]#˜S¸ê_é?<ö‡öf9z‘EÔìÈÃj@ߺ†êØWõ³»ÝŠééÓ¿/%0´F¨˜?³*©jmxY¹€+€žæÓ#iÂ%-_<’5õ2û¨óÀQñÔ¶)…ÞßZ¦?ß±ý!ñ2i“´KX<ï]ÉEy-uÕ}7‘-IUá ÐóOþbøCfœ¹=Mk*ƒ^þt*Øô•÷ìê3,½YÎuè9‹j"c£ Þ-v%”9Œq:Ì0ÓÆ‚Æ0Y^SÖ̉}ã÷Œ’Š/ÒüF³ÓžJ¨òî‡x,ÄrÐx×óýR•ôê ‹ùê8°¯¶áû„n]­›U$ãÁ§‹7­R>dÓ ºeê&æJöþß…œhæ“w4p’ÞŸ\svúÆIsNšÃ^"ðpz^îŒ!¶®S™üY‹¦Ú¬?L/ö<Ö\Ý`‡~lÇ*ý)ÃÑB…ð¸±ÍÑܨ™+IBápZâÈíO;“òøÍ––Uwê9Ûµ8Ç jGÀõØÜ)Ñü¼×uòÈÀ¾0ÎõðÏ‘’Á‘åÙÉ7È9ß´·JDÞ«M™ŒçZÄ8ñìo5ÄöægÅ3Ö|g àp_ÞÞ›»0ž|>KNxÜòŠ)/_Ê{„8üÌ8›zw3G¡j >©‰"þâ\}'[÷  ½¨TTýn"¾+Ó²ÍcÆãZgCS«+p%ÖØi«*‹_"ck’ýò2$a‹õ]é6T_RæåÝùR§Œ¯IŸ"Ù ë©ï±[Ö0°|˜ÃH…„#ÍÃÙ`d±;ÜÒíJ£ÁD¥Å®3eì!ŠËŽ6ôr…¼—­ ?ÎëÞ}“Z|Óú¶ô TÌ‘®cE¥.«™\>Ä£apôâÚÜüÁ÷Ó7¯P}[3¥«ÃzSŸ6øiéý’} ÕÂN¤S<7)øy¿ŸrXÐðÃ2£¦‰vyHF¬¾ÂU$ÛͤÅp¤RåÔ…Ó ËZž: ‚÷áÃßÚýß¡|™ð[å/©g¨U©õ÷Ãì8‡’·çJASvòâpŠž£(…šõôºÝ1Ébo™ÕjµìôOÇp.¿Js"@*>…T¹ µòϱŒD“¥ ¦}Q™¯A èT LEÚVÉ[žc|=¿pE‹þ„m’HvŽ’ÅšHN†Ì.zÍM=GÔJ»ÒŸ]Fw‘àœ*Õ+¶%F3kÍhÜç~¸‰2ì2+įô£ŽVYÚ]}úJ·­OD4/ ­N*Ηú8©ÔÉ ½G̼7¬5q˜¬Ié¼~E.Àpů¦ã‹îÁÜe¾­ f%!i¸P+ z{7ˆd2Q@nR„g&#®£—,õÂð“f³2³±Â ÜG'ÈêÜuµS=€$Á&ŸRõùeÖôîݹ¬ k~ÝO$o>\Ì™œh3W/ ¢ßüèô2}¸ïíÃk­Tí$ug‡ž êÐ9è¥v±AÛ7KBœkÈ®-©y xþÝ?NY5’•Ûä0²$XóÊuY×<’ZÍ"?ù½S!?¯ó$1ªÙé}h÷PnùìU²Ò6ÓvE1g ß7g’>áÙõõMÉyð“ÃÑN;÷ÏíÃÅôÔcúqÂért9R‘6 k`/™ð›ç3š7¯ä¯D¦í;â-mûðŠƒJ‹õ”’S®¤ãýK«Áöh6βl%žqï;Ü¥þ¸ò˜ÔÊûœ^ît%† Ý/nc«°1ÊŽ¥éåt}Ù)Y£÷"’tbŸÏª·ˆw‰Qù nÄÖÜ9^û¤ÝîlŒºYD¯8•dZíüãñ ùÚ}_UHÖ³UtÍG­-£\ÚS¾•"Ô\½&/tç\äÊ;Rž­ˆ8—LˆÀ8覼¹„q‹¾…¬2³ßô4Ë}3b/ïÞä ÷(¶Áô}T©ë —ã§ñ^t×™:)1³z×:ÖH¥ 7 i767xVK«˜x-;z8nDLžŸí¼hÍ a ?¤Èäñ™†eX%çFÖ8VˆäÇ– ‹,*•œ |±Ü:+ìÆÇù¢­ª”¦!´}çKá]všK|&Kñ³gŒ:,s›EÏ}ù-¬ï7} w.›JÅ×G'AL ÜtD­ŒÜHŒ_mo):ú’MѦƒ”:ï;CW†v“*æ{Ž“LG¬âj´WR£4™­å§¤ÎÊ;kw‡®ºÒfš_aN9jÁzrV—î´žœJNÂÇ—»³ÚÅ” Ǿ&=€Rßó]1~©zû$âx:\ïí@­àé—šùYŠÖОÒÖgc/¹ľño{«Šj ëm>ØUè*8]¯7%î¦g {LUŒv-8°í(bê” 7k7—xÝÎ_Ò¿5Çøpòñ(b§Âtýƒ‰òÛlQcr¤ž)Š8Í|ß§ãküDŸŒ’eÞ‹Î+½Ë‡Ê‹ø¨ÍƉ;ì£þ(!$P5ø¾#‡ú-²ÚÃb(㇗ê½ç̸!j2ÙH†åD)ø—´P$-†ÁÑt$TµG­Cç”M\ùó4UÍÄŒQËœ_è*wBuåVyªbÐÉÞ“s+Ù¶l-*u·›s½‘E9ÍÅ­°ÕøØÀÿ,@Ó¿3·žrcìèø¶ë>VÈ, QIÔ]QH«uTÖ¾ª07ÍÈJºˆ%eŠ ÀÑ‘cþ_ÐmVѦ‡ë¶Ë˜îv_q/gÓ`Hø¾TœÇ5@HRf† “P¨†JÎõ^ùïê´Ö&l›ªm=0sÉÞ({Àa~7ê¬K|ÚÓ Ù“·¸ó‡ûš§áøJïNxE¡±µ0jØý¢ƒKYñŽo f"ÙSXEŽBŽ¢7üÄ[˹ÅÝç aþòýç1pjL’å°²UIöØEÄ]” LZO8t @Ú5jV¸ÑUG|¢ktyAn쥺‰* ŽF8¨¼@^'uì:-<( ëÿSX/άi6ÁR¸÷oUo$t¿ZÎ+cU¹L6âš…ʤÂ/ÜùÆ cšÊ§aŸ¿–¥R¦bÛVdáÛOÜN^Ps Ž8|¿“a™RÝŽ#±J8ZÆÂ"®´A'ÚSšž±i‘ðÊ-…g‚Œ#¤Õ$ÍZÙ/ø9öô}p>›ºâ'b„ ÂÞŠ*kð…µ&.lz«è1_1hw(ª©†­·?ø úz!'½Ú|YR” ˪Eº¨“Z—»ˆ¦.Çj²™ AC’ãh©¡"­È¯;ôÎU ±Ò.²Ü‘ns]!\H›×¶+„)p!K €–9pc®|¨âpìçHÒƒ¨7 Oj7 .ÇhBoÚêß­øY…‘¯åY„ìªÓys§Ž­ËÃ÷Û§†NÁ禎ÌTíèŽzb¤®ú²8ºñ¢ yò90Ë÷Ëè,+˜ã(¤pT½G´†7ŸLWK&ôî HOÈi*­²ž ÇpljÜxÝX° ´gƒ ÚN‰²*Ynúª‚-Þüª0½/û±£]ÅK뇿–äÃÒS4Øga×׌P×Ñ;ì(0©gaËÝ¿­í ;jü4ùlõ@â8A "ЯJbM?žåðMˆ×»P.#¯ÐΕ³+0 Ç8[Ș‚¥ê IW…6@Ô¿–<—TDô؈rk"9Éë3þ´ÃA_nÉx'Y÷‘³Ñ³¾æÐ2–­ÐÁ1k$¸TJº×+3¸þ0 ´ìsrïã¬V2‚8¹Nfáì|®ù´ÕíÙÌwwâÉsí÷y1¯?”%K,£'q  2"úÕŽJí(ª³ÚIµ¬òFfjY{òelâ–É[ÂLêÅCsE8¸qPqÿ(GeëT |¢%–³¾Êç=üh¤ù¢‡¸Þ}ü'Ðø`w9Co²X{Áü¦ÇJ —Cªµ¶)’Ø=Â-”:ÐÞ-”¾ûè¡Zþ·}Ô©{L,ÌÛIoŸÂecj5¢ÜUfHµùø £ ¬i ¦9T¼­a/«Á-Hj/ðEpsö*t4[ÊíÏ&êØÐ-?FxǪ‚w!¨(˜La–FD@²%]¹ž Ëqiëg"‘.¿ÜlÔˆú4¥Uo(Ò´H§{%RÜäö h+ m/aàNþñ\®9ý?o{2ò&ÇY¡~laºyÙ1†ÈS½Y×;å×p‰Î)[6ñÀÖaYzo¿…ÁSö$c ¶VKÇU[ш˥˜†²“(Ú$R•~0nàŒÙB­oæir1ëCÛØÓ{JÝ M‰G W²š:}5³ôŸ€7ÊèwJO›ýEÎ0šCBã·Ü6¶÷j{Q¨pà8ãä™nà'ÞËÊTµôÞLI˜F;³à‘œGx¸”ÿD75R uø‚YýQoGÁfÇf>¢Þî3]±£j_àÄ•eª ¾—}¶°}8ÜAæÛ•—˜(mÀ΃\æDYUJ ßYòè¦>-·a–ÎMÕ^‚ë9m]pi3в : õOríã½Â9>ÎÙNÅ,%§UµN%–p/Êh¶MÅTÚÈ\ý™G‡»ò¤yfÏr惵“O¥Ý†ó[Vjð+ÊÞuí,žØþÿ–¹A¬®±Îâ0Ž6öÜ3Ìó-:RôöVxOòÁF%?¨ãz†è/g_µey~ö®kÂÀ³‰ÍµÅ™šóå÷f"zÞÿ9Såÿ©çÕâ«Ðª`ŠRO™´/z A–ûAy§Êo†”ßO]Ä‹µ9F1Ôqg¯GÝ:jñá,uÙGôÁ0º qtÜW{Ira#óOéÇdþbŽ5KC¥õKàòÇR;ðÛ6ÊÖÛ€cñOÃýKipmEæÃâŸNø”?¥_›D½ ÿ¢`fL¬óÂÃÙÎíÁ'Kq€_êˆÃì廡}æ%”'„PÔ¥ΖŒ3 ?à~dñh8Rämû*ŸKµ,oâREû»;·Ï$þjC‚ù†=Fƒ­“3:g&ºÂÄOÏJR4Sê(ò \Ášàà’s€É=ä¹yâmVˆ&Gþ Fжµ £u it¨Þž%.Öã;&âðOþl?î×,]¥Uñ"§¢Ø«"s(?—‹P×_ónx”Ë¡¨ãBB‹‰;šfI9¬q3¢¡Ä%)ž•Ö‡žõK¶óڂ茨ÃNœÜ"ñºöXŒÓÅM¯ZxsPÚj%·“òÓÒ)ö (ÓJ©«ïòªä¸æ*BœÀ÷Ž' ¾¶:¼O]tZlÅ>mêÒzl×x2臓[¸sjú76ä´1=m~´d + mü|„c .Ð ¯?f”»Œð]ù#ž '²» Ú|0ðÚüŠûô\žJ°ªäX°ƒQö]9Šuõ/ÃÖ¢\Ü.¡úÍqàë &%•«^ö\TËq½‡Ì5É»™. c측D†ŠÚÛm·PvàÚB¼eö¶q|bqãˆÂÖt} Ƕ¹‚ͨž+˜pÉj†Ó¤áú 1óÔ£j² 9šnU¶ƒäUj‘äúŸ¸<*Ö ãŽºí,ͬ€Š¡Ì^d/¼ÜÇ£U:Öâ û%Cî éMíMØÈe&ôpÈ;³SmmØÈà!·©¨,#£o á[û¾à¨—?G7ð‡;Æio!šr…ÇA\Q]:à+­„g¡àÙDŒ ²€Ç&¼.Rx,åçœx;ø€Ñ¹äO­dá@fbtÖ…`ÞÊ!”×wNÇk5fŸ¬&” q)ðÓU[`ZÇyž1Ê· êœ5œ¹¶£à/i#Ęa|(Í~WHeiBœ>L‰”N±P8TãÂîÄ×7âÛ¹’‡ìä'Ÿ> Žïí†ä ¸…Œü]Ûès¡t×Vï]^ _%À¿§öžøÒ4±³µÔUÛÛE=‚õkÆ'(Š} Œ›’VïôªÈþ!‰HP‰õ-Kã`Eà¾a?ÿá="; $x¢ ˜çjx:˜ç¯ÆB¬œ³3ÖÓšÔà‹+ÚuhiQ–ZþµÒWÏ=ù¤äQD³ÙÔªLñ= 9Ì•©ÌôLñ= ¡‚=eÍK)â@‹?ÆÁó˜xá ‚Uo Kù L/†Ô ·bç,~á¼SUAj ¬+= ç¾ë箩£˜%íëÖÊ1oë±Lp·êOx=òF..BŸü>èM–:¦êRnÿ`¿‚[.ÙËBg‹olåZ‰:zN^8ñSI·wVc4=åt) `CiL6J<ÿýZDÍ™5Ñ<‘ú4¼EzEP"aO:ú¹!§Ä|–µäf”*åƒb¡TO*«ÄÏ|n‹wõ/ãŸW˜âûŸ<†«¬! W "n8uˆ^5r½G¾l6„uOÎd¬3E9?Q™»ÍpD=I}W[ØG71„Í ìÙô¥_²n’+‹ÝÛÈ.À¸Ì,Ì#SXkQ´y¶‚“Ë;LA´g#Òñ8Õº¨ªE€¥f Ñ?%½f]I”‹»t,x>ÚlQ‡Ã+}]ÚαWpa cªVÞä°¶õTD7A~_îÚc"N^D¸<°W¿TrXYþÒåµ(¾ü¤pÈR@ šà ÍBãÑé Q7Ën ‘»Íqv¸z7*—gœÀ“n÷äç…ñƵA8zp(­‚©XÃM¾Bo±*ª;¢Éu5Ú…&MÌ gD/}geÑn¾¯OB¨]Ó â„‘gÓØ‚mñÓ~f–i»4=2P’Åù)àߪã·–Fö(5ȺœØ6? Ç)äZ…ß ŸÁLq‚ ±õœ3ØÙ‡Ëð“cê•ë°1NÅ©·×²Tñxátø&›+åó@£gOÀ=uP{pÀå4rD+?ÝMEC}¼ZÕmi ˜ÙÜÛªâ÷;Tº]–^á—îÈ‚?äx?µ¤i2sÇ'(­?x”l ‹}7Þ¯íW ¢©ß’@¶Ú"®?›!ýsÔ¤têëþjÈ+ê)ˆçÆêP—¶-¾ÎÚRx÷'‚N[©êD+2Œ;à<ˆQ©Ç*''n¬,{c’éé‹Bá,Ý™‘ä0™ÅÚ_¶]OÓËgÿ¯F¡Ý$=ñ1ˆrz’q»w&Àù[uz81¿òWÊ7Þ ;MóɃБð•6[+* bsÓ QPÇ:øÙÄR Rgç4e;€П;[§˜JXŒö]Éë„Áɪ ¼—wØ’;20࢖>t>QÍîÞ3÷ݱ ÿiºÈh*+…¸–aY›€[–„ ;m¥n#âe¼ ‘XÓ«Æ›ÖÇkºò%ÙÏ BÁ£z^Å#ý€æ ÕB2+B -wöFþ4Ûš×™ßÁÅÃQåB)M$^˜˜›Ëîí1ÅçÈ­Õ.R¿o1݇K0°¡d„î2ë°ÊU–P þi”êƒWì®Û1 ê25¤!á…Gýªdž<ÉŠ ÄT³ÉQÿïþdÚ¡MS’”«}xò¸ˆ¶44oASá–yx?>À[{ÂÕÙ÷1_Að3ýDãά•yÜ"~ ùþ-!zÈ×°̰é®…*Ô/®ð|Õʬ¬2O<ã0“Ÿôµ¶wÚs÷¦ø¡‡Òš)khZORóšFŠ“Wˆp·=ðør(ŸŠÄ‚´‘< æ˜É‚Ãu£Œ„%¨º…^|Óï_^X²ëE™×mïW¦ òNK1f/€„°‡ÑƤ ú}èÓû¾³Þ2Íâ7¤øX jØ ß0k؇cƒb;Nî¿îÚ+ÖÅ´P¥ô17u|.ÇÛ6bt‹_‹"ì•àö[»òFB*} n‰SÊf ‰GLÖî7ë{½ Ÿ¥8ª=- vŒ0•Xv_§DB‚È#ÿ£éV@w€S£ƒˆeQÔømIÁVcn¥£½%†t&"ô÷gF­Ð/àÜÍT½`ê´-þ%-¾É5˜ÖâòôpJ°ÿ•oÚ\*ˆ÷¤îÉ5ú‘< EjШö6Œöå­|á» ¿ ´S7ë4#°dšc€í} @v‡0Ózš˜²3˜Rª(h ¼†u¯=ÕLÃÍéç/¨t¾‚e^QÚñ?Öe½Üx‘ü¡ ¡Ç=K #/•ÐÝÈ™ƒ¡˜D¥ñV{ˆºc)µzhSCö{æ&>ú'h¥•í;ÇÇH‡âý9¯¡4&P÷©PoUPXtе„ÅÜÒžÌËqHZì{ÃJ³S®N;' ËëjœŸÝçÝVYÆ¿!Ú>•Y\§tB‚}ðzŪ{Ô/ó‡X£Ã\_" °*›îâ  ‰Á‹× ~hnÜì€÷ýÑògd$þ^«(q‚aýè¡&b½À,š WÈó|K`o¢¯¸À™>,Ñ©廸9 ¸ëˆAþ²°fõeä—ÞÌÃ}ýÂX©®èÂÜAü’®µwWé.ûþ6àæ¯h‡g•xÃÇÿP‹2Ìšcp”j»ç’pƒ0ÑÃp,ú+ô¥ßuÏš½‚Vc3°æ7¹“T&ûv™ˆQ!Ø:M¸¤:dŠEœƒÖ#ïßZ`ñÝX^ÿyÉ‹ZËè‰Ô™;¦ü½d1€"Ã1 µÎC$•MxðjÊ¡úLŒA ÝAÜNâ̧,£oÌ6Œ£#¡~Lû  ,¢?…ΊÎHýKgð¥Äà Þå.S'àŸK*í­Š0œTÛÏ㥛›ý1t¾×…föd)µ°ôÝ«÷+«‚`ëYE¿Ù‡¹k€ß`|dtSD¢}Ëôë——º]·c] “h3õ Ðô¹ÿÂsÀZØwE×›¤6Y ›P˜ƒ n¯|ç{T’¥BíMï&+¸}Ú«¦Ô÷ˆt ¦– ™4g žÜG.ù)X†˜©ÍCäðqWw0ÙÑŠÄ«9$Ùë¹¶jL­¾ÞPCíö'̈Æí“NÌ«»šÃMûe­×$ºgÚ®ëÐFyg3ÓDc]™q%{+¢}D§×䜚JA 0¯û‰±[ñœn¶¯íiÖ©•<cHFä®XAØ‹øÆDaÎç:3* |‰AKC€ÐÏ­aÇ.hk4°êfàÈ7 ™9›fø§òKá­Ik ŽÐG4RzZŒydòVŒ›éqeÐY@€ßÿ|åÿŒ& ¯îã3â‚…‡&æuÂKL1­+[…[sÕSç}3 䨋ï«Bk”ê3üšØú¶clÔ¿ü-½R¼[ª8Àr«wšuT£'êE/œv$¼-ÍmâÔ>·˜Þ5y ÿf¾Hr…#ˆ $á Õ‡‰ìã vˆIGáæ3K½y´wI€è¡组’‰€_îÐÚMK€HñÞhQ~óIcúÈøÅu.€¶G+¼+€6^šfâŽÈiެPÏßm8'¯ëšECB É!F ÿH;ãsÊÖV@û:‹~ZÁ,êíÕî$OÄ,Î…þM4û!¾óꛕ›m±bO¬¤` R§øB»HíRšF Îý®jµ³ÉѽÅ0 Š–$ðßñäE)Ü×òÛô¾@ލì!ÔM·(·m¦:ö.·øÄ1D˜(ufXo[K‰yž8®#øÖa0°k‹Þyº k‡¼¼Ûá¼XbÒŒ×BÃøÌb3 ù3ÐsI„Ú’v5€ „¡Â5 Ñ–-É¢¢5âD?^§-©öE¾2@°:´ÙÙ\;WÊþ:pá+*­´&»ÔM\± YÚV<¢&`í}7`šÏužßŒH`ûãÈ’9O£ ÀNâ1ëý„Ï  Ǥ׿…RÙ'ÛÙ!â2KººkzÖ›BqÆoOÇñ]Õ.ÎëvÄÉz…ÍY£ŽÞâ÷ƒT°·U"uSûºàëðÖ%ê4·%Úº2ÊœñÔ¯© aXŠñL¹{ÄÜÁá ¼¤ s«d?A’¦M2 î ã¥mX¬} â„N´‰™î” ðöƒ’V~}ç¤L.ŽÍ°•xY…ï;—ú+XZ>µ@òè)DÖïUŠ\Ì±Ô ÞÑÌëÖe£ Ë‚y8Þ€Ï ¡[°á;ŒÁ€™Cz[%ö‰Ææ°C*-¸Láëä­Z>ãBIä|ÚY4$|ž?2QÅšî´‹çs¦×uær?;*¥[$9Ï„r‘S²%P½‘òrßÓê¡3n”È®äÞªÇr¿ÿ¾5½ç®*¯Ã:qÞÇ+1yäÎ ¿Àƒ7$Q§k25{”Íyu­òYwÑDÈW‡@ø -1|£ÃÐñVñ‘øŠ‹Ïât—b ðÒ[£ Á•õ¬ ¤xüs§Í*“´‚‘cXè°¬ì%å—^! ‰^ÿ-)AžÃ»‚„êÊP'iglú€™¡ѪPµ¤R<ºõþî¶ÅÊÝþ#=#^†g×ÀȲ»îyoxôš 1Ô9ŸòÌ-Y°_’7€çu©ì„¦Š-vãeæ‡S –üVMÑsa=èñæºü#Ùd-5nvH`…X “~@D¤a¼@ÜÈKÖù–ì4=Æó÷Èþ“By5SµÃ5Îöp„¹ñ·ýÇ[h.õGɆ˼àÞ`éZó†ÏJGYÅÂţZ,¬„WÕ¶œˆé[Ìô ›-³õHÃí:T›àå°½³€"òï)‡ìĦêF»úäÖ³0Ãú}¶•÷¥,.›¡¹zj/¶«¤¸ì^ÒÀ!ÖoÖäz@å«9ÚÖM¨]1q×9‹ÿ9~7H2ƒ…DSNx%Jé·‘Cè5Uÿ«48ÕõlÁ·+­ƒ-?ô–u¿ó›‰Òç9ð{/ÓkþäkŽ"ëo#q ¨;B–‘0nÖØeO¨Æ¬ª3VØ®õº½_nb1æJw,U¦ëÙ﹇Ñ$æ>²fròÁÀ ð•È)ºzâì||&þîõǯmË„okm¿?z X_c– 'ËkU°iT²–äXApj±ÖU¥îKwJ3k~벯/•#£©džW½aêÐýÁl­ZÁÀËàÚKô߃§ôx¦J¹°äI×V7èÈ6cF惚ãtú:,ÏD7óôÂ6IèòT™Uiq÷! &zºóè±Ò ÙÓXº)k;¡•“’«Š(ñÌËJ¦Ô}î[ù%Fü¬ÿ’C¸”'$1²x,¬¼™Ù¾¼L¤<†MÈL€½Àq+¥$†o¡ÙŒp›ù §† ÉšÈDD×]ùœÞ´°œ 5]Êhá;c ¯«Ë¶»Qú@l’O@ú@ãým Æsß/i^ŽÂ}Q¶ð4êécE¯”wŒkÞU;*•x’|HKQ´VkŠLR17ÒV6XüáüqÆUÓ1ž=®ˆk’ßE(?\Ãÿ–•¹GÐÓí4V_$QŸõçvN<_#üo1<ö†N ÿœ“~eJÒOeP»—/“Ä?¹9š‚ÕŠC¹&ôTó„G‘à§v'`üzјJøOµQ®ž|¶„f¯šØ/«qY &Z¥ŒbT¬°>˜ï©.òîÄ+G3±½ŸÇgßä]Ntþ1³ê5ˆtmZnÖ‡N|ˆâä#¿xŸÎ•*›ôk«Wd âG€Ç}‡×"%K:pØH» &¢èÛrPjAöÉÙô²'ůq^åÇÁÊP$ƒÞô‰êà<ÝP)$`Ç5.©µ´¥Ê³2xzN媀Ù[±?RgñHkñ¤—@Æ lˆ^<[›(SLþ™ùÆVËÃP þ¢ÃÀhß‹“$8W̶Õ "ÁÍ*ÂV:'ò™i¼Î¹‹gÿ0A¥×‹dë4Äҳ갼¼ÆÃ¤ãùøî ÄZ“L—÷ž>Õ¹ˆ’…õ5{Zìà„èl•¶ŒÔMtz3@(ëmlÂ-0hÅ ¤˜†–ùEvã¿cã"sãa7äKVC0­‚µ÷úØiAß³qmE˜É³Ã¹.9õƒÒ…w”i’Rš0%ñׄÆèÒ™—%"ךÇ.Üè-ùRu N÷»Ho -"Å|JóÆ,{ÒG¤õŠUvCq#Z[Ä:Kõò—~û+)2F»šU´å,LÃ_LSb9[iµl¸âO# tîXi¯ø²0í®[¬É‚§·({á ,wʷܹ†F>ÃÏGZtkª÷FüW¿§V£ïW!©åšô8Á|òqz¢o;UnìpêY[â\¬YZÓ€½é5pÎt DÎ×Dë¡€åLêv ó46¾ð<ûãôP‚?Sp$ãš©®S*Ë-‡ùK‰8YAW?á°–ôD3@ž¼;z+¨zn𙫄O&ø7ίÕ·_àƒêG­[ËÎj޴޽܃UC6û›#ý¾>˜èÓˆÚ€6²êD^æ[Ò,ê%B8vÇm0÷tC¡­K†@6“'Ü· EÉNb\¤€åÑ·oò“÷ûas gÞÁ„¿Ë,ìŠGGn@S;êÊ!<:‘bÀ/"žé­–Òçü!“ ¢%–~+ª5¯‡KÜJ½Éß’òÊ,ÓŒV&DWÕyÌ¢ÂÙ¦žr´kå±—‰“JRa•Ît&9ÌŽ%@1õV\ª–¯ÂøchV!J†¥½Ã´ûS‘y}Zÿ'“ÑÁ4nTÇîapÈ,_‚lXäi×®rôrTüŠÑÛÿ+m&Sô6c¯)â…‚ö²#ÀÅwBŽ.2 ÖâØì›(ô5ŠqY õ×_†‹•¦mÍé9»P+Ð)ŽfÌ3ƒ-­/q3ì|¼ùêãM‘ýëKÈÉŠçÈ ó³Ø x€•ïýqJ”|*m»ºn»·Wma+®ïºƒè_ ôµýŒ¡&Î.:‡^OÉMñœ.ð¾+EÕòU+Ûxº¨Pk£aÝZÄ DHðÛ³ À®ûâJÜÃNËÆÍRß@ZBRøU~TsH;…AæcàºèÇm•Ê‹m€Fäf^ç&Ûðíb9\½ç#¬üðë§Ó–—ïsŠo!ÏYEñÊ\>hÂÍw=iJ{Ÿã4pq›}€^¸:ÉóF¨1gF\ŠÝöëøa“.à pÒoy±‘îã6Ø5Ãož‹’kÁVÒ6èecnEž°mÈ©®kô3Q¯‹/7ðeTˆÍ€ ¿Ä8—±ŠeŸh–±_»€0?ä$Ú?IÏÜå‚I@ ÉDYj+¿;­‚h\|À\»~†ï²‹lMFÝÊ.TÅLm„à±Tó»;|þ§© k¼äÆ‘W«½Õ/ÅúÏ #¥9SÃQ‘ƒyóÿ/;ð‰Ï‚‹Öç?]Áxî4Å\³z„ÉŒ/$¦K4—•ø'`Å8*îÅv§×Wï.úŽ­!¸îD¸züYêþk,ª=Í,×7Bï…U^I˜GïK}3÷*›žsœ²”¡`Aﮘ÷&ª`ÑÇ‚¢Ó§ù%´®2û¦: i#H÷¼¦ß?À¿sI0¾QÃ_àÞŸ6æÆ¯×pû5¶ŠüQ9iÙ “A1ûš `³Qã†YãÖíQŒÑÙ¿´ ¬žwÍï”åÃÏ®oKÎ(AÇï~ 6J[“#5Άîâ #z© pN¶·Dw¼£¸¾¿Œåžèaƒ/ •æƒáåÀUGð ½4xWhëêÛ‘ÆóÒRŸøq“œÇÁ ¯XüÉøùSˆpÃUßV½”µÁò9äC$Æuk3˜›H,E§·vn•á/NˆS¤0‡~‰*9,(Åg»Ô+ââÿ§òux„-{]·™À€¶å[SÑ–û,Lý{öAt/üIF[+b؇z§çÙØ'Æm¹7´÷^A _cŸwFxb_$Î%NW”s/R¦Îïfצ:MtÚH™.G”´SsLœ<´ˆßº‚\ LعršÕrÞKK~UvD ‚ýò®·¿˜Ç@Æ÷»yàØ‘½™&ÚM­4lx[8ñs#v ÅZs踷QC€7ïÙP]ÏàX‡OÞZ¥Þß{ x÷? ¹dÛ/zU¹|zßAÜ•Ê)\ò…‹ï²”õ•wù‚¼¥¨Ö½CŒÈéZÌFér zø¦•/€áÖWi(?ÑŒ*Ú$/3Ò~ƒ¯üÌRæVuîÒP‚—â“ÚÜR7µ¿­ e’’§ØŸˆ£vQÞØ1.3ëO9îº!q-Ž"ðj¬RŽ>ÈëàÙž¥räêVj¾OøÿS6/£¥/Å™r—ªi¥ÄoËò°·]'ùçÌ|Üʕ果+›DDè-=ä€~˜Ñ¥€5MM ‰=û~äÙ0™ ³¸†¢ð®e²øÅû›[ziˆnsçˆ7ƒû ©3µ…=ßßìègýòMù|÷-•Çì—Ò/®t©( ÚÐI|¦Ð™ú5 hF̽{Žz³­Ee‹‹=ªÖÅßpJQßo-µ÷ü!‰€¶[´F™VŸñÔ5aäç!f šß ‚wPßµ7éóË¢ž-JCUyŸÏ¨t¤w-·¯c§\h& ¼Á²õœDxEs_•W©v5µkŠì(Å M‘gcŒÇ‚ ½&êE‹mYyäÞçÛÓA t-í•Ì–<¢Öÿ£‹òö^w횎΋íÍÖGcäŠhÀ¿@•*ÙÁBk?§YÐ?1|„þîÓ©²ÓA=¯-fLvÿcî/ôÓf¢á*ä;4›£Žñu%;X/E~ãàô®i ÇQøéø‰ì¡f‰€g"0÷VL(É‹ã†0†D/ iùŒ¥F ú•š“aäO9ý_•Á‹àڿܸ'ãNƒex3ìL¯'éF Æ×Þ-.æÑil®åS ՚ÎÝÖ|)å>!I?ùßOÖ‡£æÓä©$º,D!Ò¸zÜǡІ¥ Iè5ž Îëß¿™~yˆµIPѸLPJø³!ÑUú%€Ôu6ÕìÙƒU•°ŒTPJ5ÜÓ²5J.;)ÿ•†½ÞÐ軦ÀÛ¾ï½Jº"–ùIKDǯàc¡LÈIŽRÚ$—ëù@Þ_j£7ˆœš¼>ÞÄÍc$îlhV¼ùŰ ÁP£¼7íu¾ó‚{í ‡p\.ã™»Á¢ˆ‹°ë[æÎ NÇ_D·~ 7Øé"\¥ 7sEIU7õà—aþHŒgðc® h]Jµÿ}”b¨pa>$^zGœê0»i:®$¯vë{ËîrË·Á"]6jf-ÿ_>ž\jñØSké}ð-Ë’¶¾\ ,Dá¥ì íIšm¼ÜdªÆVŠ0EanG#®õ^d/ßXBúÿIïÇö&%f.csá¡2ná#$FÜ>Š{ç^Qü²“B¦çeB·c+(|ø(ÐÈ—¾Ìy$€Á×··åßiß ÚßÚc\™Bð®M£¬¶ñïè>’ÞN»ŒVÜkädbÉ|¶;zf ±áiAfƒ»uÝjýdŸ—Œ¾ L¡9Ùd§þ˜çènÃôèFÃÚç6ôÃHÓž5ɘ¹nj6õµÝžÊÌÊ’yñBQ(µU„¢÷&Ò€•4¹Ó×Âú˜@Иþ~TœæŽª[+!Ø~×<-z: R“¥ßO€LIˆ=ö aíÒ DoýúÀ‰[=N¥”·9kK:óxUDªxcØ܉L·QtHÇIækVù‘NSŽïºõoà‡ÍÚªYȦl(-ö2W0¸I¨~ ‰—› ³‰8nǃKŒ=!"$×léF¦Þ+,$j’˹vsjXm¯á³Ö-¨k~ÒÉ-…/¢Ú)åzá5¹:qŽ hZÊ‘sTaL±“zÙíè§ 0ϵ®¼¥íÁXÏcpJÊ‚u5lH7¹ÊSô¿âqÍEù2åö_»ÅcQ!µ£g©yáQ_¸ýrÙ®&ËÞ ÷œ$JánJ¡6 ‡ ÁQ‘]À„JâÍWBoÉé í“­6ùA.îÜ|¾nß~çßÕ,à¯O.TpQQ´ÔÜsJãjfÔK«•1¸âª(¨ðBƒúñ9NVÿÀ›ÃF"LŠYŸ’ Õ'„>ÅÁßL™°Q0P†Š›HêhíÜiGËԮƞ5º_,ég©¦E°dšR:è»_3ËÂpÐV ×j§º8,ÑI¾a™GÇ_ÔŽµPë# ç¨}P®Rè(fìtù ôwø¬Ð7g$· êxi+>>ûìwh°+‰Î8\8 I@„JùWPT©¯~ç›7‹âÔI/ð-ïÎ)=ù¼ cúßÀÏ6ØdÁ˜5M`É¡„ˆ[IÐÕ% Fv0Bï”f£Ìm]wñ]ÞÔt>[fð~/ k4Ýt°:½ÙtoG¬tìiO$#ªÕ¬¤Ù,ÈÑJÕ¿¾~íçÂÿ,©b)n›¼·²Géß 4—µ ûYq(g <7Ó>‹>LÅ“ŸÉDðÚŸHeñœöÛ¼P1_%¼Üž.É[ÅÃ,8sÿ½áÄëÛ(ÅØ²Y8]àò}Ìîø lÏH?Ì EfOt»o:“F{øÎ – ¡àC+Pž(Íq¾óÌþ¶ ìœ<‹L}ÍÁC`À&e¦yA¯tEd/Q(‹[¾v˵Mοàü+´ùÜêÕ7C³UÛ· \Hi° x=V«%*Ö$+¬qp ÜÊ—ˆ²Ÿë1$^—º ¿agW äÛD«#ó€M »IF…ÎÂ|HAÄVÅÑKw‡8[¨÷y“U©¼!ö±OzOÈøRvÿ¾¬­¡RÇF>S¥?‡ˆ “RÀŸÂ¡0ªõ¦²‹ùø:·/‘ûº¬™7wxmokBýUf·ÕÀ¼ÀÝì-Ž©Ö_޵+H]ZÖ«*Fÿ|¹U#×’FÏ4WhGìÆDÀ¨_=7±ùz$oã°fЦ÷¶ºc…NêÄÈ*’ÃôS©©ßtµ™k–Ò¡:~ùh-iÔÒAº±=iÎ&7â"»°ão­±e¾ê×k2;Ut¸PCîø9>¤¿§€oÒ?®]&ËQÚw£u`ø*ãÒôØÄ— à’ÐåhˆÕ%ÔUcÐËM³Sà–W ¹<èûîw¾·éÛÞéó †Vȵ6øäO‰ 3CÞøÐÆÏ '5"Äâí:±äÉŽ w<™‰ák­nô×¶Ÿ›žq’Ù6àWî°hÒyyC9t§ŸAˆ™Ó‚+TYaIÞ÷OÖS'xì´¬“íšj;tl|剖ƒ¿‡KoW}*ßG¸½BëšQÇ%iÄ%‹>à{ÒÏD1ñÈ5Âáèh‡áp>ª3nTg<:>´ñ¶‡D,mJëô9e¸ÿÜOïÕ«Ó–î¨þ˜X_<¤W˜¨tìM=}+³LÖ(˜öÖò~‡²Òè»xºRJTsà¢À\_E5rpf“”œX)9 '4ðñ£,vN ¼¸}àå¸þN•Ž–Qèp<еƒ&þI§:ÆE²ÞIæü “™4IJì1¨qH4¨`Ra˜¶®§¢ð‰^©ù»ë1°ôöE,#@W·2;˜ÅÂí9Ÿ¢Cl aB›–Ö }L;yÌdlŽ<8ÃîAE#o•Z`×=k­½+åëˆþ¹¸‰ çýÞ¹öŸsNÜ3ñkܹû„Hil©][µêk,.º¥)cÈEJ GP‚œ¼—xd¶¡MÝ£(à†€;Àoî¾2Ø—šƒv2[w1™²›±\ß®[:}G"·äI|ž‘µô‡úÿbrM†G‡Aæ¢ÿaV«’«h*·QÝÙ`éŠ,”ÅŸVpŸ‚ŽßUÔÇ¥n2Ÿ0…¨÷ËÂvY)¾‡ß°‡°¤Ð‚YO¹Id $Xoñȵí¯ľ"ï…tªÝÅDÇÇmz–²—œÏzä$•R³Š/§o*žN¥^Ï~{JÈw¶þ :-G€ÊÅAÉAÚ1e A«½¤/£jtOU±·³üqº‘wxÌêA·jVKu;©;õÍ̘#™ä– ‡ ´Š[ªûǬ'fùr}]·þ´G˜o¦n¤&d>*A'h°¾‘;û¿¼Èt’ö×rô‚:Ë#óxÎhüÝCš#”{ø®ÏØŠôâ…&’ ƒ<ÚÚ?#H€áÏ]Ë 38 °ºÎM<ón/RXç²w\šÂ Á‹“#ÑÈ3.låõÇÏÕ …I‹ÐT0™=ØáŠÇRƸƒ°8jޤ¦ãÌ(äÐtMŽ«A `¹;‚¶M8~èJ'Þô]UL3ޱ#@é¶¶/®HFûâ=æïðêg1|‡Cñq­jŒÁ jÏGµq.`{jn¿>ÇgõmC,¾5.gûM—m…!D(gš®N\X C>Ô¦ôÝ´öjù#¸K„6½ëä:§ÿ „·Fœ{ó–àê•Óå#´vª¬h ?à‹ß¤ëÜüº7:Vj Ï4Ô#{j†úéˆÝùÕi!ÏïÏ‹Ì8bƒb Û̂U?ºAXRY°IO¡ÿÒÉ,“Ä8 ˆZU ôè)ÎnÿÇ/oæKfæJ.;‚=Mü½<é+ŽÂöW `É.О[‹¦a‹Ú6ñK±±æÜξPæ –`7zgÙ;ךÆ%i?®'HJÑ>¢kOçÑR L/w0SphÅÃI„µ ‹×ø6¹W~¦[m&Ekä3O0*&Ø‘ã b‹Ê20{1 xÓüÒ(=‡@½ÉU´Þa¡Ðš®0ë0LsôYçUW AŒ~¤Jºï“‚Á‚Ìjâ`2…Q×"ÿKÒ’à’÷‘§w°ö´§ñ[¯a»«ÞýƒÉ"1Ü~JI3ÜçµÑÿ’¶×”bع\è0 ãd°Ù/|@y~»Æ/˜GÇ–wS…ãCý°*&ÿm^‹‰÷~-èש3YS¸›§Î\-ÑM0ðï)\ýÆä°9(=#ò5$Ø`¹xQ祚ˆc•Ÿuu~oŸ{¸Åb–u"\áùT?>í “.© opžU†Ï©eÅÍÞ3á•–Û|1FC?°"U”˜ó:÷œÏ}FØ êæ†}ÕrïÁ+Fœ›àžÌå@P¦3“OºûÕäò4‚QX*¦$æt:  ³sš0=‘š—–yvBöÍeÖuHÄ 2‘'EE&Ò :Öz4Ó!œµ9ÎË 0 ±:§|®x®Ë ¦$ÚEW%²pz‹'ûuA–Ý3£Ê ð‹°†yÆÒðløG#ÝüÈžTÖ¼.Šò- øc„}A½x´cY=ä# ÎÁ4k¦2|Ø—W‚Yh¶Ô ÜëU¼‚~ßy”Á,þÖ¤Áo_<ã‡G̉BÈÎEG” šÜé§Ò`‚$ª¬hNé}ÉVE0qª²=¬(ÑâêÒ¯ðh¿…ŸŽŽŒW£ ÊÑ37ˆd~%wÒéôÊ\!™´yðÓ‡1ïöøÝó¸oÔ6Ô$0käÑwòK(~£,Z`üºÖeZ & £ipܬIJjó!K®íŒÌ†èaĺoT_”MŸÑsj¢jÛ›ð[¿í1WÖ‰0èÍ„×P«/QqǪ`ÿÒ*é®ygÏuLP0t/©®œâ/ÔP‰õ2ÇiéÒ×Jl}­õJ»ŸŒçJ è¸oœç|©4Þ3@KÐ{ã͈ÿœ'ß@2UA!ö!K•±~‹) Óã¼ÔÜv¤ÑP·Ü µz>rå4½ð`ôé{l—­ÈFö£ÏÜ’º¨"üÙ‡¡œl¿´¾îÏ,豄éÙ§ ÒⳫ%çpŠ6ÃÆÎ…rDºî®×Ì„ î ñÇ£ºäwÄÜýͧaò0¬“ºÒ/V—XúꃶüylP8VáqÂâ’n½{Ë ‡He´=©v]¸6Á9†Äï'ƶgÓ[>«ç1Í2ÀP¢ &ð†7>LÊt’-9ˆ¸W§¸Ç 3ÙØÃn`áµÆ-ô¯¶_‘Ø*x#Ò¡rka=°`‘|³ÅtR-úÕ6zPɘK¼}Ïé~è®O`B¹tduÃ+~Ur#² á^gß¾+BQÞa÷2›ã°©Ò Àasÿ—ïœÄšj2LÿYôH× *ËëxÄÇA~e.FÛ`¼Pך‚GlÌÓÒˆ÷ßÝyNngÃ$[Ox9I6¬¨£½Ó0!Ÿ‘e•]•ÏÀC³ YlÛƒ~ĦŸØŒ ë è Nã F)ƒÑfx+¬+=ËñG 9oÂrx-ƒ¢ö—…†—_ó\•Z*ÝñJ +‘4HVÞ$á ›Ê…4$ªÊx¨YŠ0b ]]Êü&à‡¡!Ÿo±¤h¨³ÂÊnô(¿¨wo†=‰´2ÌÑ%÷ãp}w_­ 6^c°"ç‚OÍaD1ÐŒçæ¦`’îQóéJ½\Åë´+Ú¥-ÃL:Š—?¶¯¡ÈÃní••å¬:ËÕ€ÖÔ™'<Å OòÿQËø†ÒJ€ÜÐÇÆ›ç~< òM)Q(c%b¡ºÎœ³Ö“2ëI »”7¤Ëí§›À4 ÇïȸÀrÓœ.ê2Å–DëލÉÂÛ©\C%棒¦ú(¼ŠFµ}dT¬¾HUjô÷Aêg,]Èx[•ñçÍš¼ ¡ä¹Ñs(“§•ÿ¹G8+b5CeJM‡¼’%÷Ã ÆiJ+º¹Ö!І+–èh·ÎF­Òü/>Sh#¯4½ $Ù‘ü½—™;áyìæ@ö× âRGY¾5öwd©›w™ŽÆ,3¨¾´!ÍØ 2ÈQ‡D^³ˆ+Ú¥- †dÎÖ6µ¨c ¬3¨ñ¨«òj(±éŨ¿ µ5SM3w€ßr-6û>úÉô` 0Û§‹© ˜L6¨Ó¢P…âçÏ®æŒÿ§/µá à‡Œ½Og iîuÂÊÍ ¸|ÔØjé0¾{°Ðàü4Â¥SþC{®Ÿ*&݃Nmh íIZ‡SbÈ ãUÕk+],pï'V©’º½|”UYa¢ÃœZÿ•®‹ˆÛ+3-EQ!+ÒX½-lS¢ez4uás¯Ȩ“3y2Ù³_ùÍ[.xTЙ#Ë5tbì'Ú¥ ú«k 9f•ßÊWX¿¦MßBíþO‰Ex•Î%!ýWSnè˜Ü ð„‰ ew*ž$/Z ÊuÉÃUyxJŠ2VE[lˆÍ¸e.Ë*E}¹, ºîíPŽédß)³K ã}XÙ+j¡[]_Vp,ž¹uP%üÓÄ0Ìú4Ѽø‡ÆãïîŠ\™ìHËÌ4óáÜÆ‹¡Ñ1üøÕÂøûôeŠ`¥TÔÕà:&…Ñ,T#“4%™‚…S­E‰è°æß²ìf:£¶£²Á·2ÁŠ*0ÊÚè-Ó3z†2!k1uºY4žîä›%È—ÒœO(Ãu}5 0a-L2«^-É'%0ÉÞl5Œh7csaè6Û™­Æ†íâe.‹=vDa"ñ¸Âs¾¼B¥æ“LQâ©ý6ÇÊ¥ŸÅ¥ÒœûH³ u@™-\æT;q.…I‘¡•l&çG°ñ6ø#ÝèÝë·áG~ú²Ðð,Í m™rH¡ª—=(Mj£à îô?ž…œûH3Çä…ßG†aöôÁìt½cgˆ¨…—·ùt.ľ£ãqü†rtÒeXš÷¾¬ùtŽ~!·3»g(ôUï›¶qel9aG³;–ÿ?têÿÎO ý7c~\تª'¬XÈ,§² qg‚c1çåí¹¢|&ÆqeÈ‘g•àQNml·­ÙÊ鋞W¤{Ræè ­åŠO•JBKp|F,ƒõ´YÐå_EüMцÝÞN0]'C¾œA³7x[Wëìy ‡¶áÐ>ƆÍÃâáMcàzÈûß]8¢¼û®`I¾ ™3ùôû»Œª1¢Âë_ÛŽ ˜öF95•èÐÙ•š{óqoáàQ ™/3#·)n(J‡!—gÊ·¼]ЖÜ~NOËl±o‚u°‰6§ 6Ñ{–†:„#Ô·.gêCH9h!ObCå8®ý×°v°¶÷Θ©Ò¢3'QÚH¼È •جÇÖã¢ìi·$ü± ª¥‚rúdÖ%UqSÜ|ƒ…œÉŽÃ•×£dæ[3 ¨ÿ1ÇüÎ}û]wâµl’@9ò´Ô…œóéÔ'`õÝ´£¼›xÀÏÑ›uôumßâ×ÃÈĦj½¢4Ìx¦¬WxW †Æ;'’o  ¢Ën~Ýú6Gnrx¶w‰±~«o›8DeÜŽ¡0Ï·R¢cЧO!H¿ˆ¯†§Ì9þüêþ·Ê÷°e×ÏÄ7åWs¢òJqVÄHîb~ÎLØøSk‘´w3s¾¬£„#áwã½/n^1g>ï|EÔ0¾®«Ô >qÄÉGÏäÝeen£~š·õ˜+î½äÄá«^¸KV‚qkMg-Ë=BE–‹ ;bŠáZ5í®•' Ó×Ü<7>‰Á¹Nu‹¤…­_¹„ð~çtwR¨Iä‰YÀq÷­¤ÕÖJèÕ×’ùèÞlIùí)ïS<á‘dm~¡P “^Ãì›@’íÅ’ÐzUIí¢öC[|ÂzÁ ‹Ö]ê`Öx4êÔú!çDXp?—"É¿¬ˆcÒ»ó8ïXkN4%ƒñîIAJòÝ%»Òõó±àT¦x=â ANsf»³<ͨ¬?àSî‰ó.¨®QÙþ$-u+ìÞðùüÄ×+÷d7Œ†(˜³È&ƒ~î<tS%ñÙ‰Ó6PÅ¡¹õÄ| ™1YÊ5š»n«í{ÑOz±¶êyÒ%K¶Òùð‰¹dXD6ƒ)vPE¼KÝØ¥%l‡d”Ï킦儨ºœù­÷o\°²òo¤¤æIœE’쿽G6$*ŒdÖæ’RK>f<Ô}Acq9ò“X¿«8Tf¬¿½ ¦ŽhMA2å)ôÊn0«.§BÂâë*”‚ÇÄf®uŒû†§Ã5Å Ã.hüYså3Ür å®WøèØ{gò‘Ç—  °ˆC±IäÎ[,\ø,; |&™ŒšI<—c¿²ÆiU2@ÑZ¶Ví•’ªz©óR¦ðÍE?²Ú›Åå;5(Áp”ð`"ë}ÅÒÕdÝ75}×Zü©pFBÝ¡â>Gþ>¬žk]"¸ª Èl¶h™}›™F1FGìºãyÌ.Šƒoi~aLÙuVxð®têš|ùEd Bn·–p=/hã3h˜åÖpªG…’š.ËU=5oŠý{•è¯á”|c†„€ ‡ «)ž÷SmVûgŸ¥˜{¬" o7°‰ê‹Å^<К9ð©¸ëvNZ©Á¬ R1Ä@öNÃk¯Âÿó@‡¥¹DØ[°;?5xá`T‡2Šíœ~z¸ÛkX s)oòC±•‰<ÁБÙ`s ,Eu ÞUÞ9pªµÄ—Äg¥Úç ´•.ŠÝËV*ç9®/Ÿ,óÕÝ :îdô(òšð;”6e.åMh»Eÿ:7>\ÝÉ­pz˜šì† 2*¸ÂËæ6òR;E­÷ˆ½¾Wz×õ°‚­¤ä÷˜˜ƒÝàx<>‚FÒ‚“%y×\íBÞo¥Qº±¨àc{ãÔ‡¯(nÈ´"xÿ[س* ROð Â,‡5¿qEØ/g!çwM.«L(¼àcJÍWÁIy­³iƒò %ã }â¬ÁFC-‹ÞþùPDg`MŸ2÷åacðž›àqþü<Ûô¯‹#œâ;_iã{5ÕÚúv·…v°1ã8l`™@|€BjNùÎyÏ$ÁïÛœ…)¤LŠó[L¡ï½Ž¢ÒØiàÓÚD`¶¼F^¨Iu¸2<¼›A®lwNú§"C…ý ÊQ—„B¤'œ¢\)@ºgÎóZ+éÒL­½{Ùi[鯽¦¦!©µš$¤¬ö3Hʽ—}%šreC|‚*ä‰;ðH±™é—ð8ËÝдª(E6˜ïîôz°>Ÿ§wQÅr–•‘‡cÈ=PR>Ü(Û¬´rÒ‡9¶>’q1Û•!èÁ€ G MÆÇ¡{È+Ìú¿¡õugy0®!eš¿Ï´ÏÖêz¨jì˜ÖJT¶fÐuzÜ…üÜgØœ7—A&NeT·ö¥)-5ndS‡wìƒ 1ÓJaùÏóÃ~}™Õ¢çèvÑè™osýÍ~aAù{‹ì tJÉ´sÀ;h K¥E4ƒÀ^ù Y·ƒ5€Ò MuÈ®ÙF-Ö/¼åöï9ª×p$è™u­¿† ›v¬{ÄÔº¾°kvº=wÚô^vœs(‚ßÓàEÌp>í¸íÊ÷¦ïO«íªæŸ£©CgtWx™6{ $B½lÒCwª«`Q‚<&ÒIË ù`Ø1=Ƀ÷fH; c׫À¼$ìÚ ÔˆO”!¹”jÁ\0¢ßÑ7_\ÕmƒÈ¹L¨M4gWFAvŒíPM¡qøVˆãªX@e°·;€¾ŒªÈ:ÑòDô¹›´¿ùðý¨ðiFˆ;WÃð" Çæëù6¨Õ\ÕÐÖb‘âB@ø¹—6¹Cµ©Óiìâ„Ífy80&2Ð ì"Kô4u³ëÕ€ÞXÚ/‘ëÎ3Ì#ÕÀqf;š‘¸ÿ"É„ã%`‡þ aoùÂ2?¾Œ¦|îC*-*ÄЇ{3Ë5¸5‘Ê»øp#Õ‹Œt\oÐͲ,{&½„•¬rì¥QŰwÐî’õ¦»MCÑaVagSZ;‹×N±‚Ù—ÄBŽøƒˆ²MxÁW#AÒºøBße"~(ŒÌŠxXê¤XŒU(.zÙpƒ–•­~êy)_¨V¡^ ºXéx†…óþ‡­â“yŒ JÒ ± â41[Àq2Ó,‚í–¶Iï{Ö[€¤_³¤Œ\:™F(†3})‰ÚŽ>ÇY‹òpXï‘¢o!‰}S£ø–Y¶­«íušü?¥Ÿ6*¿ÞmÊc¾7ÞWê°­æ–&¸¯òÄÎ ZÓa§1°P?ln¯Né Òl/ñLùDñÇÓpÑ]Ýåݬô“lK¾õ_ØŒëÂ"R¿dèèqÒ Q÷t¥ÓÙ’¡k&vQ€ÁjHõ›šk™@׎ù\ã-ÇñO4¦úGLޤd„Û¨Y‡M[4Pƒá¬ \¥4ŽXþ{óÛ%| Æö=Itäd­ÞòFT÷;s †d2GÎ Ýté­ç9¡˜r­À±,p^›K'²—M—b7w¦OÖôÜk˜°› }‹”ÞJB6ÓñŸ6eØçE„_.mtÁ˜(33µ$¶i.Xî²èÑ£ì…uƒ…ýeﺴ™8¹¿üÀ¢=…I¾ÿÄÿÙµdK ^ïû¦ÒHóôr-ÌTì›±«×}ýÖ ˆ. ñ™?ŸGÞ=ô{ؽÉ¡ìaé2]Ol¶$wüð‹¤ ·±ºÝÛÐr¨û8âjÄRý·}¢#Ìâïb÷÷6[Œ–—A=w¡ˆIH?0 ÚÃ÷~Æâ‡ÃrA—‹.zðtY{j¤èjë³Vº@n”Ä OnìwÃîïoõÝýü+tCÖ|×1Ï!vΧ—“nº`˜É—>« jè“ÇÎ!Ûy- Ÿ>lSÚ/J%ÞÎbF­è·Œ“í|bÕÖÈ›n¤®¦d§í/Å•‹{’”+NX2?+«Ê w·™’G8¨›éÌS°¶ä]g i®³HZ Ré1™>` .eùiÑu…¹#ÑåÇ_Dâ†mÚùBÆí“|K{ò@Ÿö9Ò{µÜ}Ðwðùˆ¯waVuY • š9êÛØVDÓ™lA¥´S“¿ŸÓê¤C_š™ÌZ5äûp?€‹qZ£¾ÕªÌõ°ƒ:¨§ÍPl11¶à[;’¤“µrhÊGŽ« çã)ÜntSô³rÑ<+g §dœË)ºË~vš~‰:J ~Äî9ðtÉG²—Š„M”Jâ"ž ½i²z¢Õ‰T5=fõx#ìí~­ µƒôò|íóù-ÌóK½«Ø++æ¿•Ž«?Y!ØÎȘ×e$±-hÛr ¸ñ•–&Hx¡˜üµawït07Ô÷tOº4†Þê©z5ÿ'z€³Z²šS«Ïò¯©F—¥Zr*mÓ*UÀ^ì’\â¥ùÃ]\â 2¤Ž»|0ïÃD5Wa¼Ðs*Ô³Q½l2€[°‰£ï°äõCtè¯ììÿî˜)Ò.%¢[îÖ©^ÆTÿ‰\¥ÛEš-´A¬ –r6Ì.1U«Ñ(lœÅ—ÌzÙu Bƒ:ᯣÅs¼õe3¾Ôfœ!â/Ó50ÔqNB7"ç*6{fî|ö¿FGæüŸž†|¶0±YÙeö´ÎT¿¬HŸý^‰GAÉ›@â ³~o•)Ϙœ–æ$-g½úõ(ˆñ®¿pªÊîþÔds0(‹§úQ1%žµD»k¶õú¢ ʈ>8‘jÈ:9ù8ê=ŠÞîŠbcMóÇüØðh—j;Å›ûš±÷)<Hàïi“ä Ãú̬pýxÝël† ßÍyc—šh¯×¸†Æçâl‡Ô):æ±´çˆOíêÌš+‘tó®¸{3¤Äû¾=_·ÖJ…©Æô©]24£”aQ’v]×8eÎGäà@+BÓ¡A  U±æTþÉxòÛ˜e°’'©‰@a>³{ŽLõ\¼æÁ:^ÓÞ_a{I\å9*ÈÜæ§¸Ìzé³yCÞôæÔ]96Ûè#yá! Ë ¾Ì®êº$º 5zÒ ‰ÒÜä˰¸´šÂñ¤|ÐP7úÁáónÒñÞÒùÕ-Ÿ“µÇœ©ÏÖ]€¾ÿ:ÿâ-¦¡¤ŠéLdq•É ´ú[– öaÕ’þOîqp*p“¼Ô¬|§Í ÿ>vlÒAÝ`YÛ.è¬tïßèê¯W¸¯z¥{Aíô1Tœ¥Þ¢)(/ó|–SóÈúÛ0û™Lrþúõ¯¥ïüì7%(]%³Vì÷ò-aÛóôvWTvnY¢d2ƒÁšŠÌïœâÆÙðþãå|ò\øBÐÓ˧ Kcÿ O°Ód¿òÔ=úê{êå0 1ìb‹è4·ù•ݶ—–:ÇPWlK£³+«›¹2rÖy”7¬œÝƒ'Z¥¡Qdu}ù\ÄD·V#sRJ¬Õ½ ÄÀý˜ßœt–Ó!9i(F¡A¾ÚŽyç'ŸËt‘캽ŸÝæœa²-ÏÜä@²–_ ‚‘Ðx•~m{ާ¯7ð_S1»þ§ :¸°xÄøMd̶-ˆ˜RºéÀþ× ®±Y4:Ÿ>+¿ÞTÕé5;9¶\âA"4ÔçáÉm(.8Ù¹)?üÛ^ýuX<žæ:@¦²ªÙ©úPr^¨°Šòˆðël¿ˆ[p•5›…6ì,y`ÇæÕÍå"(&‚|ø\°%ûÿ.ˆýÅíN¤Mö05žß¼Ã;«GÃñ“æ^î& æ]8Ž“[$q§ @µÚ¬‘Í.[ÉÒ…:P¿³—d>žOxÎägŠÊÃ÷´^Má6–ã_Û~·«`…:l¹BÛBZÕÌÁÐBw4‚àÛêû8­]ÒkS9`>N2¡K÷锬×®1MÇ~«`a†?}þÙ_êøCo¢ü?YïÊ‹æÌ®³Ôó˺øõ…þY—ÄažñžSÜ0½zgãa/ø.¢U= }@i2~w›I€Ue¸ý {I´5 ©‰‚g±3U2›úØÙ(©›uÛXM_ÁŸ0¼ëÿýã“}Mõ¶+\« ®dÛqKá¬è6@þƯ´Õ¦m}ð®]¿4~ùkS^ŽÑƒœ°0p8Fê=.xg!×£@œŒ#ç°¦ R]Šg\ˆàiäãœNì<¿]eôÿmÍô-â­nü÷ÒëúŽ?û#Sgl9±g¯K®bHVÝ3HèDa4ßz$5×mMv {i‡:h­”Í<ólùƒ¢¼ ‹v&\û(©vè0’ײ¹—ó’«K1¬mÙw'n>¦@•õ€Jº!Øh]æ`µÀ•OëEéÍîUvuölC€¨ŸÏQåGºc?õ,æóý•–[2訊ìo8ñà­ý™!+)·%¦Ä™qÿD]è•–?'‡¹ ‰, "²ÒDƒLõJs%—JÂRS»Ô°B¦›þ%)ð…ŒTXÅdSÀãeœ¥¦ôú6"–wëØåQȵû5K’ó—ŽMçRTMžì‡4Æ#ÃÛìõ³b2Žê²‰êÄ …ìZ6ú?sÊšawK-ác66ó¿ÎÌ=ptí£%Zâ}OÛ¸›¿ÞïˆgäÁ§1žٖß64 Wè®ë_hn)…îAj$QTÈ€ÜC]á%9#·-àÆ²î=ÝßåÀÍãh>|ä4%ë5ùªÕ]<Óæ#Q öÂüéLÁˆÚŒ‚ý›æÈY{'Ðì¥új pJœ¤~àÚ©éŽKÎCì:ÝͧZ¿ÿno¹Š·q§<=ýúèƒó³z !“½W†( MÉaG-VõuŸª@0ÎIê]èÀsõ«:)c “íÇz—Ë[eµƒ©m-PýnàxÍmz|Ä£þ #¨frW@Ó㚺ƒ»äÔnÿ˜£wˆ¹ç¦á ßkŸ¾X:ï? XÂ+®}ö;ÁPêbí¼#Œ'æ]¯°™-þŒXy·WSç7^víV¾Ý˜;•HŽl+·8¿?weøG×_×a¡JÚ­/KÉzÌÁA¿ ù@ýõ9ùaÆp¬L)ÁßG’õ G…@œNYFWÁÊ~ùÓFÊ™Á¯ovæ Žâä‘bïãž3rmnÏR á?cJ«‚…•Șg‹Ñ×ö¾—jå¯"üú¶ù0 )ávôBPO:º®òG#1(8Mi˜ßF‰Æ“ ˆ`þöãU2‚p”’-syšgØ4ñU{âa_Yeìz·ë'‹4p×7© Çðün¡`0êß2‹câZKæÆÁg ŸyP—t™BwÕ8f¾Ð“Q,w—<þÙ×Z _ÌNÑ[—ãÏV9‰¨í &&nUûá š¶+E|mЬÛÐJ?dÔÙZoe·Û¸§ iÙL$6ëjƒ]Nœ 7)ˆCur9m ýf 9‡!XŽßæà:ägðqÒ¢Mç¯3ÙÁãF…LÌK¶˜ JÎ;sñTHFË ¨n:F@išßŇ)Ldøôà¸Ì$·Ë«·í¬dlsQÖ|Ýa³RØâú]€-\ºR£d°ú$W›£j™AN;‹†26_Jž\þáÉ6åFÁÉ:+~ô3Âë;/1]€omBüÚ=Mä 4­0¡O:¦e9ýjz‘sÝK.¶ðõFÄ=±¾4BààÝÛýlX!ÅÓÊš…jp‚S <„ÚÔþgÇ×®‡L Y,²ñ½7¡ÄÛ³çgàèD桉¨(8M-ZâmœW‡Ë±øÝþ(_ $àʇe-ÙµS±Õ*7°à¡áНæîM ¢ã˾Yû2Ù l`R?ü¾ Ö‚ÏÙ#A¿\S>·N´.ô* n}+€W€õOÛë¯×="ÇL¼V•sµÚeÍóÍØÍ>`ÜúõÇA}ÅȼÍöá)Þ5í°)›òLލC®€;cÊ´&„,;M“•G(5$h¤KjW‚j·Þ_ z,|åßýê ÝÃñ¢”R³(tCÖ|Öía²Ûy!¥,}%;XË¢iš¸WÄœ©ÕPÔ‚ñ¼|Òƒ»‹9 ÞýçÏ´G³þ™ÖûJ"]õqy úoó[¥@¾g@Q {øÍUþæó”ú»¿ç- p¿œ¯ýXü § ¢ø˜Qw©P):!—£è§ãþzïÊÆpL Êø,9xM €Rçu —oɹÙ©žDüœÉëÀío“œ¹†Î7rESeq3«IЕ #Q09^ÿÂvFjÎ7£#5Œo“^ûè›ÝΞ§²/’Úz_ZÉ’´úyŒg g¦?çWppS¡qö½“Á³/Y¨'" €¯õ”5¡Ú߯®©>_Žà/—9æ_†€°™žô°$ãZˆ‡mønA:¯½ß­i< ÍFTý[šQ¾ù“5·ÅœöÛ>[kU—¸øî•?Ú·Yï_B¸×à(,¼ýÝ%ƃý—-º¸#žzU°Ž wjyºaÎm„­‰•¾ M*Ñ&öÁ•¯T™û‘1áó߯j­!} Ã9¿ÎÐtïU7ä~Æ>Kp}HT=“ÎhRÚöÜϕ։D™ŒŠ^ï§ßë‰KJ!k3TdÊP¾«‡ÛƳâ:ïÒº°Ù¼ÙCWí¨/.8€TÜY0P÷"n:“ƒF,J‘›Ž–Ÿ¡zAb8NÏù]Só˜@"°,L‚§÷\ ?‘ÿ”W8fȼ«BÂÓ£<(.~oZsê8ü~)oÏ‹L$Û/oež®Ù-¤Ép gFìØY•tmd‹ŸÎ¸ü÷Þ‰ò™ßjm}Ñ­x' /E×_°¾í·3!,ú€µÑ|¯Óóÿ^PK>¤G'¯o?7Üí‡ÛHk®ü-}×ÚUc_g•ðîQÑ+IBÉóÌÊåp ÁVk{DìÚP¬°r‚ Hù/4ŒŒá÷ »ƒ ¹¼i£óäå-Ì+ÎGW4³‚8r^?:„«b±4Xò!ÂÅXtµb;#þDNÕ¾°ó|¤&_êï§L³e×@ÔÂG¯ ær€1eEêeœ$¨Øø'š‹ê´úƒù¯¿º2yL|§&kÓμB‰^3Áè¬ÀØ'5UšÇêxRN‡›¢CÍo“Œjk£“…îyD€\n= ì‘-qE-)Ýí3 ä7¨€—'ðä+RÍ÷´š5 ó¬Çú®ÖâÜ=@ºjpìè"+ûòçÒõµÝÞ.SPB‰,¯`ºK­Ö ÖÍvà 똞HÜgaUï=y ŠOÉj5Ãþ§¹Y¨ËDò(¸RËΔPäÒˆäŒ:]lak›å8é«ál®†T“í‹Xé°Øy”½ƒ£`þ»TÅ€9‡¿šÞ»lÆŒÃirœµS5×Nª¸‚¡ÃrJ'~P˜Â*fUe û²ø{ª>ÿŠÇc—¢&¹T’ÆNdüÀŠU.3?ef °)lük0 – ‡/’ÿÃÕh|S$‚- þUQSá°<|½Ïrè³i¼& ™\k_\? e¯(>FÌÓ-9oÏ+¼1JÊñ»,Üçµèãáí6…<›ŒEP‰L ƒ˜¤Yn«Ö¦uê*Òw¤ ¢€—'Ë}÷I 3Fþ7ÑNàcöÓ¶ïœh)ˆ­úÔuÐp5™šrGDÂÚ˜Õï×(6qžÏwÒ®ø¸E¹ƒ¡ØF­AÎŽ'¢:._„*KàZn†vS¶ÔS@¹bˆÁû Iô| íLáEl5‚Ã…_0š^öãâê«txÿºµGb«ÅðEAИKè– ²†BD-^·I"aÈU(xzLižÚÝÅx©ËPoå0гu-}Ξq_öbÅ0<°d³õûF5Œ´ø!Ò™5üI¹7Àf¡¬‚‘8cШQVÍie#P`-vl²{äPI< ú²2v¯HË×LF…6Ð)øx ¨ð‚/~ €¤Ï9i`F-’þ-ÞÛA;NvU´:é‚®$g5;€Y£-³]ÀÓˆÖ&LW1‚— -&¦õzû!ßÅ"ø×‘¢õ qd(¤½7ÒZYX¿®«©âC‚p¹@¬}ÍMŠ:®~o TýÑÈÁÒ>é½£Í-—ÁÞd™Ý+,x`Ʋ¹âG9Ö]œ`fEØòíQxãd}ÈÎ8'å?ûßÕ”s­p˜¯åý¡¹ÌƯÆX·BÈÂT{:NÄÌT"®iâ?{ì9ÜGm$3"Ðÿ”ÍÔEö€ @ìâ1·„ Ñ;†ØŠ%Í`º&ŒïúU’ìøÎÀ}©„a5Ó^\µ_Fý[š·Ö Íés£¥Âð1Dqbœ¸ ãjÝq¶ž®„7Áª$>†œæhȼ¤4Õ¡jAX'óµ-ÒkÔœ¢^ô ñqî! ¡{ËÉ;êÈANA[jç,Ô!ª—x¤ý©d ªkðjiæ«ùÓ±WƘù͆ÞÚ·ºtLœ–ºÛX;MKàĦþÄ+š¨§WÞƒ™ë]WK+Ë-?¾z¼¶!»Ãäƒã7Œí½/É·X®tkäN´—5àôÁs¹‡çdz/©ãÝ>‚/{{y¥Ö~|EZË·€¼”¯¸†/íç('+a—eÈAÞë‘\P^.%ƒ_f3ÀÈŠ+ÈÑé=2Î C¨<“{~ˆh÷t!^ìW¡zú‰ªÖuÞ¤îJmá :5Ù'…B^öôKºk«¡C½roe-ŽûžñM(†ù¨ºàWðHבD)·½ •ÞÎ6ÄŒoYŸÜ1ú*Dƃ–(•ÆŠÿ‹4;œäp:'a¬„±³F§È7>£i¿3!’–x`hyƒÞ E¼÷Yo†š_ψ¦‰‚Ú_ÔâorçXÆ  Nz ¹ã,±h€™NW:sôÎárCÏË´ý…öJ$›tEFTã`ßUÖ»þ]Ëé®ßö(±ðTdZÿËAvƒÊ¡ÄûYéüÞÉ…ðËäT²EÄ/»bá‹uñcMcú ¸9¶1¥Äjj¡š†ÿŽ6c›Al.4Œ+Ä¢ŒšKªRtêóp7Àà±÷GõÜ`@ªkßIWD§²ùU,öeÕ z’·Ï¾ŒI4ì_/<'M]æ”^Z%c×2ì¥ÑÕ‘D/°º;Ae[Ž›)7Òî+1zŸ†V‰‹+º<“¿ðþî´pöIÁ¸§ „ØÃh¿ÊqBŽâýÑ…&Ošè›dÜV*t¶ †};HÑ»È:lÝæeò‘uD_ë.¾B¿&hbø8(¤b¿ˆ ².ÛYË Ž Ä%žMï1¯ŒÜDZó'ëÌbÓᩞœ J÷FÛü‡+ÈÑ'Z“5èˆ=ºäzáîìrí@ŠÛaŒ2É×€¯Æ?M<¡xJH=@¢Ã⸹¡3Åcr|rù|*ssù¸¶dx,i™‚~N¥XZG@Rt¶XÌh4Û w¤!KðçGo:,÷S•¤¤¥ØÒháŠà&@˜CmÁDV§-BoôÝ„ïzéôÄ”4Ïl’ç¹ë¨êˆËò/O-¼¥'üѧžNWèý¿õí‰_^dSßÓmºxZÝZ={¦† òl¾º¬ÁNÉðý} c&ÙKBt‹}r”¿O—8c ëÅ“¸»JðМ.ÂÆfÏ ÁQÎv?ëø?Rñ®¨Àió@Âá ‹ÌøÐZ:yû¾ŽX#*t8ÞåeµaFÉ®MÀÊ!¥ñ{"Ÿà7<2‘&jA<8,ûc6^ÍŸ€Ülÿ|7ÍÛš˜xk10¶Þ@ 3ƒÓ—Kœ ¾“&„2g¸Ù½°ˆjvApK =……*³{…c»Hv£Ê2«0¸z:—‰Ñ ×ah²ü ç-ÆzžÔ1]ý¬&‘¬»—[w§F …·2‹¥(v&šCâ–*€@Qžªäw1„´nrUBgÀý“ˆ'}í@Y1öTyüÄY`'ñêdÆ„¼Êh–Ëãº,²÷¡kUö='Ì#šÞö. c°eŽA´[eù¢K̶ÿ_7 3 (!VFŒþFùV0 ]X®ÝQtVYcO ªmzä8r0 ‡`‡°Îüß»ÓÒ<ê}á_5 O v7ÝÍs¾4¡e ì>¼zsEzÞ×hØŠ&Sym"3ÂP0ìŽYÑ(â& `ñ€—æ‹•¥nr’uÞm>¬°%ÏÒ#ÒÄ5Á Ò€ùHj7·hF-œ8¬>f‡G¦Ý¥oÕÎ1œ Ýè1úÈ Œkô˜ÜkXY$Q¾At êGfà×Tø© ¡nšß*½Ÿò–'š²õÏÏÏ€ Ô+ôΩ@ÇcJK[#wÖóqtÆ’­ï37Æœ«53.:ç+"ÞùsSÏ‹iò> „96\gʺ=,ü–ü×PvªFôõ°ÜæâÕ% &`švĸÏEÜ‹Ë^EÀ $‹ªþq¤t뜬tžÞíÁ:îµTšÃ±ìð]®å£9¬ÍŸÈå*NÝN.V`ˆ@×ß9+òÊdÀr´íJvIq’vópŸß[‰ aPÛî.ñ#¶?¯œe®F¯d¢Ê¡¯ï¦˜.Æ? K±"Ý*¦~Òé‹Ã·P[ú×.â(þ¹ÿµ`hû»¡è>õ9ß%z0;.B8n`ÞÀY4TÇnÚìPü¸¦ìÉ—"[y߉x7„?‡¿¹$WEo`ÙBL“ÎÝ@ÔÔb5žp`(*ZTãøõL†Ïg@¨®`Æmï›RQ=p¶O´qëv'€óa€ñG$Cݶr¥¦©È›»µLäM%ægD´ØÝÇåzÚÞl§¡»Q4'e(ÐE]©Á¸Ýç%ÓÝò EaæxUÑhýzÝô—¯ÕÓèØ>”†õ[Y¹#h˜s«¡M\êÆúƒ“ñ³E‚øq¶ÄœH:K¾ÑÍiºG7ÐPõzßœ€lìͧ•vƒŽ‰0Ì’ßêÐižkæ&ÿúÀ(åF*|©¬?Ñ™´Äÿ‰J>i^dk£;eÎk }SßË×øÐÖß ó°š½,~†*\‚€åV4?·A)zk¹_ÙB Ž¥G§a+wÇíH\þlðP ˆ Ê–¢25ê¯ï©02[YåQÈÕ{¿*Zw…木…ËtVí}<“ µÄ£;Í’`Ku» åÏÖꡦ¡WÆ2vžêi[cC´Žwo›®5DU«›³U¿Ô]…0b±²æo( Q.Î:‘*Sƒ­TOÔ°&ž0î 4þRWÝ+…|HÏÏùN£¸­áŒ*¨‡ÍŽ(t iáHÜï³KH—„ØuU[“b£S™º?¿©iÜ2o@wQÝ>Ð,wù²-v¸Ã¾6 íIdàÔÙ²ˆäÜŽm‰ë h´½9Y±Q´_¨½g³pÒ Á »÷ö&ñ´Ãñ%ƒ5g¹è¢òÊl 쎩wu$g gÐ[«­…–££B± §ã;ž‹¢¹SxÛ2›‘|•Xz‚ï_r‰ ª£rd»EUõƤæJF.Ê‹J±fØ€6ºÃ=Î>yüŸKÂäF· XÀou-‘–:éŒL¸°5ÃÈâ÷ÌÅ)íŠÃ RÞýÑôÕ¡½¦°BÁÙ øA#Üæ§Â›:Èþ¡o¢;,p˜¬þÙ&‚þÜ2êˆe·˜ImYµªGÎ;ó©ÇÊÆ4S†ö Ýs°Õ&Bôèta±Ây!UÒ= {¤9‰ËsØq¹sý R×jD[Uù`¼Ó¬D¿v+zá-´û» ÁD\užw8ÄÓþ+¯¹}®³Q_¥E å]×Ô »îÊÝ!"&î™§f‰‚MûÿAÿ0¹ÙM4‹ê÷Óq%é¨Mÿ¢yM}ZH.šI`…<[àâ ­æÎ¦ÅOÏ#pR ôʃZ從fkäcd-«¾(Ñàa‚©^Ð÷Ñ~Ó)KL)ØÑúª!CÃ…¼ºÈÂõÖ&!b=¤'ùÚְâ«a© O¢WLRú•RbÈÖ¸Û*šœ ¯¬:‹ºÏ †ó‚`.pÛ6QÛ°ƒÇ‘ç1v”­PúâxS&L2—X8Þ3ϰ조½™<*áÜ/F)0Ú:è%«b”bTrL:•íH‰Ÿ—.e7²ûŠLU1 :¾ˆ\3;ášÛÄPÕŒ]¢·m¦æ$‡§ý*…QñzÑeÿÄO Eeý$°Ñ,!#]od'ÛMÝbqÆŸJ\àRXƒ+û·ÓÀ¿hÞö”×rLt½-‰ÇϦ5ö”r=Çž™Ø«× kÁ½vC '®-Ö=,˜(ŠÒ„HØh òÀ>L/äÚE…OËoíW §–qkJŽîŠÞl7 T=#O•+K*Í"uk‡eª¹Ã#8sb¿Ñ-À\Mt–ñ¬—Õ£”I¨Å#|uïþ¸áW²b¨3¿ú¢l¨ªˆ„Bm©KC½!±޲¦£A¨†Ü¾™ª²Š2›ût:º /K´Äñó½<š ö>åc¯½ÁYóÏ܆4)§Ÿn !§I©4ìzTE¹óÊ@­àCŒ¹ú*x¶óŒal=/j&Í h}Ó°˜cÜ ºð@Ñ]å—Ýï'öˆÒ‘·³õš}‡âôOþÑI¡¹‚KO¶É¡Ë†zw–ålž^µÂàÍäaÊT¬ÓüÛ@1üx×A MåX¥¶—ð?ží÷1g†wD„ ¸v¯"N@±¿BWLt …ý+`8¯ÏÄØÇ: É:þh勱ä¥*7‡“ÅtEƒy‘¨¸ÂÌ­ÈÁ½#2…ù‡Vn6T^Ëó¨Õù³r’‹ò!"BãñŸ‘ ß}{ƒ’¤ót)Ô|Kk*a§÷“xܵ°A§aÛÿDÉH4N\f`Ý]>Uîà݈¦UóùRAh͸ª*Pnít˜ÍŠ2/¤-±ño«[^…Þ¦Ú0­å´~5ÇÉRzë ±µ}½5¥åÃd>ŸáºöbÇè€1Лê÷ÜvøªNéL%uÄ8¼íéQ$Z=À±Û×'~·é»ÎéSùwàšJ K‡Àð»r%·nONÎE)Z/èš͘»O˜w$e'5o.Ý:gÈ£GôÛÖ›7+ÚÚ¶4/¶Å"ú7Îtýt´Ó}‘›a,‘Xj/Âá­•¥Ú_oÀâ`6'e¢b8oعÂ|åú„ï |©§{Aݵ˔P«fÀv§Ô}¦ä½²ÁÅHBki˜~êéfô©7úe—²¡ò¦Ã´gÅ}Á¦âq´´ûz`ïæµ¢ÍêIoT=öžå‹Óc±xp´ù~….(nð}Hý,îDõ¾¯è±q‚ß=cCÈZ¬XIBtWJb1e*¡”|ÝÂW¹B§úé×^€ïU)bÌ]Ô‡5¡L‹ suV6e0A‰½Z)›îHÁbk·vb-ˆÓ°áœ´©å|KÃi¿Ç'ûE!pÙè0¬Êxü÷ðŒ©¼­|£¾2[`Æv³ÅªÿoÊ€û¸s|{ßQT”9àk8y×µ:u~ÂÂÖoþ,Ý n)˜ ¢a½Ñ±L‘j@;¼~£j8ö´Ôq­Ú ?nî9‘nÈ•.jxX¼e»Tˆ¦»tnxÅ×ÅeëYí!]ÚtCe?dgÄùrZè9SF„ˆ¦ê‚7ÊSƒ(2š‹#ÓÉg'§¾hµHã”Ò½>›[—æÈ°Ó²ÊBÁèE›7Vg™ ‹(Êã+¶;‰sä3Ñåü²k/h˜]ó?7®o2¹´Í¢p°°`Èå "ðo ä)Ò¹w£x*fv®XÂD×N6E3×F}Û6§¹?'©·)»?‡Àn8«²j,ËÓ_*úÁ …S_D'R–Ž÷Üvºa#) ¼¶ÉŸs¦ñ³Ð—_,tWfi”ÉL^oÍMLÏ)Ú>5\Æ@4eTqˆW€ODLBfp 9 ¦ÒÂYw¤‘rÐB=_ë<ˆ»Ó[-A2Iy§L55¡[’@#ÄdÍpÒ'ò„#:VŠþ0ŸiÀói˜«¡„— ^GÕÙiÚ>þ“ÀÌ7hŒÄ'ƒ‚:ª| ¹$ÏK–Ú}Æú­t-3«ÁW0Ï$asÍ !FlšJŸ†înÕ¼úJµ«Ÿº׎KV/J‡`ó]UÔÍ,í ò;Ø  ío¸îü"PU›"xaÀŒºçH×§1N5^'ë¾<ÆœTDB™‚YÙ–nšl‰ùØyj ¢t\æŒ=6†!ù®Ýt&EeïòEì}^#]RM m³¨#¯á”MîãŽl6]Žò‘|8*SÙMëz•ši£™3ô„f¢A´³žŠ¹d6w¿B¿£ ‹8½tÝœ÷ÒÔfÊ·Ì~½3ýüœ»À² Ók=]œx±!p^šÈÛKvq)nÇc†Ç‚Aûáˆvµ Ú¨‡°˜} z!£+««‰wôë%•~ˆù= ÜéIÍ?«~ô´bzsC玿æb¢¨FàÅU¶ÔzSc¿c£NH3´ú³¼½UN3áóEBN )À1ØO$¡% ÃÜ(8Nê@½ÀiÄW½•Š*ÝÞ–Y´6þ‹«¡×"ø+kǘ T†ücâùqgv÷V»‘u*YQŒÙA­dS¬ZÛ€ágï—:Om÷KÜ&‘E}¹^¤År1¸9vc½ Cˆ¸å²yðð”î¦çol=;ÃöI‡µ¯_}R ÇaÝ6&TSßYŒútš@GL*ãáçG,ÁªMZ20DGÜä§fÝ¥B¿Ãñù;¦f›Ïƒ€†4¡?Ò®FŒB© hã¾â¹ådÏ'úá®qå†*…T–{Èý„íÓA­õ|³äa{e²j+ÍmGçybµ¦ )ØBJEµ¨ú¹·@LÑBʵìÚÏešKI—¿o˜GÓ¿Qε7TD‹ð~ŽIxjqVþã–lHR{‘“#<€¢Òß·H‹•ú_œûº»¼]~kí†ÉæžqûS¬–ú j¨æäkg½–¥Š¬H…M\df2› œ|‘ ßì§„³U?Ä>L.¨á8*±ÙÁÍ`ãpœÑ„¯)6¯¼7ü2JsËók˜R¼ö-O%ü~9‰²\OŸOñ+R׫_ €Ú=„j=ä¨ßÖa"£à¥aË­¼ƒ¼ÉäE‚ÕÖ>ƒ,R¦÷æÇ :ŸFÃ9ñw5u4µ1tÅÅå-|ãB £[þûTäwmúig‚/î…Ïê¥NßdÕç?s?0! Êo\Õê^ØÀ›;©Sé*Aƒšg…rÞ­¥œP¿gÆ6{°<äûþ·e)“Ÿò¶j‰â'Bû0¾¯,çæímYÌ ”»ô¼p¯bx'~Õš•£ú"þ5ª¶†ÿD"7Á´©ýöïbäùfîÜ–¯}Sòf2¶œ,tö!sCêó šn%¨ü& FsYÔKY+Äg¾…læ].¬ÞÕ |¯w˜‚w §àfz×£îp‡š%Ä FŽ0~Äê‹¶z…Ft ÌBÍh!÷^«¯œ˜VÆû1… `Íÿ|ºG<@˜¤ZÅ3-kdÙѼÄëão’k-Kʇ76L¤HÎè¢vB^B¹|/ôà*øX2b“6…Gtü#fqØÞ0»¾±xMæHœ×]ÆÜ+ÊØ×B¶•O(ëj‘ÚiwØ¿î pßuUódYýÖ?áÑ1xX¢ ëÌ„S1ËkÅ fFJ»+3Aѯ “×=T}¾Ž¢I´Î…ÙØ?5²·ªE âŒÒ/‚oi÷±÷¬€-—û Sj½øÍ'^gÂ&t³kiÇÈA “ú?ÑgvO-àÛ–k›®‘hUMqŽ¥rcÔŸ£D?n¡ájM¿É»ŠÅ*Tq×UëÔ›SW`%ACác²)@¨*ÃÂdÜÎ÷”°,éÿÑRAl7¯oACû€Ö5èËþ³ï<)Œ¤€vŸ ÓØ»A™Þ^Ýü÷ Ù[~W¸ Rš"I®-ÜÝLûGŽˆÊ^Ü|J—·¿´ÏB'¶™Ñ¥ˆO§>‡qò¤h—_¶­%ê{âªü“=7aðÚ”2§+ôúUÏU[}È’¦8y3>\F!Q8½–}WF:ß5Á=ÝÀE˜žšûfŒÓãErƒo~Õ˜æí‰]½[{±¬{Ù¤¡—ÿœ@P©†„¥és%ѺlŸN²wsÎÔížcÝçÞ;§y‚5ÏfÐÇQzíÛ«ögö¯Ä#QÃD¨Ïë|ipr¹Í´•Œ@h]ÒÆ1{ í åßl K€)Ô‡ƒ±®Žõú¿úû´+éÒkH@ÀOÏ‚löÁS;½4R}*à/ô#vuô^ÏL”Ô^ æÐ:>9›ù°‚¬·3)ch3¨´“öÜU} ûL3×ç¢Aó[°ˆŽËºüOÝý÷ÌbsÄù+q¿õÙj‚-ÉLJÁý7)œK·k#Ct‚í†à_ßÙ|Èvîî@*Â_›YEĆ)¦c-°çÒÊèȇqÿhšó¼#é`¡‡*Ý™½ËË8‹Kí —0”~ÔwuÜš+‡x­Ò¸§|sHÿ5¶@;ûÛîé-ò"×–¾Nî`qì¤qÛW@d}kIÒúƒì|ä¼¾uǾ,²ÀXÐA££Öe†m„¥¢Ö^[sÐÏHŠÔËm{Äζ &-L9R¼D>îïþ:Ç/)!¯¡Lá@e^ô™²þº³›S ²v‚Óa‡MjxÑF>ö!¨Û0ŽG&TûJ\µ¡GµáWá ÜÿI¬Sb³zŸÅz]«—ø)‚Ò©’ˆˆQùÅ·T€†hêr”ÈYë´à‘#¸âðÔí1 +†l€ú^sËYg|ÓçI%¨*nж¡âŽ5⻣·œÈÑÖS¤ˈz¦ ”¶B¬6ùr Bdó!¤tûµuv°TPµ±uÓ£”ZÔ͹XÞÂY÷Ã×À®:l¹‡ƒ[&Þâù/¸^{‡/5Ì~s2©A&½I<‰ 3þ·¢T´v#ød\RÒ@Çí§|‡©éªï5n¬XqNÅ‹Hy´¢Öܒײ*çX”Q|ÃÝ Æg»ËÝl=6«¶62;+a_cûL¥wdè¸yl-ñFß5 Ç)2¥ý{ùù±“kd2õÑÕQÂÅÔ‹Ü“x[^gñæì ]Õš ö‰@`Á•=-³ÇŸH„Oz Ü:êŠSã=W{gé!:¿³P’Ÿë6©}çe‹Dº±ðâk?Åa"z\/B:®D0p>Ÿê™¸aÄ¨Ì ÷šÆæõ=Ìëç„|¿sìó]OU0-ó¬q¼9Il檼#Ö˜ÑÆ×´…ûoö¬gìô|g39 Ϩ›“&µÑ0‡IÓäy­¤w'L„zÎó®èàÚ4ɳXYÀ=#¿Ë7dFê-àŸB¬7ðg=}ågè ¡±ZÈÀS·D+(Xm—Wc«áêç'ÛåÜ* pH ¤Xú– ¹WäÑË…q8¯êrS^Éq´¹ìëàLQ—M”øt°ãçMœ–¾´ËÜØdÃÈJõ ¬{qñ¢¸ÿf‚.ÄÜmŽÜ1.íjÎ1Z*(Çr!l)GàyÝ»2È2/ÎWÓ°å>jz+ñíGbÂUê±ó-\òEgdJ]æ ÐξًXDW7{öpe÷—Œj¢‘Jh©Bß+'Bb e[¨x ïP†Î¶{‹:§ä2êè&ÿŒì•ÐI‹Ìç7Þæþà €øÝtð[›ˆyJTaÁ/aÏ‹½ÔŸ3ÅiÞ‰“p@ºuúìnÐP&ìÆÜM ´Af«ÌU³Mü’W%¨ê£)1ü6]7A’/¢n™¹<+Y¤¼"j?†ÿQÚµùøP¬Óß6î†å³ê¤W™r"=ªùäuù½¨M•¨¾as¿ÑþXl—<¶-Ωt´ˆÀiyèï¼ôÿéH ¯$¼Ä~àYrvE_’½¢áž˜æèÖ½Ö¯«æ{e šaá£Æé*o+ØÈr£-´7â率–A`ŒòÕá •/‹-œ –2&e±i„ã~† ì9,Ô-Ùªmæðå¥î{Í4¥8•Ñ)ˆZÙDi“õ϶—º[›«)w7V¹†~J%a®¦CAK§æÚ 2Ð%. Nïç>*±c9|"fÎÈÑËw$3^Þ|×SdhùJc-Ìí4€Ôéº~•…ãõ/w@ÀȤGºŠç5ä¼S+FõQ4}À³–Æõ6zMÛUþ:#dÖCÄÃÝùØÚÀñe¸½¤G•ÿFƒ !Ì™TŽz +ûØ(©`ü釥¬µâ"MÌæÎ¡÷ƾi$‹`Dí1<Bµ-Ö Þ©†!M“h^šó¢Ù÷‰šaO´®“d ›Ñ ØA[Ö%®N.ßsç¯ÛÚÔÝ ÷Yx}¤*GOlJ¦þèË[áé¬j¢ÑæçN²ú⦽ˆt÷FÑJQø`t]Ë ŒF¤tsÎ7ßÅ~‹në6—XyVÖ%Z»Õ¯~YßbîË@:¾qÆ4ùãò€–Ÿ†kHÈ*¹¼ø5í´/r³5&ÜÊQY É/÷< Á¡ñöèósĆ]÷uÚöǾ`òÝB2·8¾kÄ‘úc W0ä—JSuçJšÍ.Ô©©¤_î¨AFµ57/”å[÷RjÒsˆ¸^ »/ZñIÈÉšŸ8¦Ï…ãXø„aEô(¨¡Âm¯Ï¬®y’ÊÅ+å¾ä<»"(I éqnQ.g-@³I g.³äy1nñ îmÂ;•°“û¸z ˆs6EB?rÏÊ›KIŸŽã\‹C-XrÍÀ—Ï!Ú¬„¯Â5è¯ÖÖÎ!97sº¼5Þ[?.ô„8'¦ðÑÞœ ³ùÉOº:w&ÖG—-q· Ï2¼/Ð5È.ìvi¦c1&{N±Œ_¶²ÇŒ:†åª+ë¶­Sša,# ¢ÂK@šŒÙkðÿkj|OpâJjx`MZ4 '‹©±lÔµQŽv³ÅáI:úŸßƒÃoo(x]êÝ™.¦ÂžÑˆ£“:[RÙÄnzpºÓ-¯Ü8ž£Õn.ŒH'j‚ùìD dhÐÞwêQq¶xó¬Ÿ;âÕ܉šM”YYÉ™3Në’óKˆòVÿ¥dőձy¼ù~‚{äº!”#% •¹ ´4{-Tò¾m1¸{R]6€pÌr°ÜÏÜòé$µáD/!VYÃ’‰·´¯ŸXLIÓŽ¬±‘ ‚7EO³"ÍKâ«(‘]¨)¶Èt†í~¤ÔMnÛkÖœ%.‡þ˜&ÀóòºÑƾ&æs ñÄË"y6@N6*Ö’’>4„•Q‡Î=árÍþ$M…ÓÅqkzC8¨HV~DÓÙÚÑš—…'(­Å̘v·dʈ™&gÖþÔÇ=F;© ò|À-us*“Ò(Ò/Y¡]sI²î|ž{á¬#Ëéܘ¢yo_Ô¥…;‹¯o&e ΠÄ+ ¨H¹wéû¹?wÌ/b$£9$+¢×ÌVSsãcmÀÏ­·ÅÈÿ9,¢–u-ª{ÔÔZ+ËolsøÃ¦ÚR…Žàäóš|Ž­¥N‘*Ѧ»}ÿ}4!S=ãý…_uhï•Lº6#³‡áS«9³ìWü•q ßü¬SP‚$§ßÿy«Š$äßF’n¤ÍÕf^O4vKSÉ6ê«ñü{ßÝuM"ÆÍÑÖï†Áˆâ⃠€¥ª7ÀEÂNêU–É'äå¡Öø<ãÌ{ NV£¤dLkIôÕªŽÁµ×iÑk(áûm´[ÓHÒ¦òAvnÀºÝ$õ?(•M,~;@#aÖ4Ç5fU-„‚Èî ‚ÜŸÙLž”èŸe¾¾ G *üò‘¼î”ómlŠà~c¸'“wYùl‡•üDu…)^o@èMì8töv-Íàsˆ¡N]T#Y ‡¸_~ˆê#Ea09ûÁ÷pí—@Xxö*z x`õ'|ªär!qßyT¯‚Û|VåšzYñ3>ÒÒNû£>Y‹ŸÞÀAeyº:÷  œ;óýÊ ìÑè*=~ñ=7ò|¥x§a©åî+B^®¸) BEy˜¼ØS#ÌAØéÁ·ú’ñ)͸ô˜Ç›“o½²ëî@*Â[óÎÓ'êÏúûà#ðâ/0ú´X"ŠÿÅE«ÖmJ qnHOLÿhŒg· 8xí “šßßbÿëÖlŸê1ñ‹b! ŒóßQÎX„ˆEþ#†ùù¨î¡æ¤€e5A¬zÑ‚öóà¨dÚ15û<è0 9S^f»:Üì)”T·–oê¨a–_yÀW]Hóþ_ºÒ#›¿_~_ô.èï M…†è"º¡â1´ûÝlöÆ-;6ª„wÙ'>•ÖlöPaëN>Â…7ß·ïõÂõ£–ªpR%þžY.ë˜ TwF»8\Ùy»ü4ó‡ƒÁ6CÔI¤'^8ûN£ iÌ<Ó×ý `îã1¼}G®åìÑnðý¯ý¢Àó<…15ïÍ%¶Ê.çÌ‹F}NÂ/ÎiúE%;‹>„,'dVí]K©±›¸®`]OB2(‡Œ~daR:/âÉ—È&°àŒts{¿ÌB*†K!ž²öZ÷ÈNèXèä“è Q}[xýÐä¼DË–WÈÝœ7ëšÜ.3ä+Ú>›› ×§'Þ€pá°2ÉÃOV#뫵Žé |…à¢Ù2yëlϸ,ǘðbÑ®~·Cäùn½°âžœÆÏúy 7¡JBJž—±oRΜhÄ5#↎ØÙ‡Ýwd±ÜÉûsËr¡ªü: ÓSÆJŽ4€ÒÃéÑõƒâC{ÁÀRšà9ñ˯ ÏØL8}§Ü·$.£½­øBšÞ·CåP’’7º’zëèz™°ØЪK;¦t½«]ãqnä•{ÚXòpµ'ß¹âþ5û j°ÿµƒ¹RŸµó6….ÐÔ^d­"‡êt×l¦0à®6b3ÍÍXl€16F§‹ˆñø‹@‘€R-Þ8>“g^Y“ìl|ZϨÐñ …¡Dá‰':Æá5é†ë¨PtÓÂÓº!´H'ìzUïØ¤)ý¡ÚÐ’ž†úv’ÌFç³´A€e˜òý`¡u@Ñ á}š–gƒGïß Q ‹ÓòoÞC¥à×k·/ØŠpÏéP¤qÇ$(Ž¡?Ï*Zz=T²Ó ª¬ÜŒX‹Þb‹0Â\ÏÆol|_x€ØäÄ! ÃI³>´«8‚Ïd˜Ä DUÅ· Y€ 0I?c¸C³¼ªÅð%41ß?óŸù3„Ôim·sC|=½NyD1¸rƒ‚ò¿Þ§]Þ&™zo(]êñ>· Œ‚ 1!ìþHj Ãfýv’}S 4Húy J–öbtÕç§'¯˜LPb0"£ê|6MÛDºW–Ö0 -FÞƒ_Ê+ò‡ 䨔DË@T žMËÆšáCÜx*m×Ð4¢|2=±pzŒ¸ôX³úÆd7wRü¼.î¨B^ÝNPßøHâ«Nf tÅõrçþnÃ}\îÊÔ»<þùQ“ñj:ÆËáÆ  hVµËÈÅõœçû7Í;SþæÜªóÉ3¸Iý`….êÛêÅc ”똭J1ÒóU£¡vh\íYæò¦öX15lʘ3¾URÞ¨z6/â6y¨ÅàZZŒ9_© Ǽ(|e‡Òº|L"Ü3– Í 2º7ÜYç0¸ñíž!Y“±o£\xY¸øò™Dœâ`‘Ì^šH“ÑѬhˆe¾¼8…[$Zž÷¹¹v>üvvéÛhŽ®ÖÅG‚èðe¢Ï|¾úf&è•’R»æÌÀg2ïrb q<˜—x'Õ4az£7iô¨œè™Òš`HQk žvLKzf„pÌŽ¿TÓ•qNO…óîÝFß4xg ˆ³ 1Õ[¿nÀ‘Sõ¡pâÂÉóžÃì4¾h±±?9Ç‹kB¸uCð<5`‘óp×{”ýBwµ»ðñ[bÀlØà&×@-SÕE]`š4‚ß"j¨+ '‘Žü`lêPSK¼”&šHuÙ7 ú Ú(ºi ¹£Ê3"TZ«Å‡'µŸH£ u„¸¦ó;ý&¾ÖÅléÍq:ý˜Á¨ÏþšEŠ×£ °ôýPfņi«˜ Úçt’ @l¨æ›äƹÓl 1IF%ýøFaÒ °ÈæÁÎ4di’×¢x §½·Á]Ših¥Õô  œ%æi\8<'8w±÷UDq:¡sé‰.Ïø õC‚¢Q6˜‹²"WÜ'Î^:«¦Ù¯T’5èì0³{…¼?7d®ÒúÎ þ¬öþú³Fnl³AJßi±wØ«.§4؉Xß” ÝrT}7=Ï‚ÑÄ„×TK­“*Èh)/p³Ü*îèŸó»»^@œ_G;Íþwi¶ïè7‡ý„Ös¡à¦âäH 2É1¯ê¼OdŽA…ÚÈߣ š‡À8FÓ½¼¦;Ô˜ÿo–ûÉÐÌòÕ‰q½ p<¶þÉÂ,xÓÏ“  ØÙÃ\$vC‰*‚ _Ÿn¿F8,ÂY'ŠikåK¡µm±îä)‰¯iã„s²¤1sV¤áüʲF<€µù] IÔá¶ ºm=72¿4ú·#Á7?æD–¡‡2DOVÒ.Ffëýž%»Ró™ïS7\’€×öÃçt¨þ>ªxîÖ©O…žlýÚ®tÝ’m‹ý¤V?ßþV®ç¹ºÜfß558Ö" ];MoUÉzE 5¢[GË3’5¿åJ¼Eÿ΋5ìnɵï:Ñn¿ŸÈqsjãd5 Î ˆ(T¦SºÁ¬£v'mûùž›´±ž¦ò4¡q’ 9VPFÛZiŒ¸jÓ×þ6`ÀoUJ — â µ~’D޼S'düÍÑø·áÐêàCÃK$lóâ)›Í_˰¸ºŒzxhŠ èsÚž}”² 5fð‡bürÆ×9 ¸'aô(®‚Ý»›Ýë™¶S€~bW¢ÛaêO²ÁÑ3ë=mÚÙ€åÜU\Aƒ¶ñÀ¹2Ã>Яd&7%Xöà†¤²_¶Î§†"šËža¡3á8h\H_P^ê‹[ËF^Zi~-jÿß Ìx¸§Ý/vïÍ˶ i–§Z Ÿ”XÓO¹Y%ÿñ&æ¶ÿX[Vl´&VM‹ÙƒSßW%ç"†á¹Ñß6D¤Ä^3í‚é -•é|P3Ès7VÍÇc¼\Øé:S çÜá"M'*ÐÊpÓâ°prŽ ;¡?èÔåø[=®Ò祔…AA $i ðÂHTœ€Ðßf†ãu}JmdIöU `«£3Ûôa[¬³ÈÿoX',ÂR#k)ügÿÊ^Ù=ø ‘\[×±­>„Žy‚é·g†¤RJÀƒ°‘9m¹ñ3Öãª_û´Ë°þ¸|Ú•'¢?ÔY-÷é £ôô&§Ó«aNEÛ™UoÄÄö`CBø!.$ÇË$Ë¡º§¹ö;° Uñ%©&X¯¬pD‰hC)–†õI¤'¥B²X‚0 “ŽÙzzc‚üpO06sÎ*é=õæ3)Ž¢ÃiööŸØ7tÞqJf͈q®ö[ŠhRŸÖ?‡¯„ó­A‚ 鼸J~¤ô88I-ÆuØÖÏÉÖêtk‘«C, ¿àoüÅb×d@o9õ=ÔÓ"—$è§õ=)VÂàs4ÖVêM?zÐ7Ó¹Ç`/† â$CïÊÈâW³ ìß <ûÐaïX4¡æƒÍ}bK¬C¦cFž :®öIDï|Cøû¢!Ü„n†¨†jÅ3„ý5ÑÏ4ët»8(”Q‹»å öŒ?;oóýäÅó=‰äMºðJÄü¤fvñkŠ/úĸ“<æýù3Ta™¨cuf³æ¨ÈI&b\½‡º_ÆGž{”#ºÙÊ háêñÑéHÞD%y†8ŽuÛoÙ®AÃn¦7ëÐ/'.¸87…\{&'(̈kËbD7øÊ0ñB|}Ë”±œ²ŸÒ³ˆÖ,­`xëu( ÄXzê  °Â«Í˜t8Âù‹|›Ìï @}ˆ(b÷\ì÷ü¯‚¬Óèçs¸†»¾,O(ãš-–J)¹éwõ³uö0òsÚ¸íÀ°£r޵P³+å ¬Gi‡f†É`5ÂÑ™éUßz™Ì¶€"Ÿ.œCÕ÷ôÝKœ;Ö™‚à݆™íÉsåZ%“vË«¾Óo(Jž¥Nï¹òÅdžs8Å,Ñ–×¼VÍÕˆ#fî2þKV×p27óÓŠM\ô¸QSOYz#½6F uqþ©—¹ $9Â;eƒê¡v)’4ƒÌ™àE7öÐ,Déšúx ïð_i_8ãæ1u ÀB-–P£’Ùy†‹a|}&Ëš’ôxÅ~‚,>”k08Š89À¤!^é1JB¾×A 4[ÑoF.`ä“ëW§u³ ¾U„#³{ÊÜØ ÓZ:ÔË&×\’±ÞÿLåè¨3*¡…ßg¨tãlÒ@d 9— éO*”vߪA"[¶\õòòwù2Ë;'4dónˆI•×ÆÝ¤Å—íŒŠ¢MÙ‡iøËØ$àN³EÒšx´¬¦ á¼ÆRsQîU¥PÏ{´HÃ’nZ´aãtªëøh…¸Ù#Œ ÕÕ|3=þn¯Aû\pq¸>Ú36. §mùƒ+µß:¯þXãcDáè¥a6 YÜ_„óÜã¤Ú>2ZgÛtghÔ"‰ éü¤’x¸ˆÄ»bm‚Ùµ-Ò¨U‹é£;D’ÍÍKŒ§wš‘'ë}?ŠÀàœøo”®VŽÃ¡+l‹“„À˜/ù@S#çéÎD·T”|öë–»œŸ¤Xi®üF¡Ÿ•{g~“â]|ÎÊC‰5× ÅÈž¥âѼ seו ‚'ç L¿6¡í‡§Ï…H]«p¬<ÖxY·-c„ ©³ƒ2ÌwK'¬š,!¤Êý4“¢¿Ãtdk£JK´ºú6”Rø¥€Äò{µØߨ+Qé]Û#ÌCª÷FL±ªa ãÌwP¿ÒJÐ1ð÷‡ijjoéòë@›%žpkÆN+·£(gÏÝ=/;¾r”žiZW ¥œæT[Á¢cQZЗ¨/Q¬"9ZìÇÒ÷|©ìõòÁ!§…Jï‡Í!p¡ù÷þ–WòÅÇsD÷ðzüiŠc8-~Y×ëÈVU;ÂÈ!¦fN;ÿùcÃg·Í2Éõª×Ïyðf¸GÅ3ÞB˜‚JðÛ<–·€5­qʨZ¨vîŒhdüŸû­–jÀg®!ùÚ5UÕ](1Bÿ@qTˆ##¼rEMRaÑ;Æ^Å8™GLýLÑ=Ë_:I¤–{ŒF}¡ç~ß?Ç7ZÚX q]7ûV²©î2–Ó¬©Å¯}¸é,9ï½ÏtÑÉ“·÷Â):›ù.:¡{ H 5¹w¸^¶¯¿¢f­ñ×ÍåŽêÝ‹-}.äÙÿVÍÒ˽¾"›5=spùšËð†@;–¶èY•*4Àµ‹H‘à)üPTÚau̇†ÍC&TŒe”Xz®ô`ªYœMœ=f¼wv³ˆ"ª¾ÁÕ.)p,Ieƒª›ÄemÖ÷M(õb£ö ·éo®¡_/ hýݰ ŸüÛcZ¥LG®´ÿ`ë>@üO‚ ÷;„@7S0žD<¦l»\Ï}wÝÅ‘pxíÏP½ïAs#:Øî¸Î,乃ÆPމð˜í‰Ûò«ºIñçݾ küçJƒŸ|ÌÏJ3•ÂïÚV”tLñ°"#a­ð,­©o+”¯•C³Ëv5Âçæº½ªÐÊßa'ö:¾ ~lõ˜'-9ÓìeNÂé·•Áæ¦\P¬T0±mµ×c¹’=­<ÂØÛ¡ÓÒŒï=AãhÄŸè«mçwLë4±þÙ葜/)¸¦]/ –dD¹n£Hè»cC *ZK:9í¬NŨùø¼´7{ ‚[_Í„¡4:ÊÜ^ÇŒí£î¼ç•Ô09ݰÖ"Œplóœ)‰aŽ,†þ€2à“òDæ[½Zèú^Àq}Ze‰p}Ã[+Vs¼èªóÏ*޵ Là ê>PVä ÚàèÞÖ-ïeZã1 gï#wÐ{pu†kVD×2¡Ù8 V8n)bõ¨Ì œMT è*´æT½fí龜ϱózÊfõÿ>J%éܾoËô1]¶ëó{‡Qº[ãæŒ;B€ÍÑò>Ò\Ÿ µ3!i†9Ó|Xsr8F`l NR+Wµ’¢ê†3¢ ¿äf‰©ÇIü²Áº]K>ÇÛôúÈ$ ×ÒË÷!ê?‚D—Ù±4Œmôédªßò“û@jFx×áÍ]$á‰êêñ(ÊÂL7d’*ÂA€„QwjÝô'¨áÞR'¸%FñÌÕl`ê–ri$­9E—…ä¨lYä?)dÃ2úñë‡êŸ|· 1Û©LÏÏÄËY%¸Ø'„*óËcéÎ{ø˜@"gÛ_SÜÿàSW˜.ÍAöÕ]mÁHÎ~ˆn.zr cDQºmk ¥áCN¡ËżP‹¬!UI0þéÚKµÓžv|à‚Î^'7´p€pèæó%Øé§9ŒM'ÍP«egAÔŸ-UÖ˱´Õù‰?€qèB=ìjg8©.RtFTœ‡Ô¾7Lk«1¾G°¡AY7¯z{ñk*ï¯íò¶l$4h„‡:Ü®ŠÌw½º/ìKÀG#Žiîä°¿¯ÂèÞˆ,uXP ÀAuʉÑê@ÍjüZ¬A(Sš¡ó«ú5/i¡2*~P_hwE˜ònòHöXÐëÐ'Æ:çØÛ:/û´†w Ø÷¶œ+нg·>>ÀÕ92Qsþ]_dC¦Ù‹–zßõ™A™‚^ÀDqvtÔê= ²0XßÑVpŽ7Ú€¼/ Q¬Ò]DøVãkTø)p%ò¿~îí–KÔð¾¡x¬€±úÇÖL+íUf–ñd¹| Äøì åˆBI2²?šÉ{RìUX }ù꩸گ&mÀ ,/:ñ ujÿ zvœ)Ÿßû¬Šl6R(Y¡EÞIÀ“ô¬+ç#'Ã^oVñŒ!($# /"o°éär‘k66X# Ýò¨ò;Âù~¿³„὎uB)Zè@–ã¼·÷çìû9O¨²É´tdUÛuZYa=\4Ð{ωÇ.«±mÛ¤ÂÀ›H¥ÒuÍ•)ähO)G’dÉßoò·%Yð¾E<È<´êä*¼²ðÚ}ôβê6›FœµtŦ‰vv³…^ž(_ ÍFu8\ÖHR7hlô*kqIA¿ÅoÑ«Íý)+Sh®3I´öÖ+)OùA±ÌÝì ÍUˆœƒ¦û}:Ÿ¯ŽR¥}ìÍk^$²`*%àœG}JGïRDõv^øÚî;{¤â†×dY€/8Øé}šUycüõÎ2§Ý[øGp;É1A’©E¼CDA”«kë¯)¡G½UÒ¥æ…äÃG MIª£Y,c;ã«3K¦‡ëA'~ç‹ÛßÅ¥„öT>ÀïÇ^f&?aÏ-ÝÅÞVH±KŠ'\®(©¶×Rÿ³îSXö…r©ÂãǦɑÚ"¸ÍXÃ’Ú¡#­EËaa0CÄdßìè°h ÏQn8¿sj©ú :äëÄ\¤JLð{™•M“§Y=QéSùzpó\ˆ£„—ƒœ·ùÏÏx‰2²a«5Ÿˆ4f °Ë\i¤‹Ã¦©m°ÇÃFõäNÎ0±ÃåëM <í‹]ûø!g ¤W`Ù Y;pyÖò1Óéÿÿߘ¸ñV¿Gï`ð‚û«6%‚6RtDNlaZŠÚúCqËØl«†ª‘Жê$JóÆœJ/b õ½·dï0“GódF“ƒáKr¥*°°Ü Žx\rIYÍá»ßCæ¹-Ì´3WnÑ÷·zH<™ôf.Îåjü+(&:êæüÆV°.Ö'\}y‰C Už·^Þ¿§#uõëfÜ:ÿyŒkgÐ]‹IòŠëµ 6Jÿ£nñ c•‡–͵@]=‚p´æ¥0êF0•†—*7dýDºº´Û­7™þgê:O˜AÇŸ‰¯Ï*HF'ü p¨RƒFãÂeR2ívýÔblãìŸ4õù§öŒP¹C@$·Ä =Îaf”äBb[ûI%.±V±*¬¸K³˜_»„1©¼ yG«À•þ²N½É8Ô혋å=DúU4ÉÒz=!ÌÂê;je.ÊØ VuËñŒÉ·Î™1Oµ(:þZQÓf›Do EPÚ­‘ÃlãåÓ8Æ].gVHÁGÜògªÍ»¥ œyYÅñ-»”¶OÐ'A!)qvõøIA.Ü–C®*òÊèU,i© ¢«-í?ÃÕÕè˜|¹µ8ÿ¶“Ô¸Bï}Šñ_Sÿ„B«XTéKЭ?)Ìém",~ >óÞr­AÂáyü ´àæ”å‚éDÇ|¤ØxºoAöVœYéJìT*¹Î½¼ —&ÛVþ[fF6™&nH¸W,}.EÚø'Üo÷T:E¨·ûŠú¦~Ú,ÀguÐÓ tº3y#H—Ûª•PA Þ>À!Ç‘oR·ÏZk{r…(SXUIôSÌ¡×?Õ(­#’Æw@Åh@öÅCŸoT÷A–æÓ×@ñJ0ß…±m#§F4ÍÙäÒ×O¡ì³Û Þ}¤8FŽÑª¤8¤cü˜ŒD`±Å_ªµ…ªƒ|æY{& rVUœ+bq9±¢­`ÃeÊ„\åT¬H¿‡Úg{+$ ñ†©GÖ$ïÀt~ÛõWü{õ@9@Æ¿šþïE5Ç -Ÿ[ ÕL%»‘ŽÁÞ4’Ø0HÌŽºF )˜!#d=•¬ù:Þ¤gÄ(j¼W]&]{&ˆ ÀUÔO»Ág.4·>Ç?O¬Îø{>¬ÆŒˆÐrIv ú+yxc¶­ÞD™\:5¦îݸñ×nsl&ìN‹¾µÛߨ@ÀÛSÇfbVd¸Pk±¦mè @Aí/hf;Ñ^;“"4ó|ÿ(䲬—Ô +VÞ9®Äj¾;u”,&òÁ$á­ek…˜ñ£5 548Œ"[ T-ãÌ–À·'‰4›¼ÙÄEÁ’eÓ$@ö$#©Kº ¶·×¢°kWûƒ&*e1aæ¬û^‘l"¶Úå„w@£j@¥fŽý_´8ùñwœ¡,ÖñÛk  .ؽî—3IÉJ‚çB—Ú?n@̪—ïe‹Á¼XU01hâ¼»£sE’96t=Q´ga‡TŸ¶Ì|¸ÇJŠë³ 7æXqH©L·ÁòK7Ò˜Ú‘Ê©–¡€Û&/îét¸Òˆ¦¨ìÈäBÔ¢î “¸šûšêW;¸ÔvéÆ~ªÚÅÀ¨×B*¹Q]Mà‡‰; 2Ú´Ë‚½z¦Í‘1ZÃÂu4Ù×?(\¼=~ ,Î-¡P+ÐJæxš¿Ü|É!Lgòè]â¡§æZ‘×ñ9ujŸ‘-uœ *C? Dá.‡9Ä¿!{ùUûGÜÇ ³é¹®ÄgåàéÊ¿Ö/*I>¥ßA£…µkE) VèÀnºì8P—wλÎP˜4û(úzú­èÛðä'FêÓTwÕF~úúÃsãç ¬zØY«ƒ+—¥ïzÌZcb߉ËRXš<èË¥%ÜFâÀ€ëfËN ÌHrµöù¾66q@ÃÊT\Ã’né_ÿ«xH©ZÊ´.;VZé=ǡˀ²…NîoB Õ {Ýuéx"º|}eý8;Ý[çÜ™BˆŒ·Ãœõoì°gksÓ *71˜™Ø”&Ú) 7²ÂÜCüô¤>¿…"¢'^ºdbŠx¸wâïô¿+\b‰°æfCu_„¥´ŠöÎ # W /4FÊ|Ž¿o>¬Á\1º›ÖóÖ0œ¾Íán±mŒ\\ úBkR\Àó:WCÔúă KzÝ5í;×÷°r„}-C ßfzo¾I£q¿»­2:µ’‹†þNt`AàöäñþXŠÇìÿ–ëÌ"NðàŽ=…f¼"‘¾âH’ Kôä$ÿѽ4ÑÊfõ=½j£;3ÎNÃìèß¼s¥MÃP£“ŸRý@Åf°1$¼sÒ€5ò+vö·÷¢nþ9.¼5½qÑi{Éú‚¡á7âƒ÷ÃxTüükÐ1¨QõåGQÂÄ £ ¯KÈÕa¥¨çư¿Oß›Bõw©¹ª‘ÖÚpkýT>j‘XŠ„^¯›I¨Å¿5°jä•ô¨Ê”ÖAc²¼H- »¨³ ÆWÈ´Z´ë¯yXÕx¹MÊp†7g b{Q­cëb‹íËÒÈü*;ªå8Ÿ%ñîo¯;Ø[‚–RŠ `Ih‹,÷»A8mIÒTê§ÒQ¹¥)^“p }F‡+mY8i¨…vÚÂ*/‹:Pvea"ÝQxª_ôš„»¾ Þåú®{Ú[}H†½Žu]vn¤²è%÷;ÊüJ¡¨&:žÁ^n~¦V±»¦á—V2Hv,œ¿”ÍbSÅOý/Ÿëb‚Þ¶mWç9°(|ñžb…3ê_Ϋf¶ß­Æ¯T™ZËk‹ó¯‰ësú˜¤¶€=øœêê8t°–%gÔlMƒ ÊhÇòK ¹O÷: ' "G2Þ^…w^õ«ðÈY“0„*A…®¼Æ-È8Fþ01±@Öàà_N[`S÷± MH)´¡Wg yq÷±³+ÚJqwkggê%Õ©5Ëábln[=Žd÷OßÇ/µÆ;õ†Tqîȃ®òÑTîšÀ²÷÷MÌ R¯…¼Èª¼,,qMø:Ñûw<¾ÌÌ8Ž 7iÍøMázƒa†xï@Ô¯r6»‡ BÛWU(|ÚÉlmðc•eögg‚÷ŠªN­NØ*5äGÂÖ æ"$µÈþ`¹Àý$牖Á1m™¬køæ§å;Û ù­##GMÉ \»M˜ìJ»O›´Óß›ïÉ•7°cxé‡_Α ¦\3ÄІMÕŲˆÕ¿c“Åvì¶&`ul‡FÂZ„4¥Þït€ËÄŒ!YZ(¼™1­‰|uJ‡Ì?`‰™çþ9Î`À™5rF|ŠKÁäê­2wÊEõ<.àPĹ:…¹„¡-b]«¯"‘í6i‘4Ûk¿Jê×Ïâsyªj©;1©ª­?™‹©M<íÁs&ð‰(ƦHÍEÇʲ¹5í$P#› cÒQ¡éôÜH½‹Úoì'Kå€}Ò5_lÝXrcƒz¿<ŒøFm=œ8Ð0/éL–{ïXæ¸gÉþŠ}ªž|ye£èºe¢TÇ.8ÿ®ª­Næ2˜=—_qr¯Øÿp¡ÏlÂKœ>õF¼¨ÂðÃÕk“p„…!un"ì²ð[4vû0K(Ä·–j?i:ÉáÅÖœUà YÌ^æ:‘YO ø±4‹Tä Æ\¢šq‚?‹ßÚï93u âÓ í‹¡}äñ#6þïZûR+ `»tU&ûÐnBÁÔÇõ)p`xÿYŽäŒ•!y?S÷pcoöΘO»Úd]¸æ1àA±Cè6±øÅŒO-J{ÝAeü×±’C¬V€¦þz>´ÿÚF]šßï™ýhÙ9¥ŠSX<Ù ¥t¸à¦èOËÜÏg¸¢ÞA–ëÛ»„H¸˜´X±CÆÑÌï£TíØ½nä ¬ò¬8¿áCß'ìiB×—ÓnÞm|-<œ }ð Lÿ Pû!Öq8Ü·ÔG´^¬‰ Ln…/œÖß¹Æ $0„L„¼Í¹“ภn]Í…©}¨/Z¬@µÔ¼`ð[3¿æöÀq8¤½ÑwÂÿÑ2xõ; !…8Z`I4"?%–FE ïøÙ|8èba*NI¹Ì"y}ƃׯ¯åOþÙV>ˆ †ÂY‚Ös>£¸U„a |‘ð$dë-Z€ÑoÆ”ÝÁ¥›~0Ñ’JºSI74[1ÒBŸh¬féüÌôëžâ¿(6åµ_)ÔEv*Ûöº¥á˜üߦo4t±é§s¯¹|/KâÜ ü¶_ÜÛjé,Ä JŽ–}‘ ‘¼^2‰®Âd<÷|cÛ{ÊPl¸»?:CI»»F×Ç$vm³»sB+eŸ}ZÕþm­{ B0É*ë0®NQxö ¾Mj´w—"¥ÆªfƒU±â¢'‹çGˆ£áï­Hí {\2 ƒ5‡¢-\”OZÊ‘|LIü¥ŒÏ½€]Ó$mûšw*îm·}-iʼ…[¨…q… ‘:=«Û¶®©rChÚ¾eÅsAFzXè¬Ù‹ÌÌÉqãˆiEyÆÄ™ÞÿmÝyi>¨ºØ¬”•؈N[ ÑcÇ ÓCÀ1Ë)øyÌPd¶ZÒ—žzìAk^]Äz|RžÒ='¡‘#N>©È@„´×š9æÆ¢é1rwñðk€xA@e·qk–æ®÷ž'n}BqF¬9Ó^œ-Lž|V‰÷°7ªÝx@½OLA²›6Ô1G)évfÌíZÿo£R¯jÙÙ4=¨ãùzŒukHgWPÑ(£†,ÙkY~çQ» ‡£·¥hfËjý,ø±³"ɲI=@½[‰Ä­ióG×&Â.9ìãwÉ•¦µL .ã¶Ëg?Pwœ!*ñ¯¹=û,“ 9¡7œ7ž?s'¦‡µÄØÙ ÓÌÅÃY5Ø ^[ÿæÿOÆåùš`ÅÑû¨,„kÍdÙjÙhÖìrô¨Usà!sJÆÂ ogôæHõâ„aŠhçsÙÌšè»C?Óˆéqò0>ÐwÌ7úKX Pø½# Øè6ÀPãðÈÇØ€ÚP…3¿_Ê©wÁzW-Ù,ñ¦·*´ÆhéôþÆa­bŸ ý#éB|H¦7ùæIÝÜ1fƒfÃi+RM›M©™8n«#Cþê`U ŽŒÑ<²;Ûó`ïñ‰6F²j åAlEiÏÆ¿?t² ¥i5ærFOdDòá}³0ùMú|ÿ’Ûl€ #«†¢XÔ1ê|8Ê#5¹ßõPÀwè;)TOÆ?T±ÉËÃææ%—Bì…º Òq]hf©JÇê㔑\¦V¸Þ‰¤b¨\¡yÂv´ù 9‘gß ’…Ú*E³\ÑjïÖ\…€½£Ñ9³³Iª†{W›©Lq=¿²©e.‰ª‚ÝXÔÏãCMl†ð¿y!Hlšç2-ØAËC­~êûW5ÛößÖd ï¾"³³=çÄDÑm1Ãï½Ç…G×ybê˜[sIp½lKrœsd4‹Ã!©FЖ x¤W—ö;4éhÊU¸é@ö†v­(lŸDá©MùòŽüâzvÑ׆ŸÑœZšÈ‰gQr3]1.ŽõžÕ_Á=m–›«šïzO;¦ˆâˆ ‰³&ൂ8K›Ø ¯¡ 4ù]!IÞ¨åõvïà5ÅåŒè,Ì :•˜—²Ô¨ ábÈãv 52ivQ&&öÆHd0M˜×½S]Õ¿Í®ÿüíÁÎÓpÛ.ïmáðøÔÃúîq­1°ôyŠÍhá¥ý£'„mã­U°ô“å4®n0ÒÚ~ß?hEœ§#!¹Œ°-3™÷*ø"û [e 8Xkò!—÷1U¶xC -Þÿ[Ô# ²üPD5ƒæõžª÷xŒÓI/ÈO|kÚtÉúˆ^»q%èw`¡èHéʦ8¨Öëèê*>šº}ÈÃ’ f3ž¬Þlh®¨[ l¿å)º(<,·?ÃDrÅ(™ï4zÈ‘9£æðÏûWrÕ«e²vÁqîÕeÏ›bšùb»° ØoíÊ= ½é¬²†ÅKÜá¬AÝ„SyRSxbIžòéqóßÅr¬R%ïN ê@?$%‘ÙõRvÌ8 Ìûë3÷s:¬ëñ¯3ÕP)ÄCd(OlÜí»è ffw4‚Šoh?¬Œ(,ÈH¡¿Ç< XAÀídçD›ôÍS¦O “,E°w m̦~Ÿ™*“'ZÉ=;±Ÿp4®¡óð÷}H*=ØÕ²ö‘"å°Œ}9¡Â]-ôôsw«Î8A‹ÓžtñGú)4º<æÍ½(óñNì¢v€m¡Ë%«›–G,FLMòaàp‡¨Û\3Üê…ëÞE‡û/¼Ü,\k’ær°gë_#1b¯ÒO梩нôa \_‘äm6²@¨¢qmJí¡‘6åŠõ£g”+pÞ×Û`Ÿ¹ŒrÀb“D•ÞT¦Ä^æÈµóhòzÍJñJ„lõxGydœKМºˆà¹S0~é¿æÁ{Îïp˜@ßs´ÎEÔÂX<ô³WÃ=æ|Œþþ6~‰u‘ïàˆ™ôfÓBçPƒÊÔyYPÀ&P[¨ÍæHþÃ3¼XB«íÃÏÍ;'çÖêÃÕOç¹ÉdâŠàÿÉj€,Zƒ'ü,½Û¥eþ—þŒ­Bê™ÿ{ÍV6*ÿ7C*,Y˜‹ ôXÃpr\÷×ødt|Þú–ˆÿm,Ü´RóIùºÉø&_ö[Í.S£/×Óðã(³EègiþqÔú”Cz:B‡"…ðÙ ÔhF)Bºic%ç”=D™* êŠÏœ¥ñ²Rq˜TGaÖG›8B©Î÷t”7õpU±œ_Ö™?W7èU[ï5`ÆüIŽè‹c'ì@ï|«¿kz™ÑJxŸoT1ºGͤ”â•BíÛ´¢P¬¯¹€+j=â«§–‚Á±u-Òæqí^Et¿ùgjP7S¶Pue4qòž¿sB«2„éêÆñB2ó,;fAg8ëZÃ=²ú:tæIS+K§©­Qà'è7íh©¥ä ¢61H…®ÀÞ+±Ìð§\¾øu؆­U¨s¸ÓüºiÚ hwŒü_Áz…ºÍÏÉ h-QADÏG8!ckaÌÕrW^jgÚøÄBä&€Aøà3˜©îc³Rƒ›üMG †ËwT‘ÚåþâÎû!ô¹‡Io¸ù“ãÌêœðdB@80àg8 »óäic®ÍÏi;êÌwµYÎ-Á!¾gùÄ9÷†KϘ;ŠœÁò$«†$HþE¤)“s| '\b|ÖkuÌ“p­IY'w݆ƒ¬ÇÌ–l««F¢ªeØý£æmÅÇ^ÎÍ Ÿû»v&>kbêѸÓf*#¢€yËG«¤‡™óÛ ~Fqu²Ä4Q>™}ž –amb=[G»7~K á—ØšîåPYÆ),Rà Ø’þg` ú(]É"cÜdw‰ÔÔ ÿµ< ä¦i´¹cÕòúoü;(ª½m—ª/’ê?øíç«&Lë 0ô=„8Úp;hÒaY(ä÷–‡°;­Ÿ4G­Ó ¾oý>BË¢6MÑÙ¨é5|­™žˆ1;&*B2Å’hižñQr“&ºL´~%æÛ“p‡[¥«MÕ²aù×EhB,qO0¶– WWÆo}.j\ýmò'ö#“µ2X;IUŒŒa$òô(yA3à“Ôþ €_²ñ‹í5Ñ,£!·›iäoãG°}#Hf­~¥,PôÀV%—­}``¾#9Ã$ñTÂíöLz@èAžuB¸Ê>.÷«¯. }@~]ðXüÚËhR&Öµ"Ô¦ªÈ¸w‰8jGEåô‡_b^›¾Ð[TÐN¶¦Ø5.~NGû~ô2À€ ž÷ïR ƒú:ƒ›·rØò¡—èü×íú¶[r4§áÀÎ×\1 ¥‡¢`Â!‡D°•¯EšÓj tÄ©\ŒÍN +‹ŽÄòÖù(hëQí7~;ê$ ; (šæ£ïP3šÃ·ð`P·p\& ”-þ;LrŠ!@ùá7®^Go¦rEü’ñßÒŠÍâí´——f†deŠgI™¦"‡÷L‹ÍðÃÂÎ5ë·1{ß!U5©yjzçÑ¢sÝ__Åøxc¨™<–Ì,Àþ5Di€e eM[äú¦ !&°†‹­mðy=) àAgq‰;¸F/Ñl_7ÿF“{ eˆÒqR—Ð毹 ²Ž=dÞsïĦÝçFj=´üª€ß+Úý0 r0‚«ÎϾØá˜­ÊCþt.¨ÑºŒëäD”•9Ž]ä2¸!Ž¥4 …DU‚스Ic¡<iôh¿ÁÓ×]DX8>&‚—ï®ÑÐ+‘®“=ìèÜ37Ü™×­Ĺ™£­^‰SÇ‚ ¾BTp²¶Ö#dgP3'ÿs—–w‘‹4ÛëÁÛ™Re†»n˜‰Ý  "Æ/ÊXòÔ×8§K¢N/¨)¸ܳh‰¤Ê·swÞ°Ä-®’1ÎxÚ«ÛwîÏ¥¡¢oõei¯Ä%mKM j»û,zÂ(ê¿0lÞû§uµãDj •ÄÌüô¥>eÿðíV[E­3%¯àù…i‰x4Àa”lt^ÖaŠ`_n;;I¦ó&_;±üø¢_H€Üw¼æ½´Œwƒ½ÁÎgŽB:Þþš°M@ }°bÚ $¬WûÎ+#,oÕSŠÅ®yƒA+È #ëqäÜ;”o¿Ä¹ŒBP¿WÌUÙ)µ\5J?S)ókÌ œ"çúPuÌ}Uyÿ¯ŸœcÆßíè S‡~ÛI?rÖPüßÈä$yF¼Ø²DÖ<Öê4ÚC@ Z+éð·Äêg%Z¯j/I˜$A–,£ ÌÞox”RÒ¸a—Ùí]¼»B±6ŽK„8Å´fyÓS oˆ âxT$Ûå#Û{A¥†xxäx¸Y``{ÑÁ)èRIÊR Ú¤yÏüÚ.FÝåïkí–„1ó(—5ú(‘Á< 4Y_C¿¦A+jÏ¡‡­KA£S…«fhω šCY®Zƒ:“.\Zpä˜ÄÌV½ ñNñC€õugׯ"‘p3´K”©¶öñù$ç‘]^/Vó ¶ ü À²ÚŒÅx\o²9«°‘·qŠ›¡mZ32‰è4|µarÿoá©÷ïM]hâ:š;ŸcÂZâ±u„‰¯º¾#ܶ³}ÅsÒÀªõD¬É¶œwu$KÛwµ'üfÐ&7Ï.œYj«kë#)Z :© ÃÃèñ|ë´Jר¿¨‰kÚO„Ü¢£µðÑQØöff¼q/1¯ïà3Q<è.†9´\Ò5òLÛ||5vœé‰þÍâõÈ5Êš=ˆ›öÚ£ÛZŠÄïô‚f3;[•BB§Õ£iÏé7Ó¯O,dYü*ª8qê‚|[tÇ %ŸÔÜ]è)pQœC?1ÑÐ]¹»Éî€Ñ·—,÷n%ß>8'…PIiÌ ¸Þô?_Egk Þšw\µ¤a=8úXou<ÊhKó=)‘ù Ïà—ùv–Ê,YÌ ¦ØŸG±ïv^ÜMZ {Ý3ØèÙ|š„‰ÑhD6HЧâõwº$ñÑàÓšÎ-ËVU»$»ho`[qFf»Gøã)ê'ùCו£qÒÐOk=¼JaÔ§¦·H¦ ]5†ÿ1¬?·wM¬šgAîˆy‡ÒQb^åçxSöÅÒö!ÂgWþd…äÐP/„ÁH%Ù¾ÚÕZ5Æ@Ù™•CÏ Fqe媎PišXš†+ÖV¢*PëoG\yôXRg=º ¨a ÿ¤_úfŒ].›–h²–mͬõñ‰Ø5À)õ…Hõ®u§ºSÊ—³šR‡ÊG Ûër>mh¿Êt_Ï}êv°þa@bè€äž)—«%!ÉM%œÿ¬6°òÂá^"ªaQéÔsÓk–vEo|žu1ý/O0}mT7£ÜâÊZÁ—x³|W"¯çŽ%ÂÁÀdaÁPˆÉSoÉyQq›CQ´y<Êi8Ëu¿tl$zŸH5K Kß²Öß>0R5[»½Ú2!S¨ …ðû^ÖWcw‘¤§áÁ²<àø¯¡ì®v£û³æ·¢½¢â%+.CD÷¶&«Ë87¢¼7ã<>%Æ8R¸Aç"÷ìö#ˆÖ<Í,“÷¢Îñ §¯Ó32/IèzÞð\{ãDç<ñ,³ˆ»oœÙq>½!Y‰ÎêtsÀ@÷œÀ‡bŸâ²»²Å;KÐ9Â+b ÁÃŒ¯ôÆ*)¯8Æ[g0½·Õ¦§&k}F:“Z Ó8쌸çßkÐûKÞ«ÐßíZ€Í®d[»Å“Yë ×™Ìµ8‡S :Äç–Ý©ªólÀ¦ÐÂöçaͱììItµ 8i}õk×÷ñw'qOãõíëΓžp¤7fÐéž­þáR¢þ¬ ½ ßêÒŽ47u>ÕŽ4_ÀÖôã•ftÔ$lF ¥Ó¿/Stêêáßv¥’Ä•{¹ÄÔ%sˆÞ–Yi³ ÞÒŶG¶lÀ¼öoï5: £¢ä {yd8Ö¥D9™eéÁÄLRBh°"Ž "vÁ5Y~Wì=œMƒ(Ê‘OTSkcÈ“%Ö²m«J[¸& $1ѵ\‘@e7Å2:Ý.<ÝÜžœàg&&¿ÜµN%yRQîtP­êî ”BÕpÔkSæ“Ã~ ÆJÚ(05éy ª´¢?m‹NªZÓ¶´3Aö¢ND±`qW@‹U(ƒËúÿÐ;LæŠËãö³>)˜{RXÁ÷߸}¸—5ðZç–oñò¶Tjò¥i6‡¶Ü{Ô5Ú °®| :3Y)5À¿½¾+‡xäëî5Óë\Ç£÷Å·t:曦¹È”‘Ñ!a| ËúRé2tæ»ÈÀé’J,½×’/47V7G¹7uúT”WÍË*™C­@;ø¯ë î4~è2Æ¡z:SíÕõS èÖr==ªÎ¶ø½µ·Š[ z˜<6P¾¨‚¯sLã/ûåO¼¿¢Âp]eýJ:74ñˆŠ{ sŒ>ã¡/΋r!Ã$Ó$­WqcçªÒÈQp}cßø@:¢r !ŽúÊx’Cývq˜`79I• ~÷(@Ì0‰ûù¨kæå¨‚DJ=z0*ïý:©F:hÇ’!ãeþÛ›æ^À£¬W"ò¼Å«Èc3•YdP–¶yŸ(kîD=Í„¨F³] |HÝËá#Ý-Ö¤€ ?˜½Kâž]†9ë59j:˜)e]gÿ9½>òú» Ô9<§ýâ†M¥Ò úox<ÊDòt6ÃBƒÒBï9R¸pxcöÞ.<”¬úŸÆ¯| ¾-'ºêÒLtŽÇï"¯$ñ÷¿ ¡úÍû\Ž ›:žS~Ny{¼8¹îްåÊ÷œ„è—¤²Æ£ò$8Ù°CÙ‚öåÇ<°éVéÚf×»Só‹Ä=Ò–-e‰ªGº> Ö»ŽW|øöø:ª£Yz‹W»Íî²":¢ë6¼„Ç¿Só·ÙÂ!þvb•ÐNÄTÙ `uUv¼»ûùVbf¨Ð3“tÃ|ÛåúqûC~U’Ýg”RáÑg£¼\'=ánd\9ä£mz§ôè8šÛø‘°9a”ïÜ[w©ÐšùÁ¤êå,‡ –ýÿ†™ëéïÓ÷†§ÔZ¯3¹4Íý…Ä•ò œbŽåO©ð,æ1ÝÆ’ÃÅm/ð 'zÑóŠcÔÇ © ­u9 …=cÐàgŒ5#i¼Œ˜\‚)ÉŒæ¿áÄpF^&Çzz«]jª›” y~b~.}³ŸÒç¬oë‘z¹–‘iI 6 å¸]‹ÌYWLhŸ.€"bí&¡<¥™§M©D‘ÅrrFÓúE§–O!$Tá£'8X,Ôõ‰žÖ÷o'ÌWF¨lÚÚ—á»e$¯ó¨ð¸åø‡·™ÜùùHYìN_ö:ð”¯qn±>ÇÜûyn<ä´Í¡ÝlÞGœäîͲZ¶Ÿ½ô6ï$n‹Ñ ?Î¥û!=ø n×––m§R/1­öÀŒ^ØöWOH+oþ¿4¢¡WV‚¼ã¤l¡h°ôe€U»º.œ)¤ßBvO•Îéd\n ÿ3Ë¿46÷¤ú´²¥_ñÜìT1©–pà2HËÊícDWÐïÆVTr£V±—u¿QVÝø^hâª1¡X¦Zš¤HœÅoÚx«…Ã\B±uA€WrDÅ4HÖ"åQ„™ÔnÞ’FF ÜݵÉHy+qñ…LBYF>ƒš-çJ§ýNÞ“)Ùñî‹åF:ø IC¿wÏh°óÊ%qÔ½Á›˜‰¯öì€u€Vù4m´P7;Ÿ2jŽÍ•°ˆzL¸ÅJ9Œ 7(œglØÕ(ÇT7»-¥È<Í©Eˆ½x^O€‡ýáòw¯¼>ÐÅh 'ÜH4F¨(Lɲ9ØÑÂÙ Ï› šxã\ ¯¡°ªås  g±BuxìÞÑÝsèT¬åû>H1“F~øXV‚)XÄâž~í@N”4˜©ZG žº·¾_²#8¨3ùu”Å9®i‰MI Œ©PÙ7¿G—ª«~j ‡Fz-)h1BØKñÆ©[:Ã"PƒLÄFí DeHª¡d°ˆHé÷¯M¤,gSˆê‚˃hë!<ª'Äts-t òG’öQñâ>ü¬qž.œ–޵¬ n.½ÎͶÙ7rê² |]¸(¨‘òq·†µuíHCI9 ²z:v}€’·X\Œó/_ß+x¢¸à\L%Ùp`*ÊC1üi-ÅÇ÷ÀüViÝ‹ zN²"ߪuç’cÑ®„ª‹W;r/ºö×÷—®@£åÁ­ö0i¼§1@ßò°nJÈ/Ñ 'úw^‘3dÚ0 ÷Í÷HÏλqÌBQg•ô(œJcŽ˜Y'¹qGi\MþÑ+ù3òor)Ë©ò I?´š†)‘攊'LœYTªk§RÔ´ l•>’Ù6ŸšÐÚPUR4 ¬ªEÔ6m5a;Ó(cí¡cOüØâò0—!Œ$IR ˜f”¸‚y±x’T”Ñš~Çpª¿¹Væ¯Ê|riŠë£v_=ž5"ð+ 7žˆ—å—KAj‚ x ß¹ü‰:Ò¯í'/ˆ6å5j‹ÊID™]»•t¿¥¹ãF@›œOv‹YöTéÖóÕ xñõÀÚnª‘#ói³4@¼¾ñïÙÕmØ*µPáð1±ŒvGp(yþL}a$=Vˆ²—›òPËYK+’ë•}½=AÀšÉ»ÃöéiN™Š –Axqã]›6|‘£ù¦8½àxE§´G_vŒ$¼«+«7]§y‰@"Оübx‚‰Ùç+t÷Å/*³‰KÝ$NÇ›ßyé¿PÏö¥Ànhý‰K±Ë~Q;3óDÜ8ïŽöã’hc_fÏpÕïN¾]O6C3xRR7lç<Éæø;ïöÑŪ춄Œ¥ –Xàiöƒ¬ó )„E€q sqj69+²üIê á—k Š4Kfà̽΄{-;b ÿïÒüëvÑvovó…_,-çÏôÝFd°"bÊ'”rÂü‚¨ðµ¤ÚàMB“ú~×c›=Êê$¢a¾ ÇV lRæÈP,fÔ‰n°Ø–N Þu(0HÝ $6Ù‰¤Ÿñk3t zI¸ !g€|ö•ùUÀºmjçüshˆ\gK‹ó 1‡w¦ ÕBövm¾`§K,.|¼ånæÐÒiýõvZ¤{Æ?\¹>2"Míþ¢æhó‡ZäÅ&“9ŽøkÕ†~´—ý…ÄÿJJ:­õBVTKÍxµ4¿Ä&-0¿i”W¯hɶ»0 uw!/e½ïÿv8½2¯a¼ú~#$ÖŠµòäZ—aI(öÅd½ÛkQ ¿HïŸöÚªÿ.7š,΀샚.Û‘‚ ®@ý6Û è«ÎVC ÷Ý­–¥ÇØrøÕ†ðíhP2.FpÎ-Ëh¯ÏaûJý§‚ÞœÙvü)´ÎºÝðswM›Šéò7L÷† Ëø¡k@Qí½£bÎѾýRAˆ'ÈÖ². X_&§ÄDpv® ˜§jìë„T•Ÿ0¿ZKï•ÖT“’®9Ùsˆµ«a*ÖG*kbQ4á{T ÀÕÁ#žÌ®\uÉ÷ìýÝöc ÐRØtæ«y/±Ï_7¾4¡LúöB‘tÃÅïVÉ!ç¼£‡1µ-h¹áa½­½¦-tËíŸÇUXÍIp‡ŽISgEÃÝÀæ»Lèx²ß6MÍÅýëá`M È6°qJ.£»V™að{Í® ZDõx®mk]ÇÍÓÌ7}ò’A‰´¶FÈ )W Z{›UóŽ;Óýà!´/¡‡Q¶$Õ”•`JR Þ'þ»÷hž êXA ï·ÉúRÓQW1¡½aÔ¿^‚„"ø’ÿe÷1”Œ¤å¤n„H{äãùÚÆ‰ñ·z+[h‘O·dÌXvÒ¤,þGðE÷.^D;I!ÐÖ3#ÇH˜Ob/ö<ˆo@LgþÉ Y€„ø[Hf¥Çž˜|]¾TX¢ ûÎ ¦ì·C?u-àOº5pBú—“¼˜çŽW:á@ºåàDß²›örF³£åüƒíüI©bÞ G IÄÎÈ7©Ò1Ž50+ß‚‹XüèÕñELÏ’¾\¢³¤å…ÖÈ;ò€ÇD*O”%„¼¯L,µÂõap{ðS^º‡Ç[Ú §âÔžÌTUžæBN&ðÿŽ-=+?¬9{DiñÒ™¡›z(Ä×ñFðÊN)¹m'[TÁkïI„bǺ,)uý¥³à‚îÕŠÏh ² /"ziù‚æD(_Ñúó  ÈŽ5¾ÂEÒI¯¼öÊÕRB;ê*°póû›>à*Íáÿ¦Ñžò}üÕm"~§eæcIÉY«Ü0gÌ—§—ÅUýÅ›žMã°h˜Ép`›k¡ZeîâÞìç+ï±âÇ¢¾+?ñ›,Êä“}¤µ“¦¾ ó’PCæwÔK_÷´/sëeÀS;)Kg[×ÕÌj{¶¤ðCýøy@ø¨Í6kü‚sÍçrì×6sq(>å¼&ÍmFÎfVaáli'ʰƒ9B6}刻ô4ôÝg˜ŠÑÀÕÃÒM¨¨3eää99YCN̻̘iš‹PéÃ-=7UøQæÌôÄæW]N§ra¹‡ÈüŒöp5Ò×`A÷ +/ÜÍ'©?¾îßThP1í.– ,Ï+]°„ %T±r:p‡n(áO"tÊ^O88·u‰ à f[†ÌOhg¼‹[‘iÆØñ³ Ë‘N@Æ¥¬[hUŸŒZÈuÙ;¤b¹ÔI½;Fö[#ú0DþZo-ñçq9%5v«¨ W³1^‚ÎBÛ³¾úbä¡”µõËþ‘];]À´Û'»ðT4õ¤9WˆtꦜβåˆÚNÃ÷Íö»¬I@ˆða\ J…ˆ¥ôëéÖ€ÞÃOÈSûÈ^ ãÙݨeIþ9kç;)xªŠL€º”xŽÐ=HÈŒž|«†}³ƒ~ýA&zýô€‰DPnÓ…)WˆÏ¼½‰©ØAhøä›ÓF‡O²¬pûŽ ‘@“Å‚çÈ_^¶$:”ø%;½è÷\i1#¼ Ñs¸èƒœÜ\Ñ€û¿¯ÿp.Ÿ`w#|ø¾—7–½Q€ô·šA½ë7ûËâ8ñ¸oEØò[9ý}ÔÞˆO–Y¢z£ò\àfØØOÀ™2¸²Ó¼‰”­º3÷ª‡­Á4SÆt诜ö3¬Ç0^¨C”›ž[íjì®âb• Ü& åUÑ[Y<)Vm31²mÙ4iÆ‚@›èÓ{É4$á÷ÜÜ•îÍW•;½(—O$ŸÉŠs£„& h¦›8(†©« ¶!^F3øshe÷Nex¹ÈPÀåÅZ-Xñ-t˜Šñ$Ìl~!5 É@öøËLÜ©©Ý+V©g ŽÃzÒð¿ºz·ßèz×¥¯KnwâÈù š—×ìXý-zÛ—Ëjµš´åšDˆ|¿w^ 4Š/ùFé×ú°¡=t“zê˜` õ ÛñM Xé%¿ï1vóìPNuû†ŒÄaF8œ#ÛþƒV(16ô¢£¯,y—0+³åE|2•¬Ðm iÖÝ+ûîA×É&³ÔÁËTŽÉSz_µÃ™ý Ùì9.euª*x¿¹‡×1°€H˜ñH­ðr³ç™2üŠÛ6;²±V'ÓÛ² éOé ,ö…×–5ÞªU%MPpIòŽôÓÊzå ¾¯^þò\„„£J9úŒé/B¾¸1X¿&ëDæ!>[1Ç[/IÓÔD…W'æ‘¥¾böY2 ÿš"¥(‚`§…a‘¤Væ‘]4D•è#ðgG2;ˆŠaìüïgl_I Ö¶€¤'—/+‡©Œ$o´Hû?똇¡õ3!Îd{;œÐw£&žmžH0_;.„5§Â9E ú½^ÈÍù滋W;ˆàÇÊ_Y 8“ŸÞgVáëGWP(íM'§ K‚Ooï'üÅvPf®®s€{âí. ÔÁ£7™<šbÇ`¥†Ð8è†áâ(CÊŸ4„]÷ì0rnšÔ¨@ñãSsÕÏßmlÍ´8»÷ðíèmÃA ‰œÆ7LW?Ï*özGSq‚‚ÙªñòXø= ášGâL,Ju¢û&ž³çÝõž}•ÚÙ¥Ó[}¨'dÝ»7sË n;/ÜÀU;&y\4‹l ¿êçÊ{tÙWدOOºô1TÁ:O¸Å*úõ÷ügW…ù”æk£è­å—18öúÄ@ÁêÙÿy±sÆ—ÿ}’fäQÚ/д8Ìç¿Á¡#?¸µØØáˆF¶@œ³£ÓùÜþô±8ø‡XáMNÉ]½Ÿü@>oyV‰ÈÒK±yy2j½<×ý)…ú• s šá¸iYälG xÓA±Y@YŠ$†4ò¿ ìè‹ÃgGÝØ’®9Ä–5(بdžboÍÉU8UÛÃKWöјƒÁ‰þE/Êø˜ ˜Ö!ó+œw”Ýȳ/óø¾i4°<æz7µ´áü3ö%¨˜;•Á…:MOIBV-¹ ÿ­JÙZ—}è9hq#1{u|ç^ÍÈ(v mw—Õ‡¾8–ƒt¬Î?Wgh¥ÜìxéˆÅ1gÚ>7—©¨ÀYhȈ‹*Uï 2Öoat¶ÒM b¼I% æÙµ7±Q`Å‘€žçU@ÓËø3ø£©A.b!ÙæVÒ ƒ˜ ™ä•~Z6dïgnªõú0#Ål•T~Q•ƒX´6ÜL¥Bß9ЏäÐ_ÒÒKÀ‘ÝÙôùc¢‘؇kZ«„e[79‚²ˆñ¡/gIs®ãœ~Œ¨” °©¨¡ÞY[ñ-ê‚_*£eͨ]|-è˜_d JŠáùÏ(|é1Сt-À†˜W)&!ž eP—ÉÓUnž2Ò;Ðp»¾\Q,†MË‹Ùè¯FÿLýéØn4ÞÎÝ™è§Eç(…4†ü뤙TŒS\úûBÒßL‘¿{·†åwÇPŒùž ˆÙ°põ¥ #ÍvÉßù`ð§~èÌ”û\Û‡ø§B ª@Ðnö Y]ÖmÔ6¤â½`a!ä#à{ç<ÜÛx)J-Áw‡Ä)k+±tÕ]’UìDÏ… hÚu¾W~È qXvq-òœ¿¸€¾— °Ÿ€ÃîWàÓ§BÊ8sˆ>³ðoú“àG;ß'˜×}k:–,ùô-´¯åÀSòÀYVI¦Fò*’zNû©æÓ ,wb¬r¼h'Ô‘qñõ|5Oî^’éj0k„„»=Ÿç¢Yй–’” 5íü zÒ /ãdíõJ%]CKC/Æxc™rföHbÙ*ó<ÉÎ_ë#Fª‘o[0hìQÖ¼åÕWñòáLÆ<¥Í=ð•Ôæ+ò€ríc ñEŠ5ÛWƒ¶Im£˜Ÿ¹n]((TÅâ@:É®”ZöÓ'' ¸eï÷g‰Eg¸÷åЄ‡@tBèq»Ö2ì÷g>>ÐU»4¦}pžê ÒOeÌÁ tã™FµÊÒŠHÞo7xzwHŒbaO_Ã4• f¶å®?ºÕص¬dø²a»ðoÆw¢ŽµLŠ¡6¯?ã‡âNkt$ÐweLJ¼„˜¾mzµJi vˆ%íc¬$æ.@Õ̲­¢g[0‰Xð“lquö»:\»†Sm^ô>ºÙv“$ÚˆÄè5"=—o¾[£‘aöó§ºÂá>§5™Í0ÍCðU%ð£gèà–=·LBž¾"ÀªÂqz¯CzxLϦ‹âì¼Ùb±»ìŒ­9Í·11Ó#c5L¹»®!°'ƒ qÑ׸Bã]Z@ ®ãvÆ9£µÒ­Q·_¨deÞ@±?Þ4 “G›‡°ã²½ó>•ie«ÍxkÏrÚ€ƒúy‡7S´f B?PB6¹\I9õÕ ³Ø¯—!åóµí-þGÙ½ 0ôé#OÒC”‰{UGf¿ïãËE3ãÐÖVûâÁp¸#“Àó»Î“gÉÕsZø1tPÇô±cΕòo/}²\ØŽé°ÛñÿÚñmTê9„ý>ÚóhM"˜íEÈHjõB0ó1üû2 (Õ¡¡}ÕY58”l†i³Fôi?­¬f?ÆÆà‘ôá×IÒj£pb×ÙA+!E¹è)ƒ:æx\p¦„)2‡î²(j'Ü}{š÷_Ôã-ªFAïú*y M ïùXô‰ ¥Få¡õ3¬á›"ÉÁK‰rr#st½¤"?ÑŠ}N& ãÒFÖú /ŽM,lDæÔ鼎ÔVœØî0Ž­—¶V¬›•QÍÄr¦B©ÚºÂŵv˜Öн ¿µ#y×,ô)óN§Z±{¢³éâXL.ê‹Ü£"ðÐ2‘Îÿð„;× Cô•Q¹± ¢Jü y¨{oI>÷>i Jp]ÈÍåâ`.Æé‘h5zin¥¤YE¢BÌ…¿^{f]¸'lH>‡ššYäükp­Ùi ¼>°Ý« ºu®ˆ ¶¸úƒcX6"–¦;’Šþ)}CJ3½ í‰ Ê×-¿§ë_0± wïG¦ì0žÑ‘Aoy2•UˆÀSß0|–·VHU¬À$…”)ÜøÝû?zÞÖ\›j—¿ZVúåA¾šÌjª°5oX öoº²âCœØ`̲ ÕßéöTÅ9ÓI™¤;«õ?Šâ˜ñ °s·—ªPàéø“7ÊÄÛ°þ((>mM¸úè J™…%öGç:ŹºÉ‡Õ©#5A!KðÜÎlRKÁÅjí´÷o€®¸á@‚Ò*¶ Ùó8¯b( ž}ú„8ò¬ÀfÒÌØ…0b¥ G¶º±fô v9ÞŒ©…€‹`Ç’^ë“Tì,·§§_îQ§Ëèì6ßÍ‹Å.Ÿ¦H:_HÁ2²ÄD°ŒŠ€±‘f cl+Sþ'â´qXR¦ð5Á9ùï£:»¢U Œëœ T=Eúˆ4y—Ð/Õ/Ä ;ý=CÏ¡Ì[@‚­µ^¾Tî•ݯŽ_öüÉŒ36¢’ úË[HÁ"Ö£3˜—š­K¬°;Ë w%%øæŽ¿K–+¸[¨åI~. ƒNHbë§®û©¨™q+ÖöU;³Xs‹*œÝAYÚ’°³äžB&bz`6«îÕlr³ ál³0Wèû ~ ¿‚ûOíCc%Äc¼“‰mÛ˜“‰mÛ|Ñ‹mÛ¶‰mÛ¶=Áþ¿Ã^ö°}¯>ôµ«êgÕÌ žÚû.Un¤” †âÆíû-èI.n’x`¬jh76¿($ž¸ÐUŒ[{!'ª¿ÄÚA²ýõÞ1EJ¿~¬6Ķ44eS)ÛVÎMØb§ÌO)Ýd{£û‰¤~Q±ö€;PÔl9§Rvü‘´¢éÐe=u?âŒ]¿1 ≔z?H8ãðE8ƶ]¿€uT~Š9%æ³t@½G*‡*:÷ãŽý 룬õ5S;¶VùéÏÞêÓ´ëá€!%ôàAãç!Ñoj¬VdH¡W€3î0êçs>« WÇfçÈc*TK ž´AÒÛ^uþýÍ'†æêkeÌ­é?‘Ó³ƾk{`=™¶ù;˜jŸ¤Tã®QßaŸNŸ¬MùJ g‹û¦”²÷‰D`ÈÄ(Û„V<­ †²Éùß²´TŸø*ظk7¶9¶öØ"'^ã¥ms‡$ïOŸüý¬¿v&’Œ» ÷‘ @wâH,T9¾~µx¥ô!^ߣ¶˜G=‰úl†©pªù¸]?”±K»þg9ÌVÿG7>&ã©Ñ€n¶4È–l6HÌÁÁ‘H©$çy軓œ‚Ú 1Ðü,V~cE \s?;à &@Ò2C5¬Tj2MU9= {Ó]V¯£­Þ¯ ÈÜ*À,åœöM6±Ì¦áM)5Ô—ô³V!Ÿ"j¥¡»_Ù±à2×ZóÝ|· xܧ•…g¦ÉDœÉœ4÷³“³Š¹z”^3cïË©‹'ýu¾e<ú¢€ª=4ßÃäiÔ6)¹1ðýÈ€9·ò´³ÈF(øÄ¬ÂxJ’÷w¡d¦?‹™ü“>ý!±q639t bÒ MÅ—œg_wnߌ½í5³˜ÂøPß·Ü›Ôïl]H[‰jÏõ(&Ë-Wia»,tð cs*ÓnU˜sšMnÜ‘›°Y汜–ùl°†HEÚ¼£ï×¾†³Ã¢G|¦“¦9ñ%Ž=b1ï«s¡IJ¼ÇÞ{q¨û K“º4ëߎÅrŒ¤"HFSÞ£E»‰Ä.¬×ò³ï|ŒNG‡Çt∪^Ÿ€À¡_}_9~à ?“ˆ]'|§±+‡k…ø~ÖÜsd?zE'!hG§ø Ù0Äuq aîX{] ø{®bñ‰ Fäa%á\µì©"YzWaB,G;C†…™XG—Ýé?ÎQ 'Yk.6ÉJ·©»9—þN/½wÝßž°ø:3Q1ÐYºÄˆüJ }3ôTñ›z\ÂY©FÖvH6Ñl@öÛM ¤|’›ºÊÇê!CyÛ±üK]fFuŠ4„œ‹.˜oÒ3ð ,±.œØ9›p‚¤`zË;„óä±¥v°ü‚T«])D£ Y‹0™lC»DüPKZ÷—²V®Çª’('ã|Fr©"© @÷À(]̺ZŒ… Ï(9EáJ-I¯eW>“P,j^¤âê´ ‡r$§žÍ¼½ …xÂ÷‹j²«Ë‡[¬®‡žjû%:]î…YFÃW)]¾Là`p~ÊÐ84÷ŠlEEnnt‚žýŸ :Í\)ú„×É`.Mè€+¬c>ªÛ€Ê¯"§†ää Q¿|Îy›ÀuÀ yý™!‘_ûŠbYØŸ¿fý*(®gekež¿¦ó¤ªI*šÑJ˜¯½mëz†­±1P§Ðƒ\gàðP׎¶g» Ý1éj,5Ö¾ââf¾Ÿ-i±÷k¾«{j—ñK(ÍÛ†k]ïG‡Q±“IØ®e5¥’˜çƒlë…˜¤©%IÖ„JUŒ±)Q× æ~Èœ0&.ºƒ RþÒ}ŧ³Æ®ä]ê¹~•dü̫ðNÞH¯Úe”íá&r¸®}‘Óí u‘e™~;ÈêVªñ"¥g†¼<šjEìR‡îÁ,ÛJ ŽdˆïZƒŠz’ÎTõ’¼UË[d&´f¯–}±g‡&µ)¯R½TB ìÅ]ö‡ü¨7Ã.Ò[„'‡’çF¹àЇøÖŠH×®tΤm'ŠUXØl×4G}G©V„Eî“Kßi¿…yqp$»ÛÓz:À4FóFÝ9C\¾pÈÓ hQ㟶™w°¸‘V³Q¢aíçD}ú0úÍ·IŸ>™çœ™’¼&Â/³S Ƽ—§×z…E®£âJBŽòÜ/|U ›¾›©,G:ÎÚF—¢¹+"èœe•÷{úê ‰¯ÆãŠP÷/ø:«œÈËùöÈ%ûð¦7ß•|G‰:ÄV°²Þ¼$¯ÍÈv8ÉHƒF·¦?©p\B½ÙZç_8ú`4]D÷‡Dðk0dnw9€¶g)é˜û·miLI)ËzŽ·–m®iç‰>¬C ;8cê`#lú¼‡iýÙÂÛ6gk®'Êy¤æG~ò€i™Úž»_^WgGñ+2D>×7W®þ¶…õ¢™2E8W‰¾±Æ4ï.9$OÒö4S{ÚN^8•C;ê¶hþ{žÏæëéR|R3“3Ès¨2;­_­pø‰‚fÁ÷÷ˆçZ·'›5?ªO ¶îap?`¾SÂŽÿ£uÿÀ5oKúk$ï ¿^¯ëþäÍ5©"Ù0Æò’FkZ3½;îÅ[‰›ôñ‡†Î*ÖJ|4m݆é„Ó]¥Î‘‘ŽkSâ)øJÞö‘kד ¥\Þ£Un’bÍ¥huÙY6 (ãZ¬ïÏ‚Î÷œÜèÙ‚~ Y»b[û¹:a~¾{cÈÚUôŸjº–â¬l¦ó^p7ü@»C ëžg”£–—Á1CUaz9Å¥–1_É—î´ßìN¤ã«­v÷ز§z%F˜iÑq ÷ FÅêEã“þ2÷4¨ø¨KÍ塩ǘmf³ˆ¢ ©ý­£eŠXa®ï…î*ãoxUÑ‘ù+ã >䃷d)ëš¡ùgÜiV¿‰‰A»Ù q´ ýÅŠc*í,À¾©háí(å¿J–¸&G#føWBS[åpE0€0 kÓ˜­ëu5zQÂÓ£,&¸Í‰+6KYBÇ­‚£xŽc æ¯ìïÐîÚ˜lCI|ª¬Lÿü9ó`,4¼-8R4ù¬u÷ èlQY+¤Å#PÕg“Ê|ì˜b§{Ô–Ÿ'Äó8Äsúi½§¡h½4#pÔëj²yº®ýõìŽ`Ú$Ç0"ç9<>úÚ>|(M U¨âîjÖô´˜r¯¿ÿÇ"T|g’÷BW Á}Æ„ÆÆ|MGá_HûNwí*™\Á˜yÓNqwqwÛ† ³HlUÚ?=ûî‰Äóc· Ç2rÉK°EÒ èh%ôtÓX¦¾: @fú¤Ä~ðÒfPêu„<—°i:gG¡ÝNýíï8tÀìç©ÝjL#ã°ìõúÁ#¸QKTܰ­ /Ñ,7£”9K^pˆFb·¬75é,“9¼ˆ üèÅ}æ*Uu–„96¯}(J{ä’ЧÐþÂyíÉð4tðŒv¸·Ct®ÊêÆ¥÷Í6ðúKo ™Ó®î^\‡ ñÏÙ! šX~Óá0pÙ='yǺ³œ›MÞÆÝ½px¼VÑ“¤}ô ¯_ÛÈü¡—)ÑtkÜ`h[òeBåöü |ôkÚ_]øG2ÍÇh¯]DC›òGÌÿG¡9@/M–AV“'D‹ÒǾÒìv×O,œZ½[4Hñ£ÐŽ®gˆ»Mª5{úÑ ‹vÏ–+e/¤¸ö¼ìØ+3à |êXG4¦EÛri¡ùäõòÇ* † ”<øk“øœ±7й|R•7”­÷óÁÓý'P>˜f /¢²J§¥]~ É ßÝ”7#Ïx[õ:?¡W9ã'ýõ&'ÎÀ›cGZׂD6S÷ùе¶2õÒ³z%á¸Çœ¸"fzè‚ï]Óf^«IW,™Q…iVz$BþB“ñL*ÄºŠŽ& {.² Åe†Œí9(;0Ëé<5¥è˜ÔiêØü XܦX;WHXTÿ }ÑÓ«™[axˆ›è«îúÝ@ÂXà‹µ'5‰•8)Ò‹HÇÙF³Í¦/š4Éš.xÏ`xЯPrié–ÏüS+6Š]2Ùì#Ÿß”ïÛ¯ŠB\Ý(ÛwänlÞx ©}ŠK9¢O϶¢2ö¥òýºa¿ Âe'Ö––à½uE±hå5¬DÍd8Í]d}z€ÕÍ„zíßäµÒõéu¸^®¦àÓc¼@‚´ôq‹µ±ÙõWJ™YïÐ,E‰šñ?´Ñ«-Dùþø¬…ïâiq(¦io½Ê· G 6`Qç:?Ÿó¿¸Tìhü‚°Sf4}9±âŒrÛò< Ãß6’­<ª9Y9?F'@r楹!:‘´<¡+y§R6Hw$äGý€›?Ã'ûˆ’K^ óCè·¸i%Vj´ÐÊŒ¿½šÚmæ?Ô‘/úm«.Ä@S ü¿È}Ì#uÀ¸l#:厼&¨*€rëS÷>1_çª4%ý(ëPó®§·.ºÔý-¥ç7»v}Mw¯vÈ+ЬãOÝ~¯Ø²’õpŸ@8­ùßBBøoœ#¿ _!`ˆ+â1…‚%F´ŸQfa¼¹“íç„\ècÎÚþ8]^ò¯‹»¿y{F <Ùì$$“ï~!rôH< ³³JÆ,ï´2”žD‚j¹c£ùCch4ÌÿƱžˆðÆ[D(?ÉWUåËzج™<'ŽªBö`0&î¯ùL ±¶ÉzD/šëÛôÚ(EO'3M|:¯t›§VÖDÞ>íÈCäV‹o%›c'T³Å»ç°âޱ½ }p¡ÿ5â‰÷ÀÁys$ƒÌ¨{hHî«ÙK+I·@T$ ³ Ùà¡ëW}—رz‰è”4*¾‰×”u›EA¸XÏ7ÏU¾0Ž7—oj½–˲D Tn·BkÝ Þt e‚©rk55dkìùaß+8j…qŠ“$öüC·æÖ ‚R<[iW˜P¡(®þa,1&¤4!ë´lå[ªòѯ¦N|ZO5N¼CƒUeîC¤U ›5ò$­tß–zúsW–¸C¯m–Gøj»Ã›¤Îî´:ÝØ‹& V;ˆôNCaPHù<˜|ˆeØ"#8(ƒÄWvlÊaeb[‘Ò™E_ý+‹E/Ä" Skª2€S&jzºãã*Hª)àÍÉÈíØh­jy–%aŽÄ÷âk“#Ì=Dqs8Þ­ÚJÀ5(íñ™À$uõàrAÖ:Áä$:~H+’õÇáÛ¡`ÆVÌôöÏ«{¥˜ pòtª´Á®+*´Ã‚îuOßs¥:1)ÿLBÿ¿wLhd=j®3Í0£ßôÉŸT_½–;ÑV óøÝB Ó`J ›¼!¼_®Ý2t±-3”%Å?}#HFd9z¡+*ïH7JçÀøÉgø¹ìÕ"¯d0ûgýu3ÕÓ)^´1]Ë®bùᆬ ÏFŠ`JŽ·eÑs(¹46òƒ‹d\ìó³}¤ˆ¼Û!NeæKeðÒU|«u;³‚ð"*þÏ‚ûS•2{Þ+Z¼uú [»µ9Í$K¿zñûmJ*´›²üþ°Ð• &Ì =wVaçÝ@ã+ ¢ÅGSò6Ç¡“Ô à•Œ‘·½q5¥/õy©ä˜äØBŠèúV´¸C+fÖ¢E_8Ì;©0K«·Jwº[pØX S‘†Ké†ïM%i¿m6ehâÃQ©ª ‰C ®æÌö˜ùë±¥Oxô~ êY²\Ùq63Õx¯ïûÞéD| L~fHu‘˜åüá4GzÁ—3}j¼b*­‰Ôª¹/ð…acUò‚_AÇVú)¶šw6Ç7jd­ö*ƒÖn+Óì3ÿàß“”£¸`!K½þàæƒDÝ`j/ÒðÝã•‹ËÔšY¸Õ« QÙÑ;HJ¡€*ŒýÃϽÚzÁNˆ&}«„yqöSAÇtû ¡¶ÊvîI0ÞYdߌŒ`¿Œ &>h&ôóH²‡G+£…cV?·Í%_oòÝJ†ç¨,Äk"…ϼ: ŒöOáWì´Ç{c¯4´KŽVg+x9¿öàžtÈB3z‹(îÜFÇ ñV÷ZV7¹…¶‘9yÀhì-,‹>@ðª?1¬Uœ’ç¶{ …/jd~fÂ"_TÄf§V(º…QæO©1 ¤³ÿપjyŒƒeðçé¬3xÇ…„ ‹aáÖlâ©¥*<:qÈ\}Uœãmn¸áÑJÄMŸ-øŒ2ûǶ€½zMä ÚŸÇÉ0ŽáָγæÅòµ|ת¼×pçu5D1?ÀP¸”~ æÂ}Öèã°”¾ßK8ÖÆ`ÕœÈ\-©v`á€;(Þ*b³°N¹-q"Ÿ>u°þéþLÁÙß„â#Þ¨òñ\@·ùR×'(d‰vØÍi5 È”†|†=üƒáËM}Ø#X}ªrTå? é¨bu·‹"Aò…/AÆy1 $o˜«P·I:-—VJ(E$1m ËZ åÃ(bÉ/Ô㧤œ¢üqýhiP…8ÃZûâHwæcl-l„ƒÂ€1>=Ù .mH:Ïÿnæv7IóŒrgéÜXRO7Šó²PÁS¼²]‘…éïYb·Å™ŒZV¹óÎñð·CÚ¾¶Ôp9ds$ðV!ßšaÚ&ŽþLcÝ+½4©Á)ÏS-äË•0’S«/Æ ùàÝ×™)ð&\ÅÏüMIfbqTË{ÀI¿çvI¿E4Ð-ׯO<¨)з$þ–¿tÍœ»‡Ù*í¶”ËpÕ@›lÁ7…DÎ ‡ ôt0Ý’öÇW<;lxŽü\erÈ„]ï×x7ïíB:ÓøÌ/áýK" ¦ÿî»ùÂû]œ:g«˜¿gåMÝ’J¦\#‘‹hš+£Ü⺲í ±¤ÈpÑb"WLô€n P,WÍâtúñ? [ÿÃf#g~é­Š¡WCÕ„âzlïz¸P*"—½Ä¥3C{ÝÿeKìC`ÍÐ4¢¬XuÑ»+û½#™H#ôSm¸8`ÞYtUÅØ 3o\ÛI‰üÖ”†\ï0¢å"©ñ§d˜4äb°z+ÍòbMYB 7ìŽó1ý¸#8HŽ’Å=]r/Ó“/<^aŸ:ócqôk¨ÜêðH„ijCçãi:aÔ-Á\‚žÛK]µµá3f?rïÐÅVÚinOýyDY¹äÿX¾`˜Eè+cå¿ÂFû?ÒMp>¨Òÿ ÉÁ½ÐTØ€óµÚ,7lggg åLÈ;ëÇ´ ‹…â >¶*9qÃæ¯…}å3ÿÑäs)+~–Ólk…³Ûzm‡hÄ¿éLAÓQ˜)‹úüÎM{¥•ËAȱy4´ó;M4Ð,¼¼Ö¤‰ /]åD%Ñ €Ñu΃ͱ.K×äg±KCê£Ø* ƹóßG€°©Ÿ-ö"& K43Gñ+uÃuÍëãÚúF¾ŒÌP Î/£becŒÔ¾coñÀöZ¡|ôf9°µ·’„²è~ûŽH¥ï…ÙÆòÍW{³ÿ³JŠBy6_󎉎1c›ôj©x°H wÒUËœs3œ€«•Çåg•Í'œQÕ@n]o]0Ån”t<$¯naLaˆ¤—¨‡Ûc±¢)‚r!˜ Ú‘Ã1m·›ð7QE8eÌ%[T:óäkæjh?aÐiëi>áÍàSË 8zd…‡+˜y‰ê쓌Q­;¸[ôôùó?0¡f„vRq—´Š-,‹hó‹lÒ«Ð ´vGèˆnƒdЄ™*ÎT-¶1†ŠE0” µàxÓ®á/DzÙ.-¢)œÏR2NDi–Ï(†,Š»áÐØ¸(ï éÖv?Nm¹2—ÔØQ‰B~¹šä— ;±£r•T¼¾T/¡¾ô9þЉœ”’svÝYÞØ²PO}³âªt0cn´p§ž‡ý•i¾¦?0V¿vSˆ®ÜßZkwDœÃ1nkAš Ÿa_ÞÈIzOI¹Ø9 (¨‚Ëmç‹ÕiÄgÆ‚½OJ:‘†Þ{VÐÏeÊØˆuQäP`¡”Z(\Ú‚Ž±ùïåÇÐJ~V‘U!t ÂEÍÊ aHœ1ÎSQFOüYwkØæ“dc‰‡ó¦u芄V¸'ÐÖb²_ŠZdBnñ uÔ HŒþ=N¸%hcÉ’e¨ßŸmBû)в8„EüDŸ4Ø…’÷M;)C%vµ nïü©I(Ÿ¨©«’#…&¼‚0÷íšu̸í&ÕŸƒ¯ù.ïkXp±“#¡r׃EÂùD,cöH¼ÿØp²“Mf°¹7psv­&Á“˜zâY¶¦¯vAýzá¥NCoÙ9ε³'/<6S>îëúÙ!¬¿’_4åªñ ðIˆ9+húÞxŸÖ¦—˜ÄŒAÍSÁ ïM&¬¥%‰ûŸkMQárhO^3Ë-“*å ä´<_£ê±B>™Nö©¾@TAYršÂ±vc§#oûjz3ÄçÂÎ`ž`¾:ÃJ{‡c1ÀÉ> t7K!„¡þÄèm ‰»]Bí«ä¼oÕ?XS+†©b¶oxiª5â}ª3ÃÉ3é}€áš zï?…ó'ḵ2¢›µˆNJ·£T{=ñÎTž2ŸÖ]x¢éÔW¥²±³¢Tåc›Òh¢¢px;¦òþ£¥Cžëùö¹²5콌¬ØÔÏáö²4ZÜïŠÁ#¸t3ºçk½’»ïEÌüFëK¥KaGÃvâ•í,¶ì‰‚nó„Wú®Ã¯¨õÚ£O ÷H•§çÎÞÔÏñ- 8eS‡ªÉ‚‹ñ üãÅaN9 3e0ÊO¢¾záߎóÝ”®PuÂ#Ç›iÛwþ„uéúX.~ø±ÑÁÍwÐ2ÍÍNx (¡÷ì'ĘæbÛ­‡ïŽiø¿TÁ ÛíåƒÅ¨ sâE„°ièÐxCö‰8·B ^ÔܱÕ~°o‘æ#§ïÍrí÷Òy…/•i^v;ªp0ÉÔ‹¹fšµ'¼Õ^B&óIµ9"¥¶Ò¼× ué»Ò¯®€]þ¡‚Ç›œÿZèéÑšã “^šü6Ž¿ÌPÿÂÕìÂFv`¢5Øî`Ö[ Ôô×GÒ\-©›è?˜ÂšÊÒ†´6Ìýç“¶‹…xgNXЕ‚¨¡(™ºó–È ~öÂ1)Õ¹§%'¢ð Õ7ÎYô;©È“ ŠÔ ÌE0ÍΦm¹¶Cô».69›AÉõEv†¢„òE>#W£—â=}TûLÞÇw•æ¡×£Ü™–„ÿÚ+³·¹‹@záMyÅô\Å92ÎM>WˆÌšÕŸíœ’®ÉËÀ m]uýá¯NßüuÞù̶ß–ðKãï,%6BkçY"h¤ ,pÊyQ°RÿÚ|Ã6/§0¥±«½ä"J•U…ëæ2£DóÈ ¶[ÝÚ´)ãÎ,¸¦V Ó­füB3ü‡†=í(Gžÿ¤t×”iø‰*ã(ö÷¦ •ÒÙ –Èêî‘leóÌÛDoùg”üŠCFZã4ùô,C:A ¡uwÒËšÿ¦ëu@7n˪DeZŒ¢äÂ.סd}cûÛ‡T!Y)ûüNHO F8I˧ÅDÌŸÞúóš˜àz®YÒÑçZÝævÌ9¡“ÞƒVÞÓò´)œÿƒ­v Jk[–ïg tâ/5kg)ÎãOìŽH<ƒ›9v•0-s¡!Ïï‘`Ç]×]^I†ÂŠêkZP¿#2(1“Û¬û _’Lë!ÂA•Sz u3>™;ѹÌÓèÌkYg\=êýcû,|“ÐiÁªÜ\‹âò®í}‘îcY˜TÝ‚‘M߆:)7Ùx¦®,nV×GæR«^N[T”_‡tžxù·GAQjÃ)¥j7‚cMÞíêÈ•[k0ד±®² õ.jLh‘‡ß9ÈA{ÚÝÊd”Žª*&Ò†TæÕÔwabLDKw³Ùô4ö(kr;óšo½{DúEÙ¥ðß´#úƒ™Õ¢[‘Tè¾PP)ÅVÜûn*[Ÿéäžf`·X73 )à oÁ±$]y º+EºÑkžº!‹ú«aÖ$Æ´c"'»ô^ r`žp§ÏÔ+rÇnËÌÿËü/õÌÿ¿€ùÿ ŒmL \ìm ¬^N¦Î.öN¦>–f€ÿ¼0«Iendstream endobj 4 0 obj<>endobj 5 0 obj[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602]endobj 6 0 obj<>endobj 7 0 obj<>endobj 8 0 obj<>endobj 9 0 obj<>endobj 10 0 obj<>endobj 11 0 obj<>endobj 12 0 obj<]/Width 474/Height 281/BitsPerComponent 4/Filter/FlateDecode/Length 5997 >>stream xí] vã(³U;,ÀùÎ,ÀãÞ€Ïø-@s:û_Ó»õKÐcÙÁ™Ðn Bu¹UE!ËÊÇÇOúŸøŸøŸøq>RúŒÄH8o)7‰vß4Ì”†4¦Á™¾)P‚%j<¹  )ï^x“² ³ãj¹ÚÁ¶7Îﶈä§ÿ1ØaP7•¤öe¨ ùÇ@ªH{|†‘òŠ…NÞ$ÒaQãÁØAÕ›Ú"¥°åì—oTöDh¡Ÿø°¿å # #Ø„I(6ŒžAa¢ MÉ2Ýì p Ÿãˆy[d”N‘4- ¬¨G0‹ŽXMTIH=PÔKb°$¢pK`I±WÁBý¨YêË4ƒ÷¬'Èõ’D8hZ[j¼,oã†Öt¡ø]%ZIÝÀ)oIHd2ÄœkÉ]‚D›,²Äu·)ˆ–\Èœó¢)Àº`&Ué,å”°¥ÿ1IK$ÁÐ/ôƒ=T¥kf§X¼„Ig(\XRe`½a÷|INÙ¨ õÒÉ=Õ1k+‰³Q&n:è =Q;Šh*Y{·¡ ¼ 1ËQ7÷~{»EËnKn¸+…K½$w$ -j±U*³äf {lL¢ Kƒež¸«WsÁ[-ítKyÄhZLËÚ¢ÞŠ‘}Z‚[I«[l±X‰® U"°¸˜|$¾^½òöP¨Õ´ìb7ÍJ§×Ï`A7EÇŠÇ´*Ü- lS–ÐÉ^`ç%`Á.02LQö ÉÆ,ÆÚACˆe‘ÁÅG®“‹6k—Yl • cšÁ’“Pô¡XqíºÍz ¢OÂ.‚7ÊñúŬu‰³š†ÂÅR¹,0ÚJ9ÈÄŸH‰†Œøäói5¼Ðþ'ÂÌ÷ºVO²žÐÏMí4¢‘©PŸh†Ë'·m,õÑ‚¢XR’M`M¤…+¦…:«Bî ¢XRŒ¬³V¶ÃžÀâƒ#ݸM³p³‚¤Ùš\6ÔSJ0#r"Rk=£Çwî,®ÂW\%°Å´v½.€«ˆ˸Ó%í¼ÁR×E²ë 0d‹&v,3»_ëÁN¤vðä.•éy4àL0_N Û5Q©ÍrJËÕ^k`¡Z|Šƒõ_Y‹µÑbXBÁ²û ’õ®å¼çm×%Zn‘²¨ –¦.]>1Ÿ÷¼‹µx¹Å½Z–g Âb‹ªs?DË'?}³(íb%‰êòÓÁ$%-ÑýrãÉÙ(X’`©NDQ3ri­u³Üx¦}‹D0)ç/¸pr¦ÝºYl<=kL”FŸ«Ò-œº³V«Ý…s”5QݯI‡åç–dÝØ~Ë9j3+Ô­¡ž^`­»Gá+úb¶BOç•bÑUû µ‹¿¦tN˜½À~ ª™«Îšë†Vm/—>vq8+¿nÚbÍ˹LìêéÞÏs3m¹êÒ?isú?¹7/h}ú|Ë'פÖõŠÂ0¯1á¸h0éa¹vÒüyM‚´ÃðJþrÞD §s«æ5Î\U-®”…«85Ø—ëu®ŸnÛ?ÄÖžÀ^Jõ5¨×+“= ×±YÆö[Ez\»†$Rô§¥À ÄÊ~XËÆ±q‰åWk"å+pÉ8Gëu0°×ë²§²ž;;…„œ¥Ö†á²ÅQhtûå)UýŸ€GuÖwôe¨Î·>Šõr“çç\(½ô¸ˆ•˜ `¡Ê2š©î·ÙèÙ…µPi‰Wšt*ÚgÑ>Ȧ륲Õ[ÆX2±(,ÐÖCWöýõG¥|3¼ž%‚V(1@D[vöõà&¤PÒÀ ÅÎ3Ò‰rS°‘ÛØWè¶Ÿld#Ì¢Ì2NÂÊéļƒƒé¬|áÄò^$dœØ\*¤ —Ÿ&pm¾ãæÐWÆé¸¼E°S¨çóéÜß6 ¢ÚE¬wÞ f*ŒeWYau¸¾ ý{ªá=–ƒ"Á÷Ò®–02íàæRÉØ±I«â-t9›í5µ.ÐQ-†¡pN§YZîqø_V3[è2sÈÝM³Ik1žj¿dœ÷Qr”Ì8¬g>:IBlyfÖ÷÷cæ6+2Së=Ó V±XRãìcÿ^畚œø²òöVˆE˜˜Õøï%×”õ¸@ëŠ j»kÄþƒû†êq6cZwRN-Â(ë™N´Ø‰ÅF$ŸÁúo¤ÔóŽöàÔ¾å[1Õy'ƉSÉUsJŽÒ2†ö©í„ÈZ ™wàž\+¬dv3#Ž*ŠùÌát>kÔØo„lÄ^ëÑ(“}㯡¢÷€sÙ¹™EH`Që×›{"9•“Îqh‰8–ÁM· 6Ï‘6YZ§Y™’‘‰JüWÐßR±Ðå_ öÜ7µbOA‰õ{‚¦E]>ôö”QÛç"^ÝS^²‡ÈiL¬¹ƒåO¨C~ëSUïàJ%ï´‚aRÁŠïGØjñ•‘ŒOWÓ¬j±¼Ó*Ö-™SKê"ZÑXÕb'6{§£HÛT`/ÌÜá£8µÔ«ÜŒê ¬N²NlöN›°FnZ+zÜXÕb›w²oÄZ UjáØ°flQדgÔ=TN÷NmrôØQ³wËz¼½Ÿ#E÷Ö´8;ÜpiŸ€Ž2d¶`=îl¥Ån±Ç°† HDÕ¥·©V}±i±M›7(1Š+²Q E©#VILáÀÜ“{« 5E¶ÛoJ­Æt¡’j±M²æž6{bƒà³­¸({Œ¦¯øXÁª»{Jbó~ÔŃPëÀÝÞÑæ+ÞÞ°Ôb#vªÄô B|ê«M‘yܰ²£íI5|2-V÷ÔðNxOÛXø™b…ÛÏý-µØÜÓ”XX°+¼}hªD‘Úa8 ØkŠú0=é™%2ñXD¡Ä¶¦X/Âû¸ðÁTÓXµä¢ö· íla²æž¬± ƒ]`d˜úÖ”’¥–ïFìîÌ…†©$`Õ«{jX,=|HjLo‘¢žsLSæAíà7ÞúñPb²•·ˆ¥—„ñ‹ÂÈZÑÆ;ûafÀéªw0Ó*/VÃ'sO Î`¤ ïü¡×þàCÚÜ«Ôj¥&Òì®qòãŠHüytâQ-n¹§­‚(µb2ù,þžkk¿ÛÚar'ƒ™Ñf…TDX5Y•ÅŸNæ¢à¿ÀhÜ >‰ÐâjøÐ1yU2½ÂdÕßC¬-~déót£%pfe„‘a²Áe°¥É¶lq;ÓJ­èŠÉó–y º‹x€¸%°¤Ø#Å£1¦í§ß×’À’Û´!ÇL1À³¬˜ì]Z Yµ—/1ZG´Êœ¡3p‚߬N<÷Ò z,“†Ç_V“LYöN-†[e­-=Ôûe`a¾œˆÀì>Zlz,FûF‘ur#J˜Î6/£ró¶4Ú~ÀFÿ´“É–z|f»xþ8‚•Xñ^_ =ÐU-ëË ?ZÄE`´˜@«´¦‚ VCнLÖŒV‚¨7~§Çþ`4TiZR6(œ±€Me‹OéäÃ3­‚Ýû÷ cKÎ þBz+ñÓn&kF+3í?OEjÉVˆrÛAëGs…íGg,`w0Yô.J"F+÷¸’_s—Ì\wsåtQDf{ÿÄCýF°zÓŠwK³RÎVàÒ¬azKf?“5=æ°BWyûÎ=ó˜Òü€Nœñݱ¢\käˆQÝ1S»¯;ž‡4_#ÌÆ™gÖd§³MrsÃ(3íÃÀ΋õÍ\’o>ì¢Â’©Ù-Œ›‰mâY`ã˜ÏƒÎ<í¶3Žž`ÎT¥7ÝöœhS1ÀtÛ>§˜·RF5yZMçIWíá‘°BF6ÚfÏ&ÍûÐ-Ó‹é•ëPš´{üõS ­"X‰ŒC7Y€f¡Wž ñPO+·$•åGÜ¢à;l@lÄÇiv~æis—ûçîó!ç‚;>í?ц+‚Ö³à”\*ßpqCi2ÍfgŒs–’efö­úàŽu¢mµšépµ8ô5 –,°âŒå–ñ§Àæa R>ÔG°|O-\˜ëÈVéK²h˜ofv:ó %ÝrÕä+˜ìÓ¤¤Yv]ц ² Çô%l–6H¶§| dšMTŠ¿º«öv\Få9¥œ¥\uÈ•Á?,_,nXÞöÔ`,ðfùljí©˜×P»´FÁX“"îØ0ó@öfÉù¥ØÉ €%vÆë€i?b8ŸÏ¿ÄîêŸÈª¢‹UÀüΩÉì¿´í%žqg>-œßªÃ,D`q3Œ~±A`ñ쌥7nTuL¡ê°V–´ìŽñbuýBÂVpàÍ*ؼØá°ÃÐË ‡Þ`Í7€å¥ÀþQÉ:—0“Ü‘Rd jÍlÓç‰v°-öLÌVágfYRãá×&f§jü`Û,;(˜Àºƒ²A¢¤9¯xÍ´F³+f!çÈOñøM{Ñ;öÈ~4ŸIªžÀ’x#¯GØcÊ—Zµs£º(Õ8îl¼·Øº9¯TàZçu 6.zZBßValu^ ÚÖÃ¥®æêX㢧ÕÜöZjžGϳ¯öc=̓Åo¥Ï}€ 뀰«°}V'ËžÖˆT×Úz¸ÔÕ\ÝØzt˜­F¤¥:?j\ Òg[ƒk}ÍÕ}W›¬Êh ðû{|ø½9§÷#B„ý“y=›ÅÍSBW¥7ºQqá'¼D`i™S¥—‹h˜P °Øâ§tWæ½Õî.°ò ›Ëž´ÀGÀpG²^ö­‹³7þŠpP[ò Ø˜=íÎl^õ<;\lØ"ˆéI»üÖ»§Íf°O¿5¶˜Å+oaN~‹Ù¯wH‡Åû¤Ýgmö Á‚ÇiúïÝ©³”„ˆ8 IþÌ&Ù#Ø™f«šjL^à>8~.20µ³g-P%%½á¶ ÓlU,¾ï€7ã߯t vêF}œ[ã.8Z·R‡_€Yð{?Xö2õìú»ÒYHå08ÍÈ4™å¯Ü±¹¬÷É£#y‚$‚ •wg[WäN¥až}¢œqP|óî_F3L¢w;³­KOÖî—»ÆR<y)çÇ  ,8$ÈØ² m†#¡{ê±<䣃m]2KÂn߯~€Ö‘yÛ¶´‚¬6؇>@)˜·Z#FÀÒóO”Ó¡&`[_ö¤ºËÉqk˜%H ·÷Uc ÊeXÅRÙëÀfa5³õC_Q J®¥\*ù(‡ÆºèÙ,ÕÉåÈ"çÜÒã|YþÐ>9¿H.}ìã|ù:í\9çŠßC0¸ 5M­²Ø*tèÅâŸxí.Óìž7*ü*7eâDësϤ‡4)) ZõÁ÷öDߺ5™m1à6«ƒ3î lüÁV˷ݼÃmØó€ÇæýÚ·d¶þ ¢‰G/Ô$6îçi›„¨Å_Dˆ;n›`}ÞÚ±LÚa÷õÓ,l+,ßlÓ¯a›Ôw 6Î=»è±š,/žý•ÉÀ{0‹o-)ÍŒÞ~cFBŠøEÏ®7e6J1i6™{&XONÙP ÃV€ÝpÖÛ0X½O.ÑñF+³ìûÔEƒÅÝxŸ™V<ÔF+&[€Ý÷‡ÑŸAŠs¢;V£½ò‰Z¬Ì¦OÊ·ëi u¿ X{‘Ïn]€K³èñLĸ}Œ£÷,’ü0Zxx–íÉ?•`ÕhïÕã†ÉváŒíµCeò¹S -î'~"5.<”íû}þX´X&5Ù–¬®ò^ÿ%“i!E¥F{W\¡ÄJ¬Ø—2Uí]ñ±¸'Õb5Ù.â'"¼e´wP«î©xåo/&k`ÕhM?XÕâß>u±¾K.ŒV&Ÿ÷OÏ>J¬jqo&kF{¡õØù¬þøÓ³¹'Ÿlâé$¤ nå¦[¥ÇŸŒ¢ÆùK”wYèë8ú1Y3Z]Àëbàý“Ô*±¥÷vóŸÃ_Ú±âžôãíú:Ž¥«oª¥F«ññç¨-‰5“íf–¥Ñ™ÖôØ\Ô'æÚA Vnh·ŸzÒb«A”S{û'Rï¤îɵxÇw6lÒÔåF¥ëÒçvE6%ÖèÉ´¸£‰‡†A&Óc‹¢n,,žèZ‹]ÍE9µ7M¶þ¶tÞ1bû2YP+zlq…»¨÷aYý‹ZSb'ö7ÇÅ}M<$±€u=ÖùýE¶)ö݈ոXÿLi1._{ “éq¦v³GÎJ|” »[-þÐ Ê©u«}߈6`=X#¶3_LJ¥þئÚó á~ê“6(]Æjs¬M²ýi±ûcsQ¾Òæ…'elV›cmÁÓ/&™ÕE9µî£6  XÍ;9±j±ë±Së‘Å:·«y§®‰µÅ€»¨óIo&‘ñòï Lgë}õGí+÷ÔW\l²«Ûìsöõ¡ý«ýγ+C;¹A¼Ú[…ÀÕ©6S›'[‚{lSãøG£ÿ ¯¾¸ëÒ=¯Mµmjoó«SÔ`ƒbíXwQ×Á$“-q ]ÆO /=ÍÈÅyãJï‹Ï£Î¡Á8-’;„)_Ê`eäoÆa äV´¾FL\³ìëx|iëò©´V´}1ƒUØÑI`¼?öPšë‰^>Z¥é·õ(vyü§FËx1p6^¯/бŭ2ÜÄIu/爳šÍ ­7¾0ÖYn¼"ûÒXoDû²öjº¼]“//˜§³K¡ºvpyÍùÕHµýØvʆRöáKj;ï5÷VÉý*läЛËçj­á÷Ø_fuùÛA%ÂÚQÓ·„JpG„Ã…2ã8QÅ7M€/§W»#ñMIù°þEµéendstream endobj 13 0 obj<]/Width 451/Height 378/BitsPerComponent 2/Filter/FlateDecode/Length 4176 >>stream xíÏŽÛº‡9š0„ÎÆè²Æ¬®òf \¯k£º¼AEƒ›¾«n>…‹A7wß÷p tçÂýê¿,Y²M)¹1‰%Q?Ã#’ŽO§aÓqXÜéôcl˜djTúà“fDð8 Î÷× ðßCý—XÂüC œü£V…¾¿1ÀáªÐß~%+øËÀ@ÿwÎHýáó¡%øuà:œ'À5c¾¿ôßâ|3 ¿F{:¤„þ«¿eÛñT¥®ÙÓ°À×õ§a×þƒ1¿ç”Õáƒ?ñ×=èøðáõuX c_ MƒÈêpÚÒÀ¨R[šÌÊUš©ÂÖΨR[šÌÊUš©ÂÖΨR[šÌÊùf*ݲO 1âöaýð:a“×9Û"`ì!¥nçóíz»]¯7›åÒ_M><=m{Àåá­?_o¶Ûåví¯6þd¾ö{ ¥2 ýO ÀW(uµa²yÏ*õÚ’„¾¿\mæ+¢õiäþD*]¯—¨Ãùuø©ï:üÄ~Ún+}èßJ ¹*ìÛßMUZ(ùý Âö°[£Ò(…"¿°òÒU OxïnAÂM^V¼|S ƒ·köúúd¼ázòúé MNÏ÷z»YÆÞp¹œ|@£ºîG¯iÂUlVã '›ù–oø0 ¼áÄŸHÂØ&uØ¿J׫ØÂJуz蘽ƒý:§¼×ö3Q{ÚI_üžŠ?/ö‡>ùhVÏua)§¨Ò„‚F{ãÏ-•VÌ·²åæÂÑ'¶Ýüüa>9{8+©„Û§OËÕr¹Ü¬VOOO›Õ|>·RþY!)èd5^úO>?ô d2£ëÉ@@ÌÇ®&&ÜŽ?Ÿ)ÃNFªÒ¤áï“:|µSþY))ÐgËõr=Ymb+]M|÷’2`µô÷ìé½/ÆU¥ösÜX‡ýàj:Q}Òr¿„®úŠf@àÖ§<ƒ‡\*h$<ÍSê}»¸Šÿè]²0÷i!Ý€Kvýxê«©NK·ÿOF¦,I¾o–{žNÿJ¡i{ã ´S-aC2½³ õtúŸÉ¹ða xŠUzºÀ2§l¡Q²ÒÓé¿-D[@b í\JG³èýÒµçMîáÅlöÉ%#Ð(bTibÕÍh4UäÇ£Ñäº(íFSRGé`4š’:òƒÑhr]T÷F£©j$9þŽŒÆfGÿ%·QB¦-¦ @ÌÙùº‰‹8õç¼ðº=µ Tu˜<@n¨_òÒköާ£ežþk &Ï:žþcø÷¼ôš½oüÕ¶„—­æhÛHµV_k4™eõ¼l¦Gëo…Ö¿ÏÄ©Ù鈯¦6§wÄ7E›SŽ@Û-î RåJ8’Á÷K~÷t:bl@ véFºa$Ô :•HGÞ­Ñ.u¨’À€ ä1Ð ‚$ä!I¨Ü¡€ À@‡ÊÅçÝ©ËkÅux7¯‹ÑHÏ ´£å:Î ÀÀs%sdÖûÃç—¢³ŠÝS À⑹¶%¬Þ¯Æb Œ¦xùýû#ð~VJUZQÈý‡£Jï×a¥„Q¥…Ü8ªô~VJUZQÈý‡£Jï×a¥„Q¥…Üø UºÇ\I<]’…&¶P® ¹$3Ò…qÄN=nŽó$š£¨ÜžIÌeN%ÆË$ĪyšÕ]º™ BJ"Ä0-2Î¥OŒpÐIL.F€‡½ä–äÊ x˜í À©†®ÔaÈ<‡…L1é„lºpYIÊ£G8 ß øÇ h(•º ËlràËáðøññÈŽŸ+* ™ .áN=Š©·CáyaPâéÐupÁB†Á”K)ñŒô‘’¢ÈË#àý @ö¸gVÊh±x¤©8ó!¥3]ÈÕSL®›ð xÏhEj·xU xüòø†1_TeŒFÊYLX†.€hàÅ¢X •ÇÁÃ5ºa#ðít8~™½=ƒàJ bPj¡h§%ÃQÜâHÓ×ãhÜR|¬\·ÓÀGÆò*Ä23È bü@æyõÄdVz¥)Hp˜S 9ÔJ<WØÃ ÉSf4¾¼Ôók;ìE­×dÀýéñpx™Íé¢6˜Ž‘°µˆâåw®x&ÝÏ€6CõÍ xd/ÜÏî¦r4o3 ³—¯°s½J›A陘jÂÚvT©5U¦‘JÉÙç©àõã×B¥×jží%;¢šÑ~LÀäø’0/«Å•yJç–µ©¼z+YœPãMUÂêÍU 9Ÿgr}®ãžÀzÜ£M›½±{™Ÿñ¦Jwè ÿÅ\8 äчãx¤)3̘ÇÛnÀý~ÿ‘¡åF>£^vS`(£(Œ´p:2\+òæ!õYt$ú»„”Â`5ÆÅ1Sõ,]6¥¿Ù^òDfC*ݳÙþñ€>;Ngûà n* …žz4@Ü"EH”€O‚ ¾ã¦ å!¡ó„>(BCp-82y|¹J•pgø8—ü¢±[£Ò} d`8(b•*íi/TP…‘ˆÜÏ‚§Df¹"„d2Øêl`_ ¤%ÃëP(%Ý âD£?P)eǽ^ €™ƒSxÊ&àþ,Oì |"€¹Ñ /ëh$D•‡n)Õ!¨CÄuh€¨W¨ÔH¨ÄßZàÛéÄfoT}ooGòúèN½ 3µRÅã'Æ#ÃJÌS(|,„•ò]¢Òb Ô!!¡W£RÆ>~$m¸gŸ_Ð>~ÉU {/Õ:úo¦çRí¾¤VŠ™8hDB#ˆdÈJQ‹…Duˆ•k0Mtò xxÁ u‡ã¿45¨Q‡…R’ÝX¹çùÅ6¦[Ez—t¥‹}ó‘æ%[[ÀJ±Í‡å'«¿®‹„õwÞ˜û]EÖ@ß(ÝÖUBŽkÅU@Ü‘yEÜœ¦>µFÛ” ÍÊ”b1Ìr{’.#Ÿ“>q㞬î\ ‚Ë7¹‹˜T£%§öª¶0<ghóÜíŒÇÏÔV¨íÀH…*Ôß¡¹ÒˆMJß'߇¿hGñPpN^„6¾Z]€Xƒázlj€èbРšñó„ç v~+Ô*/‚3»bl ñ3§‘Â8Ó"ÿ©"%:ž†/1M·ÇnJ4ÿi¢¬ô¶¨«C 3ñ” ÷ W/¿UBT½›[)úo VŠ:ÔžçÂAÓzP)Ìíz•Vwá¾VНÕ:¬´_`ò,âÂ3unÚ.•Q=÷þU‰KÇí/~éòû¾k ¿_¾î¬VZóšWßõÒs^¡ÒV ŽY¢„(´)EÛá!2¿[8åû+G6€ZE“àÉïòç úRx6êðLIIúŸ+4bf®¹´‹J•#§ð¿è]P©Šð±1€pÂ\ÖšY;.7ÔSø_äaÍS'YˆØ8䄹ÄÚ´óÔ¹¨CáïœKuh$¤x£ú*ìP‡–IV /wÉJ„äsBºÛëð\+M9H>7$½Þn¥Måß–ß^‡·•Ûx×lTÍ­'®Qi]ç÷jnG  ‚4[Ú¿9}‡@ vaÚqbQç<Þ»VÔv ¥Â˜,æ59žk •ëÛ‘¢€CÀmÐö¾Ô È0¸íBÁ뜅Ð×â;] ‡ É ¢R Ú1hIÃÝØÞ—:I(]8²RFÛûR;ð¾òÏîg*¹˜¡¨]¦Õ5Ö\cÒvUŠy’´Y€WÒoˆ/!¢ÀÅdFeHjìñ-4 òdrv—0ÊÛí:Ǩ8õÌ1bº&‰2$5öfâ˽ hnâÙ­å8@ í¸0=TÌ|Q£öS;ÙÅ×Hhnâ٭嫯¨Ó™¯8Ê c»ijJLB¢–b`ON]ÍØ&MyZm @ŒÇQ€×®ì¤%\Zy ‰úÁ–vÅS˜aÄ ÅÄ@!ë€S«&Ê Yx¤8µMÈžf!1dб×&ø­¤e˜-IÈIkÞbÁŠ@¨ô6 œÇ ²bΨa¥±„p‹ç×n@ÓçˆrùCš©MêÀXÂê@Œw—‹??£Ðbl¥´ ƨ6[JŒ†$D«qkºÚhâ:¼x½•+½¨œ²jÚUZ¾þî£x‹ /vEìª4v¸ï˜úC„=¢ÐÆÕÖTJ)fn° Å{Öbâ–õÜì?Ä¢;ò†X|Ú´Æ*þ-< •"`jXcHþ+õLî¾i ŒM ùC¨Ô{aó›@ò‡ˆæa¥VjYžÛc}ά×˹£JïP^ý­¶U*8Æ!ò2ò)YºTª Rüç Ó:£ÐA€4äˆE}îBJ,7Á¢lŽ!bÊó°_ŠÀœÄ´&!¾ðèê'` 8DŽob ŽYHB& ¼= ûNõNðNÂÛì଄«ðß!!@ˆÀ,¡PbÈ1ÌIXÄÁèK=bít è¢sKˆΡ/EØjÔ×”;ØHuH@¬lÊëвJ5ÌÐ* ’•ò–Ó¦VÂJía€õ©2üeÍJëiÈ}ÿÀŠèý«ôy*‹HwÌÖÃÄP!Ç¢Jy‰“¸ac¥hX³s¿] â&µÀêK¬†A£‚i`M#úüð‡Ñ޾;'kâkû˜Õø§¦HÑ‚bá¼Ä·3â`<2Y²Œ4ø:fÕ×XyéD!¦ØðM Œš 4ë¶%Œ’%@ ¦H•4ƒ˜ý±º6ž7Ä€.†!¡¦ogÄîíu1¤‚Lÿ% ³:Œ0³×a`ˆïç¸Ð {0¶Ò¦HUl¥Â ­Q ›Z³}Àú)ÚDÚLzkïak³F`­ZîÉüáUúë=Ú«½·E¥ÖÊoüÖ1Nôðÿê·­ÿÃßZ$´þsm@ë?ðü¬bsÂ/x¸µ¦v{æ¼ h¹%ýŽcs‚„G~»45wNðÛŸ€ø?,l&ú)Î ‰€­?¸Øò{Œ•Ó«/>RëXVм|ø Ù˜ °õG,/*gYæD lÿeÐJ¡Í‡—JméÀiZWø ÒÿUó¼óendstream endobj 14 0 obj<]/Width 508/Height 350/BitsPerComponent 4/Filter/FlateDecode/Length 6299 >>stream xí vÛ8†Ùc óÒ˜—ö”q€Äºÿ™æÿ [a#Aí’8"vÔWUAJ¢ŽÇ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦®¬»ìæÊÂܼ{»gÄI¿G[_wÚ~ØDÓó‡Uõ §ç[izþ°ªž¡âôüa+MÏVÕ3Tœž?l¥éùêz†ŠÓó‡­4=XUÏPÑ{>nñµe™f‘Ïóµt >ð\`5FÑ n|s_”Þ.´À]ðwdi-’GCX b îU¢/ð²×aËÀù‘r$­="ƒ ˆnÀZ/4=¼ß¼x X(7|9#T­— '#Câ2ðoa÷X„Þˆ¿§ZÒèÉ_8¥]ð\˜Ýôr¾âDχ"$ àB0‹~\ü«ðPôNsIöu]>½ãÞ%Òº¦Ê3\Y{×PNº²‹‹¥ýžÊØí'Ö~0[#¯­ŠÞÓÊs¬…ƒ(†µO FÏ› ¼°\–5쬌:x+ñOF{ Çã[F7’ ~% ˆS²{0z¹–ØOO 5< íKˆþS¼rFÿñø¥–ÌMöGZõËòšÓéijp<<Šííòöñ ÷ðÏ~6§º[ááßÍÒ˜¹k§l¡®á`Ƶº³æA˜p/ ¶³‘D": n½¸…¡Õ¡:ì”EîlîmsN}ëP`|…õ ¤’Çü"P ŸY¹ÄÙøûÖŽB¬ýÉÏÌy˜Îô°úF_a8׉ª0Í6Š7‡Ýh¿³8z-m4ñ±mÌk³:Êò¹SUýÆôX|Œ¨…˜\-«ðTôÅ2çaFà¹*´Zo·m«Sr± œÕ~¥ëfQi¾Ÿß6ÏŘ%\®P»Þ怫™7¦·qÞÃì—ð]-y¨˜ôF-’i Lšº»˜skz¿æÿôÜž;7ãD²86ð!fóZð`|;×z÷«ÝÝâœöxxËÉÉÿ¶äN=ö./Œ„€²rʈùq¾7¡ÎIÇ[Ó9ƒûWïÄ?Þ²+d!|úZÅ›'£ÿý3Ðw0ÿ#¹„Ïâ˜W¸¥¥Üéx6z÷V Üîøo oº¹ow“ãÉèÿå–“#õ//ýÄ—·éã2ù„ôr+3£wåΫ~k[lŽ#VÈxš>úo€<Ã|ÿ7q…›kôX ô…ísÑÿæ´ú?0>¶ÿè›:©ÅêÑêÒÉ“­ù‰þøçÇ;Üí|?Ó±—çi¿ž÷îÆGAN~דíÏ÷²âÿ#â:ú㑾àèdÇg=-‚vöŒµÏB®‚”ö·ݰt jê¬9·¦w¦µí˜žKþùÍŽºuÕ=#Õ­÷æp4¿è‘÷]Ú» ¡_ÃsÞpØS·îôÁèå#£µ”ýœ¡çÄïCvK&}W5›ãùÓö›¶ª+˜:kGδýeY•ºîœñ¦çŸ [sB›Ôdz~ÒÅEb¦ßËðü¯BÏ»kÆ}Å[T¼Û‚÷qöEl¿à}÷ïÀÚà嫨—â`å+¸Ý+¢_Šž·"Žò7Ü–2_ÞÛÚûÁ¢ç\§ç/ð|Tzw³Lî˜m¿¬Ì]† k>ýŒcÐS€Ò;ít9òp0C5u-ï6žô÷¹Ê™¶ïºdY0äÇe£íôKyþ6nQcҿ̼Ï,k²T;ñº¶ÇõÍfx]z¹ÊÙàaúµ‹;¯•W¦'Ûzxeúµ¾ÓÊKÓoúþkÓoùþkÓoÿÅé7Œÿâô ߫ӯûþ£ÐãFTæ¥Å>Õ¬Ÿ·WJ³^ËzBØð@1'áÅèWÿ(ô`¶|çi fqZð¯Ì:1zÌzy$z>ZÎø÷^òy°jÀŒ§‘ b'<=o>ÃäøÃ's™MGü¡ì~ã;у0ÃC‚ï¶â€üáN|&s–BV•Ðk'°äæ÷väMåL&LNc™CçÇFKœ%tÁP|éÕ∷¦wëGNAÎxxáÂañgRa‘Ðcñ¬/Õäônøœ^‰ÔŠšVæx^o¬¯AŸ;RÒÚéeÆ»Ñ{öH²©˜QñS¢ÁnK¯wÚlçÒËi´îz…þsq_Rj½¿¼ò-A³³Ømé۾ߠ?,ß¾ 1¾ž¨¾ž•E£Fj}®Ðg•oLß® ÿ/°Þð=|‡Ú§ª5dÀY"ãÍMqò*)eRôÔX«‹@o‰ñ|÷”a½Ô—ïo…ÞÃ1—RÏxWrkúZ·ß¤£Ëîþw"}T—ƒ&}6ãïCŸo­½ 0z0õÇYôTüÇ´è7XözkÛ×vËÂè—£‡ØeFÙKÜž>ß8}ûàCG.Jÿ>«ïæ¶4ÉÒª óŒNœ_bK°ÓWWè+çûú{¹ìL‚¥ ÔÖb#BÜ>¬I˜íNÖ=&0ªþ7ÒО5z>Êo!kz)V½ðÆ›Nòc±ž?лqö>nðºôðú žHëlÿËÙ(ÿv¢ç X‡"7,&®û¨äUïouZç],‡°üƒ£÷vìÐçVV²†²bn¡×\Ûüøn —Rƒµ"š6¾£÷=7émž7žs™8ýuï¢ä]ÎEzÿ¡ úx‚+ž>à<¿°oN+7_u¬_Ñ<©1ôåÄ„ø…þar™ï>–x‚kÒo “—ãôÿÖÀ_¹”3^‘ÞÂɹ) xÀ³¤ÒéÚ 4)£¾0Ê¥-Ê1êíF5e«^úŠô`¦x8’÷ãyB ¶¦·•œÅT× ;{¯ƒ<´¨ê©•¡»k•Ÿž‡«/ƒÖöS.ĽŒÈY£g°(•ò™T xC«ÂÐC.'9ö%¸õ"*Ûó!+ïdIê¨X+z¥ šÞ„MO®ÃnG‚ên¤úxЩˆ»­A 7èÃE¡¦¶½ð‹izþމ?γ¯¦uÏ C£7Þ‚ b¦5Ÿ¶—.•ísz _P¸¬l¤E|f[¡¨«W‘¢÷ªüä û;cÙóôÁõ™ËGKIï!ƒIkÔ€¶²=»SÁï(JŒ?föÊô4Ìž&þÏð€9înjú_Jt ~Ç~çzôV–^Ge_\Ÿìß¾!¡¹Ó]Ã/àãl*moŒô?ðr=zùq v¦ü‡cÿÆmC —Dz±‹I Ã4Ð!žFJön©Ãõè¹`É4öôž·tqkâýqŽ_ Êù^„2Kßà(ð÷·÷²òÖNmp–ÀùŒ­uTÒ\KÃZ€K—¸ÆWÜ<\‘B€g%e÷ 0Ö¼ 8*3'‘YZ•#'N¥Ð—>²?“úX]“ÞõmZìv‰*FW·ô4sŒËSG‚^l`?ááIÂÿŠzä9’ë&B©¸ÁªÑÙýÞ,_ÓöÜì`ŠVìþIºa+̽ºÀ¹¥›²•êúÑðžÞcØ&ÃcI¯%æŒçs£ÃV8ß®òçDBØ´µî6Ú{zˆ‚'èj!£á;ôºî®x0ü£ÑÃý£< °S,ÜE›UÆVÔ!˜Ù:^uÞËà¿¿ýç{D¡÷‚clþlzôžqš,µ’¸>=žÏñ­Û¢€Þ ý‚¢3éýû· Ò¨øjôôxR4ÞÃÇM}, ž¿Xs=úDE¨sŠ !yuz>6< &§í4_ýE ïü€Þ¼{ý¨ô¸¨‡È~›zƒùoTXç8kšÁ4s™W·=Ïö2ñÝàriÃ9Àeä hß™\ÑÁþžèLŠ®ÇîB/"Yy0¾=‹Þ&¸tmÖ™SéMèÕÄÏ/k)¦¡%à ±gq©ƒ6Øf»Š«qmzù­„.½»Ÿ/F ŒõqÇÕ3£Õ¯MÏ®šö­f…sBz“¾¥•*oÚ¾RÉ%2¢ZÃó¹Â s¶~Фߣ­ºî´½èäAæ}mŸ~Žé –LÛ‹¢¦í“¿46t7ÙëEWL¢ôc¦_4X‡›¶O›¶OºØô|ª¡á…žF“¦®'b]Tç4ÚוVsâpsÞ'=5 <=Ÿêi(&imWÌÔµ£+ÖEuN£}]i5'7=?é©aàéùTOC1Ik»b¦®]±.ªsíëJ«9q¸éùIO ßÁóñÆ@´d³Å›b&É{b,öþ€¶ÇÇÙÓ!kœ%NâhzY|¢$<]ð Òó¡z02íüÅ<_l”-üTýàÅ=Ÿ1€6ºà‹Ó˳½¹æÓ9 ôëÂ#¬ùœã:È/\øà/>ïM2†VB/nzÃùQÙ`{ÈÅx-zOú³KiûaU5+FW{€y£8Ma‹LS¤÷'ãp÷¦w(Qœ×d¤f¯NîÎô^Ž(NO^otâ¤xî¾ô¸˜•ÅñmFªvêÄáîK@¢8q³ìÐ(ËÜ•ˆÃÝ•>J##¯BY'}TÅVdÚ~KCëåÑÕî:Qœ˜³1+ecEq¸ûÑkˆ(ΈôºáHýºNînôQ ‡ãÁÔ8;sâØ÷¢ûœr_¦úÝéÍe8NëåÞôqüÓÄ?³U}Àóå;Z+OæŒm~ñ®#£éäß.{ˆ^¾ƒ‡ªË—‘ÖŸŸï׬ü ·œG§wÖvßÄ ßP_§÷ßÖòß^Z÷„G¦·4£úêÙ.zߎ]ôû%Ç…¶çðMÔòÛ‡§ÐS âMšG¤§´o ÷>•^Ü€}VXªœ[g¶·þë–—¦w>+à®û§gMÐ!ê6=*û0þõd¸•Iæ5*žroSô«™Þ¤w´þׂ’è6¨AŽŸâéÝ(ÀŸäC 7e­óô‡å¯oߕȽ¬[ññÂ4én½*”&U·E 6ÀÛÓº]Gh'V7s¥F̺ȼz>läg“^À݈û>³e©…® ¿µ^dÈHÒìãKl¶Õ|4¸­Ôô”ߤ~öÑK;Ë.JÓ»4Oªó4Œ‹¡ˆŸW²$E_|ßðˆ„Ñ¢•­‡Ó6=œ¡*’/ÉüÓêámóËé€ôÁó‘Az âè/àù"CFŸ‡T!^€ž€†õÓ€‡ÖoH€ÒˆíeÕCSG¨qpôèèLÏwSQÑÿ­–ÑŠÝ𤩋 ÞhÀX–0¦SBØýÄ.¬‰ÑkEèõ A¬zëÏݸ =pÒð. ”.´æẔ_?ó½ýkƒ>>ŠjÓöb_ڸĒÑQ. <=æB”ë&ö¶ÇÃlÝפϘAêQÅ<¿ü'!Œªpõhü­ o{.=ônj¬Ød•ì¥û7κHç*Wí®—¡vŸœ÷ò0ó-z,{[ôMOçJ¯H¼‚Äù=~¥äf!®tnÕsϳ>Ÿ¾O ÔbÃäóêý‡›ú¡ôŠªH“ÞÑ;©7é«Qµ¤ëÃÃüžYµÃÜ×ôîÇ;b5ºHL U9TGû¢jÒ ½—ú\ú5xn]ª€ÑÁø1pê›XiÂRŠ%bídä ONDómz7í{#™^Ëo¿eôxŠŸR «‹ÔÀì‹Ñû1±ôrá=nÒÿF“JšÐ $E@*[ë$Ç¥W“Ó3HƒWçgG̸˜ç»1Ù'€øã[ôÅøS£B¯üeÂÕ)ŸWXÓÃû±`ÈšCÞøÄ”›önÇ$£/YeìL&Çò*$Ëj ŸÛ®Ÿ⸺7ÂNüKÑ»iïÓNÔøšíŒß Ê»s:¢‹Íb«¼Üekzœ…M¬ O‡­ÁÎWQã¥èÝÉÞ„Ÿ‰ C®Ð/¡N}LE¾GW…§"æeÅ®RöxbNBŸÍ K/qñw¹yïŽÌGüéŽ>}ŽáÆ×Xhb"b² |‡n{y#üMèÅóiqZ ¸.}Àó2—‡ÐÞuX–ºt>> wÓz§qCïú0Ûzô‰Ž$yªÈY˜níª8:¾§7ªìZQwÆÃHž>\^ Ó—†TB/Å&€ Í“% œÁar´Eæ^;„‘H/—ÙÎdƒô°£É%Ì“Ùt_[«ýŽDœ0ïýÒ)™ø@'½h¢¾Â•_Ìx÷”OeYF=`ìtÛ,Î+\Â}¾ÛÐËÄÇPT€¡º»ñ‡øï^Z£¥®é³b]u5ž]e;-œÖÑê(­B™p2V¸½È³•öüŒ>›ç}VÚ­™ol¸ÍŠOYdÝ£½“÷ýŒ÷«EX¡—_4 7^&–äe*{=jãœWðº×õæg–ŠÛanʬO?¥®ßéùiŸrë—äõ²” .—Øq—+«rÕ„Ûëcp±9íŽð·Icþ=¥pÖR‰¥#ì^éÛ½ýýœÞ‚Vÿ)Ìé廂ë¿g½ÃS²4Ź­,n§­ßÙäì·½£-72z'Mä}%=Oc!SÇCÞÀýØ.o2 ôq‰*vIðZ ÿv‹žÃ’šá$ÂB£Ç“øIè$|#÷†tøø¥–§ûé…s†ÃúÞ¾Òc¹xõ&îy#m¶ö¿Ý’_KÃw1í7{\¯oYl½íÅKáÿ‰ïãÖ øñã¿'ºw-,Ð?ëBέ߿嶎Þd(Ž8áá$Ä`jš9–]}çÉ3Ø!Kªêéñ“X-‡”ßG“Ÿƒ´Ÿ¼ü%ty•ÅóCyɯç¯Ã¹ëM¹ ²{%Ш¡=Ž.ÿnÙ;õfT·‹†iFÌø=|¸ÙÙeÑ¿‹ùˆÆw²;eÖ«K.žÒy=!ŒÓM—~´QsíSšÁ&W:ÒôG?íãðjH™à9í-þ_ƒ~iD1ÊrÍáÿ9þ®‡À¼%ý¿b+N{c¡†åÎÊÊWŒZŠ+çÄå¾1>œ,¿yXܯKÓýWcØÛe‰ß÷†ûzYäÝSžçN\£®€Éu_t·Í˼L€çõ‚Á]Oxþ…æ=O–Ðå½Ãšßiz'à%é.ï ÎñWýÊ—vüN|%ä<ÛËþè¸E·Þ÷Äéß}™õŽjD~œ¢F'w¨GƒßóÌÖb\õ{š>4²üä VüöJX¿^#¹£ÎöÁ¡{×ý^™+ŸáîÝû/¤ÄÆñÞ«z!°J®û½6½[ïUÓˆnúý»†4:ñüñM¿³^X_Œ>~ļiÈt¶óÅqÅkV¾ÌßýMžÚèD.c/Qg»ÀúuèõÙ.Ð?¿ëg[–´yÁL~.o˜×wAÏz½]¢ðÁšÈ²ÙI[¦zîÙ@O^÷•uC>¨IÀçg;§/UÃe<Û+MLü/câñdWl€o‘™VæåL+ÛvÑ‘B6I~ôLÿü®1­YÄÜ'mb6éß{¦×îA==]Hžo@LÛS b{8çÛ~BÃÏxb#3ŽüCZ ½›ÿˆ }Ðô ^%Íô¯ÂØç }¿ôÅKÄñß_²‹'ô_Öøtü¯ëúdßr|ž%R0)úì±?#†aú÷Ž-îÉs·€^Åqáf /¯þtA°-¶pÁ›ønÄ­ö~Èè6y¡¸»ÁÖ¸Üò?°ü{!ÊJ ·˜ð}&9øï „@Ÿ® ŒcÿônÞc¶ÓîÔÁ—¢Çâî×|®wîÀ5oùŽÏeN‡"©‹^1^àÉW$ÖLn‘Ô5g|j`j`j`j`j`j`j`j`j`j`j`j`j`j`j`j`j`jà< üù’d€endstream endobj 15 0 obj<>stream x=»wPÛY¶ï뙞nc2B9'„’È9ç(2!$Ê™$’!rÎÁ6œÛngw·ÝNØÆ¡Ýî0=gæLMsëÕ{õnÝWï¿í¹U¯jÕ.ý~BðÓg×Úk¯½ F04$‚ EQC± †R}p_a}B‰t@0"ƒÅc°$$œ„Á‡ùc†CÂD |_!¿Ä!8Rh„Á!(dâì„ „ƒƒ°¾Œ/„ÂÀÑX -Œ“ÇJ¡#(x2…€%Ô03 OcÀ 5‰ ÅB( ƒEÃã0h ÁbŒ*3ŠAbÇÓSsãRrb©Q¤ø¬˜¬¢äJn1_\WX‘“ÂLÉK.­+ã4ÕV¶‹øÍ‰5¬âÊäzA‰ÌÈíoéÝ”Y¯Èm÷e¦#ñÀ»¶_D}¿·öþÒÚ÷³¨ÿ§¶Á7ÒײÁc…éµÜô®­ïg¡á­¸÷HÞ÷½ºïÆë?>¢©$ñobP Ž¡CaÔ `‚/ !@pAPL(–„Ãá‰h G¦ãñ0:Ã"aY¸´O(Á†õEùÁQÁPT(š€A`‘~_ÄéPbP0Î/ë‡ #qŸˆ…Ñ"âãRãRY‘у†c0!$ ,œ¡E È4†JGbPt0Š@‡¢1p,˜8$ƒIƒ&B)‘ø¨$zd"-€¢B≉™Q` þ: Aˆ$Ñâ"br2Ó*+Òjë*j¢9µ±M¼ŽrÙH“aWlº©´©‡~U ý‡Òö©é©ùw‰éƒÔôNö Ú+ÙÀ+Iÿkqÿ‡–ž7’¾Šþ47Þüí# ƒã`ME¡iH §†BÉ!~(()8èó „Ùø‡øÁ±è?ûÆàü0Ht1„g Ä  òé âáN@yž…ð!8 1(6$ Á L&3***"‚ŽÃ"‚‚}`<Š%C©LM?>‚ †á p,$„ÂÂpx$ ‚û¡¨,Acˆ‘ð`j¨1ĤÜv Ï@gÁÐà0R(2 žÄʬ.«’‰+Ò<0¹¶)µ^Q*µ7×%–JÛµãg… €úMnýCfù]nù 3ÿ$7½• ËßJõ½ôTƒt¦›oÿãc0"@Ã1h*IÁÀHˆP"JBD&³£3ch±4æÑz*yЀQ#ÃrIÑIÌô4t8žÈ$¡}d™I„á°á“™‘Æ@E à”ð.‚4Px…Fþ t‚†ŸDB‰tš„ŠL`Åg¥ Ã<4Šƒ„b‚ÁL!°0, ùCÁ`„aBL+€ŠÈ,˜0¹¾ÈS¤h\R~,=„¥C ‘B ‡’C‘t ;;>¯±²¬­)_ÀMoà–HôÜ·Ø´)1_’Y¾WØÖŸÛÞ‹&ˆÌoæ7JË[•å­Òò“Üò+ð\…é•ÚüPo¾õîï!ˆ`8ˆ¡È8(‚AcÑAx #9.&;…•Mˆ$À) Ì© ÌI,Kd§%  ë“‹*È1ldö̆ÂÒñ –NE†“‘ -‰™GŒ¥â™8\ „J,FG‚HE¢#±”Pà€p|àL ÇÓÓróókêé‰I: †øÃý>©Ž „ú„ á§?…8\˜Aàäh:£A}P§ðQ¸¤Â8F2D\ 1‘j0< BŒ!DçÆ&s2ÓªóÓkË*äêÆn{ëÀ¢ w§µÿºÒq¤wÿ¢qüÂ0ñàk‰éLa9Všß(ÌïÖ_€Ÿ*Í/5–Gí–›?ýçG&‰‡¢ˆH8 p Ñ~(lï‹D¡ÂÃñ,:–A@Ò``!ðE~B€ÄfUqšûåƒÅ1"3+¾¸(*7“ŽÀ£ÂÀSˆL$™$ÐCáä@8)†!³؈H Øœj!G¨‹Ï¯&ÇÆ†’1!x uÄ¿¹C° øÀ|NC¿Dù üü‘þ¨p4-‘AM¤ã£‰p8%!,­"-±(ƒÇDÀlÀ1?½ %#ÒèÌ¬ÈØ‚ØÄò¬b‘ NoäǸ³|ÞÒþH?òN3ü^j}#µ¼“š_Kͯd¦—ÒÁÿŽcÇJÛ¯@u€˜Ö ˆÝÄàøÓ¼?  „B ±þ(’?šr †‡‡1q,€†gS´âi ¨a·¶Ù6yNÔamPh`aÔ/ AþXL ‘ÌHÍ)áËk%Ý¢ÎJIOiK{ §‘™šAb1àðn0õD6öiEƇ èdXd(%šUÛ¤uÏ–53*(q±(Àf`d( „? ð l `ˆ òEø ÀÒ—Ÿš\žƒ‹ GEQȉ©•Ù¹u…á) x8ŒC0B:R4Ї#š ÅE!(‰”䚢™¤¡ÝÔÐ>Æ7î(‡îj\/dÖ#¹ýXf{-·½’Y_J-/€n`ÅTÚ>ŒJË‘Æò½Þ|ýÝ?>‰'¡ø¯ƒ1¾hðHÁæb #àÔ8•B¤!à þh? KdæfW¨eO_Õ¨l‡Pi§P˜@R8‚‘ÀÊ®®›T¦µžÑƒ¾ñËÂιøbqZI3)Nª ²0¤(°¸@‚pÁ$Ž¥Æ‡R3sëz{F¿˜¼'ëߨ“÷Fç•ã“#ÒÓi‰q€*œ‚q„q(!#üq¡~X(1Ž•UWY.jÏL¦g¥0óÒ õ\8µ*ЋÊ#'©IFj8#-ŒƒF3 ˜ˆP| †šÎLk¨¬Vé;\m;£ß¼¯ÔN@é™Äúü:Û ` ¾©í¯•ö·JûÏ@uJËsõÞr ƒQ¾€‡ù ÂÁ·ø*4ð4%Gâ¢ók5"cy³&*£ÎФý(_X8™]hš-ªokÖüqÔ 2ã$’†.®– ëí‡]îo;·ÌÓO #÷³«MÉùÍñ™Åa1102*„ˆ …~’+ ¥ÐðìÌ¢F£Þ¶ß5ü­|ðšÊz»Ó}‹§I¯ief—År‹ËÃ’’áÔP*–IŠÀEG„ÐÁT2;?·B&«×ês›šcJÊ’*«ëµÚ¶ÞJ…$½–“ÈÉcç'§VäæÔæ%–$†'‡á£°ÀCñÑhF63º4£Z­)wV+Çz'¿3NéG_¥i\¯€©‡UŽWÊ¡WJë+™åXn}ûIr4Ö{=®Û?ÿëc á³ÏCN| ûK0|âçT ž[+·OÌîÞó®]é,QiEÈ0’†‹ A3Ôøü*atfG(M)¯Í­—¶t׫F:ÝW&~èŸxÚï=r,~0M½.LeËâ3Êɬ8BÂùŸFù ÄGfU*µæý.ÇmùÀMÝУ÷‘Üz«cäOï*nîN]*T¦”×€ž–Ša3)I ŒŒt\l6&1³ž/tjÝ3âW™¬˜Ü>Þ;³ªtŒÕë:ËerŽL\­h«Uˆªåü2AuzEvd:“K $‘(i‘B~¹¤½N=ªs^íýÈLãzþoh/€ÞTÃ@c/–£O¬¬ÇRËs™é¡Æz§×} ƒPC¨ÁDÈçÐ@8‰ŒHDÐS›TC3;÷Ö.z`]¼«rì‹Öõ#‡ƒKwzf¿Q ï´šÓçÅÖi¾ÑÕfr‹úm¥"y\1‡‘™WœÄÌa§T” eµŠ!™él×èýnø»¯º&^wz;Æ_ý›PÚsÀM<Ôq¤zÜå~`òÞþí|ô'°‘)Ñ…uÕ²¾~ïYYÿLykßØê  1×ü…nÛ,_Þ“YXM‰ˆÅ’ÂðT*R^ d|B^~~½ «F\ÐdPZvû&ï¯Mœ{ß7}§µ£¥±Fa-®•Ò£R‚áÐ@d@úô)è—>°@!Ü=Í9û°oäGƒûåà̯ÝoÕ#Oº§_uŽuŽ>5Œ=ê¿o¿Ñ5z¾Ý½ÝáZít¯¼ÛÝã;bÓ|S×´ÖuÞºúÈ´øÐ¹þj`ú‘qüAßìÃÁÅ'}ó?tLÞÕOÜ\ý¡{æjçÄ…ÞÙC­{­VkÎæÊ3šŠ9 yiUeÙu‚*‰Ec?°Ì=é}h˜xÑ5ñªÓûò±±@ijçpOùÐ €Nç|Ü=rpüæ/ÿý‘_ÏÙ»Ýû#›ß®?PYÖë”NžÖ-ê+ç·ÇfU#âÄp$Žˆ'“ht –ú¡ ÈÓ€ˆÄĘܒŒ*Q‰°¯A;¡>°.?po?”ÙVs„íéM’˜ÒʸŒB<%<ÅÀ `¿ùõi¨ †Ò¬rY½³o±Þ‰w=3oÛ'÷̫ϴÃGÚáõÃ`êïZ¾æÙýβpżxűvghí¾yámõÙÐÆqÿÜsëÒ[ÛÂ;óüÛ¹×Æ™£®ég]ÓO»çžçì]zdÝ|âÜ}:0ÿMKÿ\™Ô\ܪ©Qð+ÄUY5yÜV­õÃÝ믻!5.&žÆCN‚²?<0*--¯†2OAÇG2$ê_Òž1NŸã÷ e ©ü*vq•ÍB‚l $íè“0Â×<ؼ—ŽL+”ô:nŒ,}^Ù7ýv`ñu×Ì£¾ÅW†ÉÓ7Íýaš{?¼ú(væàÍÄÞ“:í·}Bç4ÕÔ3P®–Vè…YÍ¥i1$: ÷|ÿì¶`8Š‘\Â×ÙϘçž'ž:–²-¿íšþδˆ½·-ýslóŸãÛ¿Oïþ4sæhdõöàø9ûü¥ž±³–Ùkží'Ε§ƒÓ-³Göù7æ©wö…ßK¿½SoŒÓoŒ³þ‹Žé§Ó?‚Yè_z:¼õÚ¹õªoêŒ-Ý=|¢FªÔZ'Ú‡¶T¦3öù§Ö¹ç}O{&ŸõN=ÿd“/€õL¼®Ú=yÜ?ûÆ2ÿ¾ðصpçoÿçÇ©¥û=öíNób‡mªNªaçfؤD6:œ‘ÏÊL&FE @E‚N¤°¨d&Nþx2èÀ„A°ÒÒ4ÖzY{£r Icív.÷OlòôýQ¹L\¥i©Ê†Pá°Ó~´PP<ƒÂH0x$…¥æ¥ÕìçuÍ>]y7±þÁµqlY9?óÙ½¬¼ô,¿r滑ÉmóðÄòÖþøüF¿cRÑåÒôÌXG/N-ÿ8¿vä]<š\ýyj÷o#«?yw~Ûþɺòܵûzhó…û̽çfÿÜ#ߺÇØ^y·~wÌ?äÕæ‰¶îQ­mÕ4yųþhbû…cþ‘{ù9@g™yl}âX|9¼øÚ>÷Ò4ý¬Çûƒeþ©síÙèúÃÑ¥›ü‹9ªˆèB<-ŽCŽ¥£"1p&…fæDgÖ󪓊òñ¬ˆPd°vØ{ÂI`Ï*bÁP"–Íû LN}r͵pÎ1s¶­k¨R¤m3šš;º¹é0ls>mülFžJ¥HZzxËi×LÝ9r¾žÜý0ºôÚ¾ðÈ2ÿƒ}ñÙÔÎ;ËøU]ïŒgzóàâµýýs+k‹ãS“Ž‘qã [Ý9¬n7¬ŒŽ^ž™à]z¼zþ×ùsïfϽ>sìÝ}9wø~dû¹{ë™çÌ«™ó?»×_𦙼†f_Lmý4¹ýÔ²üttùȳz<¾öxŸÈoþG÷Æ‘w÷húÌã©»ÿúŸ ÔÔ`D¸? ‹ QTR…”H¡$‡Ç¥6w(Ú ])Åe”Ø„”¢Ò,N+%ó‡AdP¢ DÃQa8‚‘œ%é49fw¦·¯´Û'ۺ̓s­Ý†".â‹G„X ŠÌ«kJINdERÒØ pTÚÜ:vîÞÈÁë¹ÿœ¿ò÷…³o&Wu;EÝs’Îq§wkëÌÅÝÕµÅÍUçØ°Õéìè5·*ºêø:®À T9 }óýCÛö‰K®Ù+û/VŽ=ëgϽ™ßÿifïýâ…߯·'¶Žç÷~^ØûÉ»q4³{¼yõç…óG+woü¶uíÃÆ•k—>Ì;oMnh/<«/½ë€Ø«Ñå—ÎŧÃ+ÏǶ_L{5söÉôæ@ † Ç™„p‰I£Æ†‘ã©é̤òŒ\n… £¯ëέV´(®)³gAÜÞ›^Xt2ÐÏ ²‹S¡A¾px¢1™)¹Ò.óúá­Ù3—´f§°½;«º6' @7„Ÿ^ʱ8Ü'..’ͦRi”‚ò×Üåѵ=ûïF·ŽfgöºÍKý#«Ó+ç×Ï\XßÞÙÚÃÊÒòôòÚ¬gj¬ßjÕt÷Èu½RuDnI ÙêZ>·¸}g}ÿÉúÁ«ó7ÿcçê{7þ¹uõï‹ûïÏÝüçêÁÛ½›¿}óÿïþ±wûoÛßü²wûï÷þ¹~ùç…ýO›ß{={æ5ÙÄæ‹‰ÍW“[€Þ±wãåèêóÑ­—Þ3ÇÓ{Çÿ?18 £PD ”µ¬°ä°äÒô:… ¥«³D á´ê;‹ÞõëÀ¦·om_ý¾Çî`§$œ ö§°˜FÄWA!Ah¼?POh”jÏ\˜Ú<Çi£baaa~‡x“„¼&—ö´”]YÎL»Tt(™™Ë™ñ^œ™ºÕgßWª§ìÊ—ÖyfûÂÂÆöÚÎÎÆîæÔ´glܾ¾>}ùòîÅË€ÞâäŒÇé² ;L6»¡oP×iеëgfç½S‹&Û¸uxeeóÞ…ë¿Î­?Y9÷fýüOnýãÂí?JŒ Ë™+Ï®}ÿ;ÐØò…÷ëW~]»ü‹wëÙèÚàËóûïÀ8µûjrçåÔîñô™×3g߀qb÷¤ÓûïföÆÏlÝý¯ÿõ…GâÈP¸E˸ܨ¤Ò¤ôª|®FÞÚ=P¯î“ÌŒoÞ_:|1¶~ß³ñ`ûê3›wV¨‡âð1ié¼69-*Þ† ÁCñä¬ÒŠAרàèxvJ¦bq~(T‰`E6¸ƽsÆÉ©¤‚z*ÍÄbY”¨øÔ>ÛÖ1ßÙ1ÙÕá\žÚœ¾}íÂ̤kÄiÚX›Z_u¬¯N¿üîÆ7ç®]Ù=Ø_÷§§ÝãŽé™±Å¥©Õ¥Éé g¿ÑÐcèïê²è;‡]cg§¾_½¿´õãþÕwó÷Oü ù'|eznëÖìîÓѵ§ã›GÀl³l³÷½[Gs{oGVÿo ÇÖŸz6žÛúä’ž—£›?Ž®Ý[úæ?ÿ¯0”ß§r(!…I-IdgGÓÓã y…Ùcž=œÜýLø,€Ö”±ÕÛmí}B•*«´¼Iª›[kV"Šñ… –Þ¢T9&½`É-œ Bh‘ù"ùÀÖyç¹Ë–á©ºÚÆ¤¬xF*OŒ`ªÚºD}ƒý®¡‰±ù 3Ë#ÞQýÁªkÅk²¤.KçÊŒ{gmêüîâæâعõ‰ýÍ©­åѹ Ëäøàâ¼kgsêpwÁmîV‰š,=Ý=½-B à61½5·|a{ÿîöùÓË—Nœ9ñ%RÓéöÌ_]iÕûì`}¿3à½åXøÁ¹ôȺ°¹¾÷Íôê^~EÁâCqØ‘`iw³oÈÎLLò‡ú3•™QÙ7±;søÃÈòEïøš±»'¿<#6ŸMÉ¢ã¢(ªVåH—uÂ8h7*Ü‚Ns¹E_¶h[Uµ-åi¼²Ìúâ¬ÆŠƒºMÒP¦T¤ }J^·’Û¡àꕼU“^Ìí’6·Ö–ñkJ¼*‰¨Y§WIdÒcßÂúîÒÆÁÌòyß Êé@ªRëœ]¾íž8èýÎ2õphîÇ~Ï]£ûFïèÍn×UÓä`€›iòö€÷fÿøõノ›Ž•'¶Å§o x/Y½ûŸˆQüH‘È$BLvdTvt\Qf¥D®šY¿çÙ>òn¿w­¾ólý¶tñ¿lóGµ²IbL#)»Œ'3­nœ¿?·ù ¨lÀ)Lpfé ‡²Sâʹչe¥Xj¸/(²²²¹|³gâæù‹?mìþàÝ5ZÌuâŠäê8J£D^i6:¥šÞØtsË^i¨$êòˆ­Éø†D?+FXš×Tœ_›Šô y²šU]‘¦¡XP–QW˜Âåä˜%ùMeÅ‚ªÒæšâúÊœò’äâ’¤âò´’ÊU‡ÒéñØÜÓŸ…p¹w^‚ZœíªÎþ­ÆzMe¾¢³_ûNçM­ýJûð7ÎkNP¸¤s\{0¶_¶-<6Ï}.µ–i×ä_ÿû#Šæ‹L.dÔåñ8Å|0OZžÞ)èZlí>Ûj¸ÈÓžçë¥}ßTˆW‰ ­V^hX1*?§RÙªùdES;%*#GùLˆ F§%Ðc¢aX2 žžÍ««±©Õ[½}û]}kêžaY§NßÝÚ?,ÿöýµ‡¿?|óêÙ=ïâ¹$Î66|‰ Äý©'¡L!Ë3XâÜ´¦ÜÜÚ¼B^i¥¤Ž[W—ž,ÈÏUä‹+‹[«ËEÜza]m—Tªjæ×d¥ÄвÓèÙby…PR*RÖ4Kë¤jyW¯™ž:5}ysóQ‡a»M¿+hßkÒžiPmãi7¹êõjéW½ÆÕ¬p5K êÅzÕ\ƒzž§[âw® ºv]ÛÕ²)®r¼Nd{ý×ÿ—`¦“SŠãÀÕ ëkeªõ (Vˆ'«¤«ÕÒ]Nëv¥xp+æÏÚJ$á)•a‰5ñùÒ2žY¨™hR çWK@ÉñThh Á!BP(†‘QYÓ%UlåÛMò•fý¤ cP$»:Äç,ïÞÜ~uüàáµ`F¯á ¿ÿ*â‘üÜé¯U,E•‘$Í˯Í,ÊÏÉŒÍÌKÌNeDe„3*“šr³…¥eüòjne§¨º$3· -µ =©ª<[§å ¹tf‡JÕÍSu7¬z×䘲Ýxâs(›’–)ªk®Ì–·,—4/4N+jãdvÝHaÓDaÓxo,;’Ûàc!´X8‘Ç+löfÖZK›íœ¦Á—¿ü?¤8p¢‘RšœQ]X*læiMí®Z¥·RºP)Þ¬–ìUˆÎVˆvTçÊ„ó‘ÙÚìúî´*uV­±k/å»ê% WqC{RA’rZŸÐ `46œ•’‘ÕÐ,rµ¨ÏÔÉv+¤KÍšI¢OS^íHÏX©)¿»¾¸Ûhïîvä•מ8xâD( ›VVÛ_Ô0^Ä[VÈ›-jš+.– ŠšfKsŸL8SÄŸÌoÏmËmÉåzr½…üÉìzG¹À]%°¾ùëG\4Ž›S_RÚÒX«P7êM@`¥-£uÊíjÉÙZÙAeÛ¹r!@·QÊŸŠ)ìÊá ,@¥µò¥rÁLeËtØËià«û£³òCÉ„S¡!H=1£²¼JÛ¦[,—m•(ÏräËJÉøtCïF|Õ6„± M-2–5·”ª¹‰â®°­i(¢x 2¹#2®#5»»ŒßÁÓË… \CNA[l'%±ˆM‹sŲ&…Lh4´H<¼ÖA‘¬­IÈ‘*ùfGï°Ça°ô´ôô;²îª½”ÛŒ¦ý åO¡Ð¤¸¬biw¬¸y¥¬e½T¸RÞºV-Ý®‘íTŠ×+ÚÖª$ÕÒM`œ¶•Ò–Å¢æ9`…Íóe­KŸù˜…îÁ*G´YÞº¬J²"ð&À°¢ Û_`wÀå'“lÖÊ·9¢ùFåO:þþ?>6Wå5Uð‹[ÛÊÄzŽÔT«œäé·@ì*îÔˆêe‡u’mžj[¨ÛhPÎÔj§9Ê©Jåjµ|„¸ZéN½løx|ÃŒG„‡J\a(6ŽËåŠgªuçë:/ók†ª¡3Ì–}ÿ¤é/PÝP‚ ¢ºZ;P¢˜/âoòšø¼íʆQa£ÙX©²V©´Uúú}^iwn½¥D4 N© š±Ô$¥Ú* 6‡ ë†K[W …Žn§ql¥Û³jëvô´hÛy²žZ‘¹´a°¶e¤¤ÞÄLáøsÂöeäkX :2¶ˆç*nV‰ÏT¶í‚h^WÜÀ%À^ºŸV+Û«WœoÔ :”ÿ†zî×ÿüX"UŠÊnaߨԶÔÚ¿ÖdØn6\ Þnµ·@ØoÔî6wlÖk¹•ê•:í¿ã€¯?ߨÞ)áD劃ˆñþ¸pr\*5.5yJ'Ó‹ëDcçZz/jzÎŒH§24ÐŒ¡@º62¥š/)í÷æwîf·¯‘ܬ]+mK+ý`A[gN‹¤PÑÐøÉý‹Å“Y –Ô¼6!E¦i–ð•ËÕ¢ÕfýyžÖkš4 zÔÐÙ 3V -µ"¯@µ^Ó:UÙìNÊ—}@9ñgßùâë _vZ>xZNÛV­b¿F¾¬^uÀÕ\hPòt—µÁe¥ü\¥ä\…¼u«¿Äïº"ê¹ÂÓuíÕsïÿócl„£iìÝhµÊœ×î;J÷÷J×CéÐC‘åA‹é^›õ¾dèn›íÛÓ¥æþCÑÀ7*Ç=¹õ†ÀpF2pFaÙ*äõÀ³Bȉ§QŒÄ†FEODjéŸ@_A4#­6oë½l=oÑŒ®6ôÇ4 ¹=YmjõxUÇrQû^™ö®ìV³äÛFÅ5…|g´Õ-Ã%ÛhÉf– \S̵—´,qeå:&9¿Eî©—/p•Š®ëjýºË³á˜²J ü²¦zŽ@Û «i›¯lYVÚ4VÞdÉ,•°ŠðD–Ó1qåà[«u±¼y\<ðmj¯¹ûjf_Ø{½µÿ[ÑÀÍ&ãuAßÍúŽ«Uº‹ ×ê:¯Öê/óz®·Ùn .‰Me{:Ó,×­×Ï ÌWÚ†nŠ·E¶Û­Ö;À$Žmö{àR2|Gæº+uÞ_o³_WÝ×»¿o»Ý>rEiݨWÛcò¸Á¤¸Sp‚–R!h×™& ê¥Ád¶š ‹£§s[:'-ÞÏÈò®ci·Û³¦Ý´í€ô¬Õt®qàJcÏ·"ýM‰ö¶¸ãv—þpVäéÂ%{1ôö`¬ÛѪœ§™Š®+¥i2::C ž¬×or¤\å~«Ìiè7óeõœ¦B®T&Ô:š•ó|ÕN³fOj<¬hu·ux+ùê:ÍNyúÝË;¿[]¸ÞÖ¾&5#¼ªº%³ÝT;ïI­ßòZM×eCwÚ,·š¾šn4õ]å/µ˜¯KߊíWäöKJ˞μùö˵‹õÆ­ëÔyMâ¸Öf¿&º!¾)sÞ&wÝ”»n(G¿Uݦ½©qÞÒ:nt]7xù#켺`rô)õËPrTz¹Âà´y×¥]Öèœ2\Ø_B0~VGÚn÷M/ŒML{FLJ‡Ü½ƒnQG0¸Ô­×Ñëw®Ú&/iL+ÄÁ57¹±kuRä¼ì4³Áx}ïÒòô–{ú@gY³L_ÖÙ6@Œ†ÑývÇ™Žá³ÒÁÕÖž¹yD¥u»Ý}¨²ïuº/€w;‡64½“ü÷GñÀœÜ¶¬qlª‡7åæ5ñà2ø”ܺ¡uìê\g5CÛRóªÌ¼¬ZU­É-+ÀU–Õ–®±Üz .:ÉtΈ¤¨èâZ®DoÐõÚäý²Žž\‘\X:|QD\t|Qks›­Sííuìz&¶'ºÚëZÝ­½Kí“Kƒ+£Î­~Ϧ̳¤6{¤™µFFZ??™“?Ûïê·.KûÖ;íg¥#‹•Ô¨ëS{·$c‡Jï^׸·QÕT\ŸRV—¢ëS­–v“³Ï9¯èuµvô©úû ö¾6­ öUË s²²béÑtv*=¡ ¨N’WÕZÁW—4ȸòž²«èo÷q„íå}ƒbX¥ÈP-î«hੜ5m|¹‰ÛÚñëßÿoa‡UÐekétµt »œbظw¼ch *©'[ n±Ñ¥0y•ƒã­'Wc©SöpÅ”„_4Ê=K¬äX¡\ÖªP5µI9\^i]CycCvY#>ÚŽè ÀŸŸ”ÃË“…v‹nXÒÒIOšˆ)_ÉÍWjíbƒ¾s€×Õ]+•ŠŠjÔ‰™b<ÊVZ hn­lÖä65ÃB¡"::¶^¢TÚÆ%C‹¢ÁqUO ¿¸° õ‹x*zâ 0~%2Ø´˜$MЍ8jLJ|NIR~yTz;½(2¹$¹ ‘™\œšW“š]þæýߊ¹µM¹U¼œš¦nkE‹¼^¬©—é„OÕYÝ¢(jlåð%õ2mXUÔØ’VQWXNKL-R§áþ~?ÐxLa‘ 9…i9Yyy)¹9¬Ä°ÏL¤E†QñDb<<ƒG'FàK“#äé‰fVüb(û"4õ2&oƒVäʪíå eÍüúºª†ÒRNrB6!¸*1<>-—˜VPÃÈá””FÒ)%e¥Üæb ²†–æú–¦¢êꔋB¥¨»d]&C›V.íT5ÐáIAÐcàúìD‡ŽûòYyÀ=88îqÏÎO1Ù‘Ÿ}þç:qâÏ'|NŸòó=àê †›$,•FcÇPY‰ÑÉyh 32*™“øæíÏ%%‰¹¹ìÔT`qYY©……àNfi)0ðܤů‚‘”‚‚„œZ||dZžÍ‚QAÓ,ˆòýç &I ÇÞà0=*!Kƃ†Ø°(*†„À¡ø Oí0‘pXÊÆç !m¡Èe8ë|PÔ–?s,$¢;2QWX$)/®.ÎIM‰§‡a ˆ/8dþë0"!·ðtËÄ¡‚ãØ‘Œ< 4“ªóÓÔB·&ÓdÖ”–g–Uæeüô´¸L6šÁÒýa' ðD¢´¥reÊ}çÂᙥ¥ÇßßyýòqrÛç䟿úêÄ_>;áç{‹d†Íð¾¾>_ûœôõ?D#"£Øñ)éé9$ð1±111>|¨âÕ•ÖVä–¦æeƤÅ^vrtBVR§ ³8;1;9.#!);-%7#&5¦ƒ38‡   „ Æ‚>ŠùñÇa /çh4 $ à¤PЗÇÁÈx D'âb)Ä8"hDOÄC0¤:©Fµ 0eTB6›šCOIˆ=ÛŸþ‰ö™â³SøÀ“Ì—4òi*4 #BO¡‚O‘0*•Ìb†gÄPòÃ2?µæE§§ÇÆ%DÐx" ÆÄFÆ“H ‰D ù±Y¨òÂÔ6nõ N·èñÌy\3GY~úן8}òD°ßÉ“9äûU3¯nyaZ«‘CBü|¿¦ñá4r\\LFVzzvV^An^^NNnƇŸßö˜z£Nª‘4‰xœúÒüòœNnYmqMSey] x[šUÈ)(®,Ê*HÁ0¨1ô°h2™…%ƒcÌð  B¦Øð¿‰AÁÁ†ˆFAð †Á‚™ø€H´¬³HÐÄ0H*‹¡†C³ œ¿rßÜÿL  ÁiT$ø`0>ÈýùiÌç>Ä`Ú‡AöÇc(p6 ‰¢âbYÉÉì‚dzYZdNZTNfBVVRjZ\|bdl"(°2 ¢ Ër £’SÃ’¨‰ÌD´ÿç&&ç&Å5U—¦D3 §¿ ƒi ⺹Àª²¢Ò¢\Í*ÎÏÆ)/ÎÍËÌÉË,*Î+(ÌÉÏËüåÃÛÿ}ÂMendstream endobj 16 0 obj<]/Width 307/Height 187/BitsPerComponent 2/Filter/FlateDecode/Length 1818 >>stream xíšÏŠú:ǃÝH|…®Š+¡ÛBŸB~«Kã.•YIŸbp5ø‚ÛW2Ëy¡ÈoSé=iròç$ÕVs‡ËÅ.LrròÉ÷œ¤±v¦iÂ]u8TÓ¼`óù?És.;ƒÂœïÈõñ‚Ùp[ÿBÎÞ“RŸ_€r kúÑ®ëó°ù&þ•°`°’ÍB)‹Çe¼ÝR¶N Lž7Èœ½âÝNóö&u…Qæg¬°V`ÐäÖPhÔË¥izv »,W†´'•]—¿ÃÁ+iO*k¾O•¨OA¹5m\…²>&€ô€é­vZaœ`—0Ôd5à É”3÷šù®Œy_sþÁMüzo?Ûþf¯ðÀÆséSB¥lG¾ÅÒ´•ÜÂ_š›\)'ãcI<ŠçlKØh¼fñhý6_¿Ï•²õǼ¦w™‘³ñ¬üŶ¿âY™°¸°ñvÃ’Íh³' ÃÜÌÖà¥`:J½£Y9þØÎvÛ½ Øz³}›'›­goà…0óôSaÎ’8fÛæ„0lSŽÞÖI ʘfœŒ e†0­¬I`Lh1ÂÜmK´úßÓαK 3`÷k/cc €ý²¤00ûLW}cB¼*gÁìÓOÂú^®—>ùBHXÎëæUÓ_4Ü57=x]ŽFó †™Àò•3™‰×ÖÀ-åkkØ[Ã=©ú?ŸaNé‰ôÝ4L÷‰ZN µã‚öñ'ú~Š]¢¬s» óû߀› #ƒkoš³cÁé,ÿ®¡®´ Étˆ"Êð÷®î8 ~±t]–2ÌÑ?Õº. vjœsÛ—4íN»eÁÄS8™šÀöx«eà «ÏÛȽVaôÁ¤uä?ÛœUU[½Ái»|0§Ö¹Ç8Íóy’žÙ”¥P…÷-5‹&t‡ðÁôê€UûôpøŒx˜Ù9ú„7Zb{ÝF”É©¦Í9KÏ ¡¬ž‚²T(³§¦Âü0ùêTä®]Îhb蘫jàe¸€e¼*`î bÓü°v„@ñ­¡ªöP·eà épeÓH¬§ â X=©ê(ÓqëSC'HfA¬š16Ë`£E™ÑmÍ;r£×­0·ó¿ sd;;šÛݹí¬ÎqbÆæÂðÜÆ©§Xñ—·•‘^Òtˆwúí3Hœ)CîÀ”_¯Ê Ö+M–Ó+gV:z5Âæì|,©­endstream endobj 17 0 obj<]/Width 341/Height 322/BitsPerComponent 2/Filter/FlateDecode/Length 2549 >>stream xíœÍn«:ÇÉQ«.Êþ.+?E"ݳϑ’÷‰ºŠxЍ+ÄSÞñ÷ßf›:W:–Æãña0ñ@Çñåþæ8îÔ={ö$E bŠXš–’¨ÝmZvêR¨®ÝEްZ ³BÔëû{§xE©—Ûñír©O¾õøv>×ui_ß%µl\É×÷·ÓáÔ3yZ44t\%ÏÖ­ºª1ЋR ¦®½º $ì5T}ðÊÙ‚¾êƒ)õ1Ζí߆υ® MÞ“ŽÜŠMã b)‰ÊÜT÷û½a®žDÎÜ äkÓúj(m¦ å쌿۩CócÓˆÐK]ÛNU?Õî|^íŸóGŒƒ´Æ¡•Û°|ƒj@O&¶ß§Lh¿OÕ‘(ÉëChÚonu’Õ@‡¶@hñœP†:|J÷})C[ˆêÝTR1ªºÒ,¼õÙ[$m‹Qƒé I(Ã!„¢«ª6ÑÑlëJ9*ž®rTç( ?ŽÊÝ<âXNŠ€ï´Èòf%©~â*I57^ÏÄ1àm1ÆÃÂÔÇØˆêù¼‹´ñšìë¯æãŸga_Ñ6¿ SŸcÛT¢Í¦½'µò}ýúâX^G ¸ö™g«ÇéÎÜԶ4†Ü1 Â[G‹…{¬Xª“§ýR»kË¢RTWk¸YTrt%°[¨‚:É¿™âÇ]ޝÊÏ~IjKCU1]¬¿}É¡*7KÕ”ªþúr]-ÂmŸNÊ¡R'á:2‚¿{)Iõ,/1;ŸªÄTå5>ä%©ž¿SW"ÀÝa¡næì­Pgz¹ó‚í½Ó®}Ã`/ßÉKØþéÕå|õ3Öê}úâ]ñ¶÷^]ÎWÏ,ê+`ÿG_qDZY€+VnÁ‚õ•[Ä>#×~ÕîºG`!•N™åñpdU¤5iÄêhX,PkÈd£qì®2…xÕ´ú”I=uÕŸƒNâ)×)ˆ”š«)ãG™Dªuh±èkMÙ·‹ÉèÀñI*¥ú(9y:‰úv‘éÄDjU¯PŠFq½PŠ.•JÙÌe_5µ¾¾WçZ8šïE@%R)E'Ӊߧ^ßW™H¥¸Jjz\ë3 {¶n•]u–¸+e)ÓÇÀ-(µ`~õ— X,Ä5€bÔjòÓÒ¶ Õ^Xe©p@}ý¡Ôð{^× j#×^U`ÁŽ,hmAʶ=ø-¶S™pɵ j3¿f!Úêp¿B»;¨CÙà¾&TÊUµ\/Ô¡œH¥ü5× u('Ràz¡åD*¥ƒ¹^¨C9:Pë…:”Ó¨Ïûç ¨´àûꓹ#DÊiV\/Ô¡Læ¦+Ìü6„vg‰:”ú2½¶ÈŒë…:”ÉÜa…‰¯z'Ðî,Q‡²3@_"_eÄõBʪƒúmH^â«Y€½:WP‡²3˜€y€ë…:”¨f•ë…:”S¨Ú†û¾G×¾~?Àîß+I²Ë—¸/0Ç4hq¦—[›ißFukW T{XÚMõézÁÂ5Ь‹k7u³A_ÞÄõÒišÖH®ÝÔÍ©~½ßÙ¸^h7úÇÈ\»ë¡´ökèÎÆõz´NG# ÇW܃a8êÓFR6 æäçL2@R;Ù{ôùš æþNL(³ÉRÑmyºú'ÈhAD*¨8“'l>„1°[Sµ›eªÀéÍvÁ°m¡ÒeÑ{–—¼Rx%J‹¾~yBÏòáE”©½Ÿœ¨O‹ýŒ,©©²üÓ…3¶1Ü‚i¶?½6¸¼Œ­ˆûè:PAÔmV ¬½¼pX mªÛz©ðÓ£¹¼¼…4™ ¢Ê0þÛKíàæVYòcZ€Š>XCa½•î6¨CY›¨O ‚è ¢^òYâÞ5’µÛ&ƒzRýau° “H¿oBETµ@µ*ÜÆ½Œ¹3‰ÛMÃÝ=£â,Q˜éåLfÚï£}FÅY¢0Ó˙̴ßéiýŒŠ³Da¦—3™i—TýŒŠ³Ùu¾?¯¥ÙÅ>£BTkÓÁ*•m™A ƒ¨" žQ¡Ë¦7 %¨æ¢Ú««7SAYªAËRm`ËRm0Ö¨rÖÐEX!ÜÆ¶ªw7Z®®éãv­ì°6UÍJÝí`©]·6Tûd›ñ ÷eTr3ñU*º+ùz¤Å{z½Œþÿ]Ž!š5„dLKL¥YvDý]SàH¯—Éô-àÛµðhÖS¢ÔL¨òû¯ûCéÊ®ëkE™¡ÌYÔßD¥ìJ}¢¡bª~²Íø˜N¥¸ždNãr®/\̬¡¸YÔÛYQ¹¸ºYcõz<Ø1gK±üGž¯·IáûóZn P\'Ì Ëâ]uó<¨¤ÈŒ¬úwE€[WÑiÖU^ËŽ³åtþBïÃ}r#‹7žN—C}´ÓePéÆŸ#pº jBnct…ßs¶rš>Т ç§Ëˆ­ÁrN—C]ÏÃŒ®ðûbãú _›áTù*w\œŽ·¤ðL¯Ø–·ý&•vÅ8oI€©¯;õ:{ÜùætÉc@ý<äœ.•ª_räœ.™ÚŽT8§ã- ]z¾ôý@|+À{HÞ˜"¬n#_ÃÆÙ#tfÂI°SP¸‘‹ºàÌûJÁ7ð’àÕ±6¤†µØ–ê‚Ñ1ªÃ-Á6QÃ}<]ÙDmªìÒê89ôn² u|WÔVCj6Nj3ù®‰]H]óU$‚:Ùi¨ á܇š™Zõ Ó23@¥Î¢örY*¥dQåßjÉ¡*?ûU$äP)¬‰ ©½ì7[zÙ’غ<^õÄ*${¥„ÔvÅ:í\Åq]ö•v)Öv«ÛC_›µN›¨á>˜]l¢>P ÚDíSɦ>ÈDU’ŠwV^ä«ó%&¦¯œš®Š% Q}€¿Ê·ùêS‡ü)ÛJµI“wb°•ª_o§yŽ 6R} Nd+¯·Qá€Õ˜€º£^)ÏÓÁ?Q±Öc ;¤¯ôj½Xäÿ5[÷èdE}»¾ÕÕå|©õ;P™TÆ[E=¨ü½CÿöJ&Õ>*â<ÕkòWIí(‘Diº Tÿ ˜ã*_ß4•þCáêè ©”?S¾Êןò#¯æ[¬òUfU^n•XѦ©'ÊwR2Íü;IawÉmãñªmM`+©qETá©þÁ6eÞÅHªo ÒÔå& n!*‘ð_£•£Êgæ0ËQå-%…W>9T0Þv|ôUb?Uxïö·B¶Ï~d¡5ù*°ndNçÌÖ©dÊ8ÝNÝ#°G`À={ò"€÷VÁIßÜL¿eÕNÝ#°G`À=÷ÿ·r|endstream endobj 18 0 obj<]/Width 467/Height 144/BitsPerComponent 2/Filter/FlateDecode/Length 1926 >>stream xí™MkGÇ7– A”CuvÉ)ìÉà«aœ–œëR‹^ ù(vÜš]ú$õ²Ì§ØFéÅÔö“lêäRÖlŸyžy‘ᆴÝkgw~óÿÏügvõâ®ûø¥ýø–]×›þ£©÷ñöñ>HýFzS"}¼a2Y™°°_äJ–”ì—EþkLñl؆ƒÛôÛð-¹&ð`¦OEjÒnæL¢?îaÚP·[¨“ËSOõ–U£N¨3øGSˆº:¦i—GFÎàD «Èv*5®‹‚Õƒz<èÅF­ &[6ãæð°°T>ú žPÙŽ¥:X££ÛfsTt·ãöøí€"ZSìèm=!KàYvm»GT|Óãc¶9b›ÛL;¶Yû2êLÓͦ¥ùR^˜FTˆi{X@¼Å`]C¼ƒÍD£EusÜ4-‰×§uL…˜Ò.bÜS¶ô6=c*ÝL÷‡;~â¦YÃcYqdII¥,²7¥©g…ÖÇKCg,¼¹’o¤ó®—zÓ]“Ëê×Ç ïæ}{3©ÃH ô š"Œÿ ÒÔ¥À|Ó¦(sÿ>5 ¾÷±U›*9P¬í™Ö#a ¥Â“¥3µ ÇL|¦µR“¯Î•šÖ¥ƒ.L@Þ‰0x8TJöÆ,Dl ™`H¼ ,ƒÑ#‘’×)˹ù|ŽÉ–è9›¶#—…¨¡µÇRj,Ëzˆ˜Ü£z|Á4dŽpúÚc*×f¥L¥ñX;D€^È|WEaòU¼øá€­”©ø…íé”´ds ž[ãe7œç?i/shC=n¦j™2„,cLá{Ø¡¸™F!kWÕú«%ºT¦Q£ èËbLÅW"øº›ÚœªK˜ÝäZ7ʘÈ)³îϘÿY+©C[%n#3¦ð=LÄ{5•Ùrcwo\Çl%+¥fQFM%lÉ-Œ5M0:_+%M㩨ýkÈø²ë=ÎÔØSŒ^'#Õˆ÷ÆbŸ¨\T 7B2¾¤\-­ÏÀó(¢×u¿bæì Ê|°ÌÆ%îu]b¦Ýo`¦‹c=²™/:3ºòø1ÔâIé–ú…V|îXŸ¬ŸkæÄ1è>•JaNÉÆð¥´k;|‰O¶o8fø„!×ååb³Òÿ '*ê*«õ­\‰ ¯©Ñ,E/&^hiŠ5½—òu3 H\‰]È’’³Èÿ„i,§¯e…¶£v²[ošŒæ!>ñx³†Ç²‚È’’JYdoJSÏ ­—†&ÎXx)r%?ÞHç]/õ¦»&—Õ¯7+¦]¡>Þ]“Ëê×ǛӮPï®ÉeõëãÍŠiW¨w×ä²úõñfÅ´+ÔÇ»krYýþGñþ lgendstream endobj 19 0 obj<>endobj 20 0 obj<>endobj 21 0 obj<>endobj 22 0 obj<>endobj 23 0 obj<>endobj 24 0 obj<>endobj 25 0 obj<>endobj 26 0 obj<>endobj 27 0 obj<>endobj 28 0 obj<>endobj 29 0 obj<>endobj 30 0 obj<>endobj 31 0 obj<>endobj 32 0 obj<>endobj 33 0 obj<>endobj 34 0 obj<>endobj 35 0 obj<>endobj 36 0 obj<>endobj 37 0 obj<>endobj 38 0 obj<>endobj 39 0 obj<>endobj 40 0 obj<>endobj 41 0 obj<>endobj 42 0 obj<>endobj 43 0 obj<>endobj 44 0 obj<>endobj 45 0 obj<>endobj 46 0 obj<>endobj 47 0 obj<>endobj 48 0 obj<>endobj 49 0 obj<>endobj 50 0 obj<>endobj 51 0 obj<>endobj 52 0 obj<>endobj 53 0 obj<>endobj 54 0 obj<>endobj 55 0 obj<>endobj 56 0 obj<>endobj 57 0 obj<>endobj 58 0 obj<>endobj 59 0 obj<>endobj 60 0 obj[19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R]endobj 61 0 obj<>endobj 62 0 obj<>endobj 63 0 obj<>endobj 64 0 obj<>endobj 65 0 obj<>endobj 66 0 obj<>endobj 67 0 obj<>endobj 68 0 obj<>endobj 69 0 obj<>endobj 70 0 obj<>endobj 71 0 obj<>endobj 72 0 obj<>endobj 73 0 obj<>endobj 74 0 obj[61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R]endobj 75 0 obj<>endobj 76 0 obj<>endobj 77 0 obj<>endobj 78 0 obj<>endobj 79 0 obj[75 0 R 76 0 R 77 0 R 78 0 R]endobj 80 0 obj<>endobj 81 0 obj[80 0 R]endobj 82 0 obj<>endobj 83 0 obj<>endobj 84 0 obj[82 0 R 83 0 R]endobj 85 0 obj<>endobj 86 0 obj[85 0 R]endobj 87 0 obj<>endobj 88 0 obj[87 0 R]endobj 89 0 obj<>endobj 90 0 obj[89 0 R]endobj 91 0 obj<>endobj 92 0 obj[91 0 R]endobj 93 0 obj<>endobj 94 0 obj[93 0 R]endobj 95 0 obj<>endobj 96 0 obj[95 0 R]endobj 97 0 obj<>endobj 98 0 obj[97 0 R]endobj 99 0 obj<>endobj 100 0 obj[99 0 R]endobj 101 0 obj<>endobj 102 0 obj<>endobj 103 0 obj<>endobj 104 0 obj<>endobj 105 0 obj<>endobj 106 0 obj<>endobj 107 0 obj<>endobj 108 0 obj<>endobj 109 0 obj<>endobj 110 0 obj<>endobj 111 0 obj<>endobj 112 0 obj<>endobj 113 0 obj<>endobj 114 0 obj<>endobj 115 0 obj<>endobj 116 0 obj<>endobj 117 0 obj<>endobj 118 0 obj<>endobj 119 0 obj<>endobj 120 0 obj<>endobj 121 0 obj<>endobj 122 0 obj<>endobj 123 0 obj<>endobj 124 0 obj<>endobj 125 0 obj<>endobj 126 0 obj<>endobj 127 0 obj<>endobj 128 0 obj<>endobj 129 0 obj<>endobj 130 0 obj<>endobj 131 0 obj<>endobj 132 0 obj<>endobj 133 0 obj<>endobj 134 0 obj<>endobj 135 0 obj<>endobj 136 0 obj<>endobj 137 0 obj<>endobj 138 0 obj<>endobj 139 0 obj<>endobj 140 0 obj<>endobj 141 0 obj<>endobj 142 0 obj<>endobj 143 0 obj<>endobj 144 0 obj<>endobj 145 0 obj<>endobj 146 0 obj<>endobj 147 0 obj<>endobj 148 0 obj<>endobj 149 0 obj<>endobj 150 0 obj<>endobj 151 0 obj<>endobj 152 0 obj<>endobj 153 0 obj<>endobj 154 0 obj<>endobj 155 0 obj<>endobj 156 0 obj<>endobj 157 0 obj<>endobj 158 0 obj<>endobj 159 0 obj<>endobj 160 0 obj<>endobj 161 0 obj<>endobj 162 0 obj<>endobj 163 0 obj<>endobj 164 0 obj<>endobj 165 0 obj<>endobj 166 0 obj<>endobj 167 0 obj<>endobj 168 0 obj<>endobj 169 0 obj<>endobj 170 0 obj<>endobj 171 0 obj<>endobj 172 0 obj<>endobj 173 0 obj<>endobj 174 0 obj<>endobj 175 0 obj<>endobj 176 0 obj<>endobj 177 0 obj<>endobj 178 0 obj<>endobj 179 0 obj<>endobj 180 0 obj<>endobj 181 0 obj<>endobj 182 0 obj<>endobj 183 0 obj<>endobj 184 0 obj<>endobj 185 0 obj<>endobj 186 0 obj<>endobj 187 0 obj<>endobj 188 0 obj<>endobj 189 0 obj<>endobj 190 0 obj<>/XObject<<>>>>>>endobj 191 0 obj<>stream x%Ì1 Â0†á=¿âë³IškgAÝáq ­¥¨ þ}Så¶÷¹§2(óÔŽÑŽj%ªÄËMÃä!=Lã©®rP;².i‹Ó^Ú’¦Ç놅ÜÕO™ÙTž¼emþ¦0ÄTÍf&v ´ÍCþVlÓ{ =v—4†b‡ãç‚s—âܯEÔÙƒ)“endstream endobj 192 0 obj<>/XObject<<>>>>>>endobj 193 0 obj<>stream x%ÊÁ @@Fáý}Šɘ;fL¶Š­Ô]ØjDD"ÞéìNßA ýÆðYްQ)¤1!­-˜!#Œvª0^áÅ¢®‘°"Ü×~ÎýËBÆ;å|Žä‡³j鈸ˆendstream endobj 194 0 obj<>/XObject<>>>/Annots 60 0 R>>endobj 195 0 obj<>stream x­YKsÓHÝçWô’©ÂF­·ØAB˜T ϸ¨YÌF‘;¶À–‚,ù÷sî½’ú1eSõMŽîûÑ-Íç3kücMš(5ÕöŒ`0ø¦[¥I0ÃÈÄyf¢xeib:gnÏ>›,š‹‚(À±µó‡sÖôäÊ&æ¢5ï óåY”Γäù<2[SDóds}–…Äe tl ƒy1 "5›°!ÏzÑÔB$»‘0bQ…Áf™ñ¬Â[†™XÁ&9y<±6ÈIWœÏ3¶ËN1»‹]ÈzvGLvc ȳ¢9Jð dñ{dF¬Ya°i ûŠUšQD4Éj,vC̓MCCÉ* 6çúyÍ oMF“&öY" C.½e©„‘äŠ"Lñf‘g›‘gEsPHãˆfFJóÈ¢ÉgÏ*L¹âzN,wd\$ª­‰bîö‘å6R¬Â”fj+ÏjLiN*Å* ¶à²gy„â<äžK3âO n Ò­§ rh©7=©1Ø„zÓ³b3G͈@( ؤ‡Ä“X) LèGÈ+HFœ@®[Óö QKî2’ôz 6NÉ#Ï* 6OÉ'ÏŠæú,643bÍ ƒÅ´`iyVa$?Hç±fE³¥‰#Ùó3bÍ ƒÅ~K5«04c‰jYNUTXI†ÖA>UQF]ÅqÅ‚˜U˜ÌZ8§X…aÖRº=«1X'ѬÂi$ã;ÍœŒ(%œVA>ÍË‘)VaJ3¥g5Lj۳²v£Är?Jù"L,']± C3–ì²&•çHÎ'‹VMÄH±ápB¡Ø¨£ÑîˆQœcðÙ³ Ã./ÅJ&yUS})£#Ö¬°ÔœXnœ°Î Kçˆ U˜'˜@Å* –Ï Å* —ùdð¬Æ`‘V­YœÊ‡ã+¢M2"§„ÄÿËVÈÑ!#ö©1|Â5bDÌ* 7DË*LÓñš5‹èbÅŠSX|¼Œ6ˆ2Ó8b˜Å–C’=«0£2P<±“Ù ]ãY^­aD­„Ç€¬*£1G3‘Cm@ ËJ4¸CÅP[p¤ H­pA†ÁÑI2 NAŠ“ O² -ho@R§Ha°|Gò¬ˆ" œD¹Ä–‹* †»¨g›dß³ ƒÍrD¬d¦ÊÐÔ³â¢8#vJa°i@f=«0eŸíYÁòá¯X…ÁbyGZVa°@ÛÕ˜rôÏPsÕ-Ž%DËHò˜bÅžU˜\¦{º—å.•ŽÃ ÀÐ ½b4$uP‹R"‹ŒÆÒŽ,ô„ŠQ^Q q2Á&#ñ×c°1[XE×ÓÜXü9d$V=‹›b®Y…ÁâˆCí¼¬ÂHÿîYÁÚŒR1Éj ÛM,»ŒWI‹£Üì°‡C–bÏ)c‘(ÎCp<ç“NÑ)HŸÒ© 8tuáu²›8­h;HÁ°›\¿‘ÃËPh<ç!\ èóºoô~':­€QçÁጔ:’^vxk l™æ<$9ÒÍ2ç!ù!ô‰S.a¸¢‘’SÒágÏyHƒGËb⇋¬’SRMå÷r4e¸‚Pg´ùoòÄ#ǃ1Q R2iØ=ç!%oðŠóÁYºÄLr ‚Ã{Üà¹ò|Ï+óä3„Wç 7‹[ƒS9Γ¯ù˜4|X,ñ‰`Q=ú÷Í¢Ú˜™Yìû¶«KúóªYºo->âýÐbIÝš‹ÜšÝ+B(xôÁu»ºmž õ<&‰YWldf^sbzæªé»v¹¯z8 ~lh*$àú~×»í&yä¸ulÌçå­u¹oxÊMÝ×Ru=bœK§¾(ûÒ´QôQCòJÜÜ¢O¥óª¶mISnÊ›vßÿ¡f*.¯éÃ5ˆ3žãýœÅóÎÁÌÝÀóœ]¸®þB?^5»¾lªŒÜ˜Æ šs·Ääî–Ÿ³©b=ªöWÍ™à íå…ÛõlvÚ<§rQòjÎ×%¯ÏݤŠdèßû´.î›r‹Ádß¹Q®÷w®«x÷½wnèݺ¾;~Ÿ"¬rvªq»Ç†KÐÞ?f×ß»ŠZß™¡3Ìܯ—ÖØá_ë~m^·Íìm»Ãâj\žu«ýÖ5ý¡‰¡ú„÷›‡·1ãáËÃ+·ÛÑýÇ:Šâîx½,\µnêÏûŸ'ÿ²Þà¹ãî¿p–ßv®rK‡•cÞt˸÷r_vËoo Xn¯ÈëC«ñ뚿ۻî‹ò±¹v=­ÑÇæe•v§˜ã^ckæŸzwpëû®¾Ùc(O£Š‚kÝO^ÊŸãÒi~ÏQ€¯è±YÕnï°o6ð~Ývýìo²ûºíåœ'‹§ŽïÅ7¬ßš v …c.±ÒöÝÏÃþ¡ÜìN W}BoØ$¿n«¦îÍy»Ý"D¨ÁÀøÓ˜_ÿ:h¼öèëÀ÷7aú9}ø²czÕ„èkµ¸b Ç—<º†ë³Õªs+9¯N>£Èm5Ç‹^ÛR|JÀi ‹?¾’Îß’ /pYPÐ3!ýøbqöîì¥oíÒendstream endobj 196 0 obj<>/XObject<<>>>>/Annots 74 0 R>>endobj 197 0 obj<>stream x­UËRÛ@¼û+æ íê±ÒÑá‘ʼÐ!.BZŒˆ%IáïÓ³k¬J¥  ¨2nõôìôÌhýk¡(ÄŸ"£)J©j!}\„”f)>[Rad;´¡‹…Ä`ã|ˬ—â3c©ŠYê“ ì¥©d‘ê·¤• ÁúÄ ‡@i&r‰kL %+0‡&0‚•lœJ²ƒMó'çJÜRÆA$´ƒMÓ'çzCqÄ®S9“ùNÍ†Ž¬ÀlWó±³V`îcä‚•lâ&´×J 6s™Ya(æ)ÏçzCQ„Þ£(mx˜±¡ˆ—)Õ¡[)D¬Ì arÖ=é…n[Ê ;u`Ÿ4É‚ãæ{Àœ€Ü@žùLºR“”G RqÿÛq²5oÊq´ãaq»8:S±KÜNØxެ.#mˆÈ‡VWã4”X­÷ÚØÕvê[̱¢ÏekwCí»7· /—'åT¾0Ó.ä®ÿ}×Ò$P:ÄË\|ê&»üþøRTú:ôxÐŽtßL7tL§&ÛüþÑåÁ¸­n¨©øyyøÂ²æ‹ãùü¿Ûk;Ø®zŞǻ;Há§H«×+~öœa_ü’ LchÊ W§ ÖÃ`ö&ÌÙlÄO‹Å·Å_³ 2ëendstream endobj 198 0 obj<>/XObject<>>>/Annots 79 0 R>>endobj 199 0 obj<>stream x­X]oã¶}ϯ˜·ëbŲìØÙ·íGŠz»(j ÅÝÜF¢mv)QKRNüï{f(ÙŽ’-.p»¶KócfÎÌ9êëUN3ü—ÓjNÅ-•õgY!Èï0º]βż ÅzEÅ"+V·Kòš¶W_iUdé€b†,ò<[cù<““n>æKúÁѯ8ó§«¢À¯Ëõ:›SMëE¶è–~»º֔ϖ8%­äÉË1fqÎÝåìų«ÙÉ ïe3Z®–ø»¦Å]¶ì´?ýÄûÄZÎ;fØ“gùœ—þñiSZâùÉç_tW«¦!ÕTôŸªkh>›ÍÔe’LÀ蘭£n<¡è(î5¹Ç?u§ÎÝD]Q(½i£ivdONÀBr|šÀV?ÿ®±Ù+kÅØÏ¦©­ª€ÆÝ²·÷´7åžL Ún“Ù*ŽÁ×O]ˆÚï]yÓ¬ßô0Ù8gé{W#jdt@åá=™¸éºbx3Jpp¬tP¶ÓSUUˆÊëÖªR׈‘¶Î“€Æ0UNj\™òúkg@;Y¤JW·Æê¬_6GÑ\ ï»&¤À“WLbiÃ^þ%ð´ÞLCжúé"8–ã mö:hR0é¶[íá2ÎSŒ×ȳFÕ:´ˆ%YzÿþÙÁšØºc%²ü¨ÉÔ­óœPÓô™.;ï9þó ˜€¥gÅcË)gD°îê‘Y¯U¥5ñ˜Ñ¤39¸SjÅþ”±êÑjz˜ðQ޲Á‘j[kJ™áÊL§:Ù)]¢YÂûWh  ê.¶ÚÇ#ÐOL¸Æ±*¢Þ¨ @‡ üßYm’s6‹:ðº‰R.¼»RQeŽjß œÃ #¿jur¦d¬4…#Ê·Nu¨ºèjX„z=LtÃaÒÛ­)™ciÿøXxˆ(éÉÎLò´˜c\~®Áædu¶ËèÉ›&s•|>¸ID¦õΫ”tåä™D¶8Ñ턹’j 2²ya¨¯#¯§Tc׻ʔ¢&va˜Å%BÚi©dÒgˆŽOŸœ½ÛzÔò“ó_BZ×Óe¿7»=UF3p@Å©ƒ#×äUkPY© ˜óXwÐÖµÌíÄà&Û°~(¡A·@³·öjOµ:rúREìOuzi(ªð¥/(öèIÞ8 X3G"çà H°Q½xH…@æ5–"<ä³Da ›Î1¢Ž_Ér k¾è7‚Y‡*<2¶•Ú‡ð¨%éŒíôk§˜Ê—Ø1ÐÁmãï˜@/iùüR©×½R³ŠÖpyr¥á»}‹¼,ÐeÖ¶EE‰„^0Ù-m»FîHöÌ€1l9‹tig;à›ŠaàÂuB çåÈ‘¤h×'Öö‚“$,Õ kÚ I¨ã]hqÊ-"²Ÿ.Ìñýx.Pid^ÓÀúÒu78k>~ŸJ®+øY×IˆGè¤nH aš!§k÷,…‚ÕÈX¯€ T05d`961‹8—ˆ\ø/üOª'Èë¦Tmèì !XYåבEÞÆD‡å˜€¢Z3ëM¨ÙzÖUw6šÓ€&&*0 J×yf × ëì ¯LZ"Ù÷:¹ö¦ C6Yή‡ ¿•ÆkÚ+†?îYF,«•V&â= ïª4*ª©,äì!¬Lü¾wëœi¨Ð–ïl))Î祧n„s nš`AÅA8§Oêî`‚á;´¿¶‡¢Ñ~³S÷ñ#7sÜÞ|’&.I¾ádàT\V?3É9ÜÞmì/pÐ0tðW.LÖ=W¢7éq¸Bž¹|P†~7&÷ÃäE5é 7ÏI2ÒµÝázƒ2&/Šx8ñ$}Lf-~l¨U7'êÐÓÓØ^êÝø˜­³Ö= oº–›÷ èͽƒ;b¼¦¦'XîÅm.—ʹgžC­z5ħá°¾c ½ä¼s~!æ®ìï6¤íM}£ ÂÕÏåóü J:˜G‡[Ú7ARwsŸã½ þNóE6_ã Ð÷ÓÅ|E$‚{ª_3ßòC¡šüÛ<óuÏ%¬ÇÑAÑ€;bàðàöÎX]ú™ ¥*¿ÿBˆA‰e©Alà:+Ž«À+$_Ýê)#§Ž¿2Ò—¢ È@‚XÏ“A÷¸šÐ|&þ¢»N-ÓõAà‡¾ëëýÃÂ.å*ÕÀïí ã\qß=¸Aêb=Ë‚ëÐf4¸ºõø©qê‘ÿ™Ìý"6¾™:¸:ôá¨u–ÏoîéP©x[é–yÞDˆFßí€ô}%r«‹~™‰÷-Œñ ­&[bC~@ihÂßÂó•“ü auaŠB¨Í 0p !*•tðûÜ=ƒÆ|ú´ÈÖùb…2ypwòˆ>õC€FÚ¹¤%õ£iNÖIO¾÷pè߆>°ëÞy´>ÕkáRª´åJCi£˜/ºyd.:ö¸çÔÄ´øÿò›uñÍ\àÝÈä‘+‚6?¡Ÿ’7Gj±ø*¨q¯¥ºBÊþw¯½\åøf4Ïñic mX¬Îߦ´ÁãöD8¦s|Mº›/hºšÝñ"žì/>d,Ö9¾¹HQ.¸~Ü\ýzõ=&ùDendstream endobj 200 0 obj<>/XObject<<>>>>>>endobj 201 0 obj<>stream xM±NÃ0†w?Å?¦Nc'iœ±:*$ ,‡ã„T‰-§¼>6m%tÓ¾ûþÓ}3"–@#Qî`fö¨YÛAè>wªî"§MöjñŽ\‡ýüLa4xòf­ ±ñn£Ol{P7Cö€àaÝ9c±Ø©çݾ‡ÿ4%–Ë¢Î[Y7E›âðBnXi°8^ìù2ÚŸ„UJäuz@—Õ©ÖìýòPWendstream endobj 202 0 obj<>/XObject<>>>>>endobj 203 0 obj<>stream x}TMo›@½ûWŒÒ ‘ll0þHnmK‘ZEQ9ôËfYð¦À:»‹]7ÊïÌðaׇÊ;¼÷æÍcÞFÌðÁ*†ùd5zƒy<éá âÕ,\Á:ÆÛy²ÂK<Ÿ>Dsøjàiô%Í €éæ¢Ò¢$oâ,“u¯!Í"•ÁFUÝ^§¯£éfÝUðMÔE# ÷¿½ª6µ“ÃÏÇT–m-"/„°'=ødŽ,ëuŒðÁCí­Éé=Âã^Ù½VDÕ®T·ðà ùë_ÒLâ(ŒøíÔ@¡÷ ަQƒ®vV9RA"üVAÙë{Q¹Á ºö†3å….Y2U+j"SÙð1#_4™Nb{Þ¢X7&$"SµG8Óœ’ž¸8TRª1ÈR )J„æŽÆ‹J—ZX@ •¨[S‘¢Á† Ò5…U¥ë¤i¬Sî–ÄSYp2(è)Bx =Ô»W¶Å‚º,Õ„3Rb¡,›— êAôa«år#d‡ŠœÄ>‰$;ÖØ„\ ¬ä<•/¯h †¨ ;ôx.ºÙ£U¹¶ÎƒójÇ3•ëZás¶¸É!AŸ¡Æ|´‡hy[žÑ8s°×‚uIS¡»Y pGc¸èMZTÌɱŒÆL!¤Ø“£Ð›µ˜.ÓÞXxz²13UÊoMG¤kíèùó˜_Òï·åJ®ã«Ùu"¾3¤ƒÖvnëz«¬öè'ÆÆ°¥è 7€úæ·5F##;¨. ¹)KsÀÑã³Dm2z¸Î>‡Ý:S©6¤8Ã1œnÙpje¨j·NÿQOyº‘ÝŠ ¯µŸ÷§ r¾àŽ'ÁzA´<örΙj¸D@;×ö]ÛB2–´†²àôyæz¬=¼À;½LŸ|’œ>ý^ë)Tu¦©:¶œ„¹¶½ÁµP—£wªÍ¦ƒNáꊊyÉœ3~ÐÓé&錌g ÜÌ ,Wópµäï§MüÒ·§¼p'}Ýd5»¡vqœVËÿ6l²ŽÂ­û,Xõ}:zýàñíxendstream endobj 204 0 obj<>/XObject<<>>>>>>endobj 205 0 obj<>stream x­VQoã6 ~ϯ °ð /IÓ¤íÛvÛ{Y1,v÷ ØL¢›-ù$9mPÜIÉŽë¶ K"©äGR_'s˜ÑßÖ ¸ZAQO~ÚLf°‡÷ ˜Ïa³£ÓÕÍ6%}lŠì Š¿áÝæË$ÓÆ‡ÆÙBдþOá Íþ<ñÞü*_,—0å_ÒÏêS”d½£rq! ž¿ggIax ɪ°¦Pé îTÚ§õ÷bç3Ä_ÿydÐah‰6£ ²!ÂoIm±Ê—ŒømgmOÿ£›d®óÈ”ø8êa6öæõðTN™=>Wšr¬þ<¶y;ï?Þô$˜.®ókÉãæ€PâN´5`wh§¨”÷‘¶D{§FªªNàÕKÐìt…ð)óêU<Ó*´¡¨DñÓ;P¦„BØ"´žô0ßç¤ÌǪ€6*‚>"1´Àª"ãbˆ úCoÒÃÎV•}ð9° ºM¯÷l¦$œ 19[7¡s®7{ɇ#kÒE× WÚ DÇÅ]ч¾­zƒ…­kvÄüÁ>ðír­èn‘ æðdåÆW²iåÕ<èp  • ?Õ[[Ũ~'ŽçüXÏçT^D¹†‚¯:î8üÚêxcÞ“ë#“’Q5zÒL”Óuc]ªFÉãÝݯ+zÛRØ»0Ì;%¶«½ˆ>8¤œDáûí,Ò~÷ì.þ ýâgO¿M.@v£»ÅÀf´3¼»{±u~û›âÂãõYr;’¯Ï’Ò?6Çë(Ëô¿‹ïMaý+ìÂj_„up y.Q-Ñg¥ƒ¿Þ~öè=wµµG¼„„ʪ2òˆ+ÕÆfÑ:'…Ç¥z ‘;r"¬‚UŸ,ûŽ0€ÔOZDw­t;âU–à rUêšp±ô›K•®Ô–:TªJ_8Ýp¥’šœÍ!9oð‘šIÀF4#‘åã ¿ŒAíHÌ@æg Á/(ªj©ÖÅ+¡[v9B!)Î$"%Êà¨xl”£ú‰Ö¹ ÇÎg81 Md½w¼—ñ@Ê9…ÕHÿæ ‰À@r#õ™[˜/ó«ør˜.ùL†F¬]ð z§ ¨1l)ƒÿ9Ÿù"MJÖ`ÌЪ¡ÉhŒèšÒ〸ឥzþäKÕÑÅí߉ËôœXÌ®óÛÅVëu¾â—–̘¦ ”,%#gÚIM׳[‚û˜Î>ð-oæù5?QËlÍ^ü²™ü>ùY@:"endstream endobj 206 0 obj<>/XObject<<>>>>>>endobj 207 0 obj<>stream x­VÁnÛ8½û+fÝ=8@¬ØŠí8‡^l®Ån´À&†¢m¶©%©6†‘ïÌŠ!Én€…›¢†oÞ>rüÏh3üÌá"‡óÈzô©Í` g׿s(6øvµ¾€¢ÄA!'NŠo0Ÿg9NÆç \9%‚¢w&þÚûoJ†86¢Veú äwQzÏŸ{Keº¿6_e bÀsÀØ^¥ta§ÍÖÃxœò¼Û8+#¡¦õ;8ð’G8Љ[,Ž"ë}ŒÔƇÂŇ˜ƒÆ=âCs¬´FŠD-ÎTÚ§çßç⯿:Z— C(€Ëßgø˜–½-Ô6pø%"\§Æ”ê¥v:`6Tòri*'Ì6'•ݨL9\þ¼¶y½ g×ë'ëNóe¶d£;Ñ‘É+ ' …{­W%hêAÈPí!à ¾…Ÿb§eó(óvB¯ÉÂHDÞ€¬„OA7OØ·'ˆ¼±Ne´ììúæ‹ì<«é"ÏfÌí/µÑË)ïÕNüÐÖf$ìñH•_ùˆÓW˜g9£ÜXØwÊ %#m ÁðñðS9 2ì¡Æ„µ¨2¸i›ÆzuŠoQ¨ ,ðj¿Á/Òâ 5:¸gv¹Sò;¨l›JŒ‘Тœk‡ÛI¡A›P­ø˜ÙF9A´P¾ÓÞ·ª¼=ÉàŠ°¨”ùÅ=!±½„¥5 jëiw4æiÐ' )oœ­9‡®›JÕ8Å9PGºòTÞL’‚´Z/¶¼eÚ匨 A rùàZ‰gOy¢÷E‡|ý\ÈêˆÑëªD¨ÓDm"À«F JŒbK´žtÕ*ìl‰›@HÈf˜ŽŒF·$ø´øä£Sö¸ÖcŒÒ4ìRaF‡eÁý㼈D&â›Ô³ýz•,ȼϋ…E"N“ÞÒ‘ AÒ¶T)²FÜó¶;üØ5ŽGï¿ôŒ˜/V1ŽY {´auENñ½>qÔÐ['£H:¸Ç€g!üëÍøtq5`6 fÔßè¯^Í]Ç|Æ{‘L]ˆÉ¼—J×%Þ òF«Ð›XðC¼ü»æø¼>wðñ#ÌcµÑî©…âÞ6 óe ªnÂþ·1t¬«V‡®Í3ÅØ›ß%úìz‘zB>[f—ùV«e–¯ék˜BÑë´¨xÚ…M/f—ï½£ëy¶¤ÿLådMˆ£?G¿øÄendstream endobj 208 0 obj<>/XObject<<>>>>>>endobj 209 0 obj<>stream xVKÛ6¾ûWLSP€µÖ’åWnmÐziQ¬ô -ÑcYTEz7FÑÿÞyP+{( _hjÈ™ùæ›oø×,þؤ°\C~™ý¼Ÿ-àO[HØñëz»}‹}}.u ¯*« 𥆼RÎiö_gѳWù™W ê"ì©£ö7Ù4µ·|Ê©‹—·¦ñt]®j(ôÑÔt|ŠAA®[¯L ®»ród§IäÒàá¡ÃûÅ o*M¥AUXŒ­•ms*=ÈÌà·wך½‹a_Ǿñ›ÊK£_t/FqŒ¶ñÆÖäiäz~1ß oFP\[SŸÀ¾êÜCÞjEb:ñø”÷ðÍÓU¼â¸ß$¸°½–D\*{ãÛŸ{ÜFî?~”ÜG[ïO7WW‚šÄ:ý/–¶ùfº¾4þöƒ¤Ø1doÒ]†åÙÆ;Z`…~³^#ˆÊ3’\YCà€=&æõ­ƒýêòÚz°uuƒ£mÁÔXó:GN¡qO±)Áàpõd?ͦ=ߪöêâÀ]›Æ¶žJE·1õˆº=ª\t«ñÍ<´×ªåpD¹¨3eA¼A^‡ É_'Y–%z¾XXÙ15‚/çNÄ&V`†vñåƒÐqQõ ¼Á.8Ü@Åu AŸ™aDÆ—Ì$ß‹ö¥ ­6póû/4V«/ö%$¤êÅ1¡í\ŠšÜUõGòÁOE!‹¢x+{!Âh„V$øMG62ª4‘"¨ÄˆÚqÌQvºCoòý{ó°0ùk%–¿ÿ!ÓAß‚â³hVÇdq¯vHî… åG•ªõ«Heo¦¹¡Ø2†_k,-k‘ÓX;äÞ¸ Èho“lƒŒ[Œ#І[ T÷UnZÛ ŠÞ‚²"¯ȃÿ\è>ÇOLfIŽÅ+‹!ÈWS–<dyX\2\¶F㽞¹#§¼¾I ù8²þDs(¸…ÙCÅ@·£ø8˜ð ï‰î)™®c¶É}w"¾$÷O;H²x)£sž%ñj½#IO(i¤='Ýr°É0•4Sž(IR³^39±pH•“®ukrnt$Œ}Åaˆ¼9¼èEWú¢kï°1eò¡‚é"†gRC"ŠÃ«ª=Ý<‚­‰Ë$zÇm:h¸(ïdB£ä9u{$]Æñ’Ú•"¨Ÿ(<߯có8qÝáÆòA#Ÿ ÎzŒç3 ¦ƒ‚ŽŸÂøuÎÍñ‚H“„²è9žn«iÚy©ó3b…^TuE¹ØHg5ìÏ\\dOì aÏ|5i€‰ŠÀnïÊ6É9Ç’…'ÛÖú‡Mº”ØÑ½"¸-F%ëúä­îFv!Ï„NŸçnòMÀ›Ù9è$žÁ{,,nMXY®kH¾ÖhfùwÁŽ6B“wµ1¡‡;yèî 4 1ö}É$¥Íl/W½V‹è®=™”OYx˜%«]¼ÚÀz“Å«Œ¸ÑŸ¿ïó æ°¿zÛUÑmót±ÂW ¾n6 nãð„›ôq¶Å>Ÿ;:öË~öÇì_ïˆT¶endstream endobj 210 0 obj<>/XObject<<>>>>>>endobj 211 0 obj<>stream x}VMo7½ûWLÓÀ»²>m÷”&QŸ‚ Z ŠËÕ2Ù%U’+G0òßû†\ÊÊ&mrðŠ3óÞ̼á?3ºÂÿ]Ïi±&Ù]¼Ü\\ÑŽ¦w’f3ÚÔØ]ß\Ó¦ÂÇFNü’žo>]LöÎÊøAûÞ7ôxm¯¾Ò#¯Í×åò憊٢œãâD×éäãOïãåÕ¼¼½^³½jâƒÓf—öµþš vÊÑ/ÑèÇÁj±\—‹ÕòɬrκtãY<9\ íÉØ@ÂN–žñ©b±(èÑW^žÝ–7ëõÓ²Q_B<>Þˆ§§w·4[–‹DL±œ•«õ-ãxÕ ïÉï•Ôµ¤N…ÆVÎôîæDd1Ÿ—óHɽ!øQ¦RÙí'%Èm/I²åI85¬ãÛÓƒj[ú0I'ñS‡†*]×Ê)¹Ø+´òž—ô§Â>ŽKÛ)rõ„-X ØiE½ÚPgá§RA趤?ìƒ:(w o$A^¥jmÔÉý€‰l£ÄÉFË& ÂGδi”Ó£[>#•¿¤í1YGꓱ"1§OÔQïy“m>ÕZI¿û½2 Ú#µúóiŒ dʾ³V}c mU JBJB£¨¶mkø*ÌwûVE>"£™И³1€¹8€Y±mÕ߀.?õÈ©Ð;€`Ÿ¦ï¶H˜å_²wœVS_´J¼=r{¢³äó~-æ«rË,Ue$Q:…¬ÇOzÇÁŒÌýœ¶Ê2š;+šxx”£Ç¡KÇ]“`&Ûï㟶Ufšó¥î˜~iSÛüÈ\+?òB16›A²ÔpûyÔÏøöÁ|sn>œËöö}’õ>™ŽaE5Xq,“ÅrâhîMp¶êe°îHoÐS­èuª§_é•é~Õö[vû­BÌÊYVÛ;òJZS}_‹µ•½'kXåЭ–"hüŠ mÀ~jå­2hæ@¾ß2¯A‹¶œŸQS;ÛÅú«ŽFtèÄV˜]/v°`ѹpà°¦¿ÞD¥âJõ ˆ“ã“ØE}T *»¥¡¶=@A€ø,ïM¾Ø Û©wrê¥Óûà§É8“TÆÍxŒjÝ¢Wƒu¾ Ùó$T$á XI†!™ ¨é8-ƒa=Ĉ/ sDGzÕmZ*–,ØêE›]\BeQP¤K*áUuÉ“FZm¤®Ð°¢Í­sê¿—Q[XPA» QJ0“bq@Yy@1³«8Tˆ:ñ™}0´ æõ”Vð•ß9Ñù$Úà˜Ýå9 ³®Be!ú|9êI‹\0y<è{ï3óÿ"Ñ›ä2 ;àáPE;”ã’aˈã¼#B™@ÄŽiV°t1ðK…¢¨D‰è× ÅK®7†Q1ˆPº1ÊO½´ÓP5rÇH‡T+¨{ž ꬜@¤úÝÊóÊ Öb(r»ôÁrt2"Ê¥zJG¢†) (#ß½ÿÅ%zA/î8ºø:ë/¿³ˆ¸OiÀwA^óô™gZ’ šk…SwjÑØ”el¥‘K¢û¿]ìaL€4q¶ÂÿW‡'³'ßnßÙDxO½?®CFš:׿°ò­Öå1•Ú5:UÞD¤ˆìü9„æOÏ,ôf.¸<äùÕ4¼ JÈkzJ¥©Í9œÞ-‡§ØüjUÞΗ´¾^”׋ø€KŽ Ú :ô‘/ù\q}%£?zæ-óƒvvÅ7_o.Þ^ü ÂŒÍendstream endobj 212 0 obj<>/XObject<<>>>>>>endobj 213 0 obj<>stream x•WÛn7}÷W Ü4V€hc)¾Å@œ4úÐ8m¤€ãj—’˜îEYRRT#ÿÞ3œáj­qbÅΜ¹Î~>Ñ1~Gt>¦çg”W¯&Ç4§go/h4¢É OÏ.ÎiR`1ÉySUMM˶YÚ68ëiÖ´Ô„…Åÿé'›ŸÑ[lòMžc7/WÓ§´±4s­å–ZûyåZ U–—Æ‹S–O&Ÿ`8zžatð·« OÍŒ*[Mmë3}>>ÍN£ÀkÂá$EÎSX˜€vK ³fkµ©lF*ßs °3WÛ‚LÞ6ÀÁj\탩së÷ÐPG¸äÅÁ£¥i¡;Øö'é¯ëI^fôk ëÀa¿˜jYZ†Ò饵i™b— Y\ÐÆÁú4~éÁÕ.8Sº`lº%6«2@8,ÈÔd«eØ’­«ç1>ÏÞæš<ãÉ wábðbë5ó[Œª vnÈó»;ÆE‡‡_¿òÆ®"brîi½"¿´9 Ælk8 FT¿/ÍÖ¶QmF¿ØÖ­áIŒ# (‡ SKÓ•+ ñÉÕ('3@QõÌáDX´Íj¾`=½èøJ1*‹>>ÉHìyªL—ýølqüÑ”î%Ê¥¡w×ïÞà4K~_ÅŒFo=Þšhúá0_Ç6ã†J!Û%"ȵZƒ*nýSµÃ݆© 4¬õ®°uð—ßïßDt>è kì%äõ®ÆÞ'³ß¥ã[%6AûH¼ª•‡ëÁq{õjÆs“L-º¦`&¡„½‚.O‘ú8Ü·+i¸Ÿî;"E÷`˼k6LŠB>‘þŒ|9±¦’Öø€½£‚n¿•c'—Mn‚{sÕ<ðƒíc Ž™0£ 3þЦFÇnñ¼·h ¦;¡LÝ¢Ll¨nJ{ïU s-Ø8À3ºö*\ô˜ù¼µsÀPÉL8Lܾuû€ryÞ/MnÉoë`¾ü§™Q¤íGíªíFSjÚ¹§;Æ7>ËN..v·ÓO4ò(ŸykQÖF> EAYo,œR1Òd§™É'|”…Ü¢º §yÕë5Ephצ<©¤´¶¶°…žTƒËŽý;ˆýÌ ‚ðuU1MÜ?×Ió•'Rõ°‡‰±ˆŒ0~é"1Ì`z\¥7qßÛR|¾¥GiÞîšh¯^û™¼Jý­7 ˜¯ö3Ûò±ÂÓ W °MÒ2® ”A#¡|aê9 .ònnQ_6›g\o ªç¡$“ï\»fËÃV¸-ùò‰Öb*²ÜßÑŪYk6F’&JÖWk?24–Ü];}ÿªÔä¯FûNÐÅ–ïYabùúÍ2þ  A¬vr|@©ÿ@òA°„;ŸùD¶šeZ??>ÉÎFc‹ALvk»s*Ü2 “p7ñiE­Ø¹ÕÎè ÙA´èLÈ_zÉáЛÇ+ OÇÙ‹ó³]á‘þ¤XFM»J»ñ6ôàF¿½¼¼yÔsŠ÷„‹îÑý|<.nYkÏY±YwoW™øD_1ÆÇ§Ù‹ñ ÞÇîF´||¢!Mà9^sâ]0LbÃóã,„R¬rÈlézmÛµ³z#oK—z9Ç)š‘ ‘OF#þúfrðûÁ¿•iºendstream endobj 214 0 obj<>/XObject<<>>>>>>endobj 215 0 obj<>stream x½WMS9½ó+º¼9x«ð€±1U9e'T…%³µI²¦m+ÌHޤÁë%ùïÛ-í±Ie9-I-uëõë×âÛ^é· ýõ@{çéÞ!Lá`$¡Ý†tB«½“>¤}¤² ðã÷ôëÞÁèd½Üê'DzhŽ”y¾„B†¥ü€4ú µB-il`n•öàgc´î`ž‹%ýåEžv>3¥‡…ò3˜—Þ%Ñá&žC€FJ´)Šج©´óskdD_WÑ <ÿ€gžîô’îÉ ´ÚGIˆš}DóÆÊÔLàK˜*–qE‹N<8Ü윋B΢I±µeÐIú‡'ŒYF1ML´‘3•gõCŒ¤Ys ðåMÁO#@Üj·I{ÐÛ¸«°¯ðªûßVð¾âþ+Óÿéþ­þ éöº›ªIÄé™±PÎ/ç1¦‡*y¿†ìhô:›ó€~˜[˜ý‚Á×f9z(ŒKÊsÿÅ<'^ªg®™ñW”¯§¦œaîP@‹ó ‹j8ºh@+7Rxeôzz—e[Is©è«R+9[7J.8 puÔïjò§·ŽŽÂÉ?/Ý¿¸Úø"Ë"ä1TËRhÄt qb:µ8¥Qó@­¼á8éwÝ#ØÔ臧óÂzÂî¿DAÕ®t¨ö¹p~04FVèàå#ê±(Ñ6`! ‚Ês•·9è'ÇíîqŸr~’ È5œCƒŸŒáËb¼Ü»—.ïïys‡n›Ì¥V¼ð!:Ü~8û<¼{`Û-Hײ°aÓK!–  )ŸxDz O"/1K¼„”´0F¸¾¹îWÇðîæìÃgH’\IY·eŽŽ÷ð¹5bÓÖ©"¥‚L8‡–Yåà¾Içâ)¹$È Jý$l0$+ž¢¡¤ÈÒ’¯û¦‹…°bLÁ±Èˆ’ÈÊñÞ,&Г K¡SÔX—@'*Û&Œ}꺞ÔÈ©ð’«9¢y¤iV¶ðB,ÊÜ+nÏJ“Î)ϪŢ™aÎMŠ ¸ai](‡\‹P3ñ„u…f/ §¨LÈzÍe©5’:a—@{N÷ ‚ˆnrEj~¤þc€€”;ŒRKœA»šD/“ æÛ0}Ùõ.š¬ó•«ÕSÒ™ZÓ>G‘…3!Yêé7uciŠ1½À½!AÏ Àyn(–ð/ÃOÛq§K~ˆóäÁ¨[½ë;‡ÇÔO»Ðëõ’ý#5£Ô· -£¶o­ÌZýÃQ‡ðÖd¥$›%ÜPÆŸ½†ñ uZ½×á"/Ǽ¿ÛïÅ7r»ÃÃaº÷ÇÞ¿àÆšendstream endobj 216 0 obj<>/XObject<<>>>>>>endobj 217 0 obj<>stream x­V]Sã6}ϯ¸Cw¦a‡ÂçÉ$Àtw¡»îtwš}Pl%uäT’”á¿÷\ɉCHi§Óð€lK÷ãèœ#ýÑhÓþÚtÒ¡ÃcJf^Ü8 )íO©Ý¦x‚¯Ç§'§ÄIóJI÷’¡©´’Í¥iã;™8š©¥÷è>SIFÊâc.ô´SÌ/´u¦Ä$— Gòan¤µÒ†GAI.¬ÅšÝøù[í胜M¤HIp$Sä’ ã4Ö;£´U $…&WŠ ¥DUœÎQtä •±Ž ¿+ñ?•¥%rKú¢ôTšß¯Ú&Uç\D·K­U>É‘›Õ2ûZyÚ²fZÆô3Q¥››" Ë,²‘CÍôÄ/:ÇQ÷ô´^:/]ç7¿`öÖi1“߉WÛszÇö€m.¢þÞÚŒCôÌï×7±îâSqÏ@9UÖ¡u—a«þéÍ %ÆHÍsñˆéàó ¶l…ѻɘ|Ýž~´Øöª.tJ• ÐRO&¿K=%2‘ÆØ|ì/ð™=Æ;@Gyp¶§ë•nKªŒÈé#ðqÊÈ4¢_3©™ç¡ýðÚ‚å’2±€4)½dc’ðàé„›^ã1ãç!V•ºFt%é½²ïѵ«Ã ý8+ŒŒˆ ´Nå9a)×Å!,h@Ì…=F%ÉË1Íäl,ÍÞF>4½ `8jŽÿv_I£''ÈÈý`ç1œùT¡߬Zê¿Ý(ÂÞ–r>/Œ#å"ºŽP|M—Ï,ÛW²æ–Ø h{Â\O@=¨%•ÚJö „N$Å„¨Z©õú’„U‘ž}/E² 3µÛUD×>‹NÙõ`C\Eàq ·ÅÏ­jÖJü0ùÿE’lªF¶*\ÑsŹÊ^´r–´¼¯5ÿV1·°W•Jí^s±Ç2Öô±Ô°é Ë{ áJǾ¢Ðÿ*0?.ri}?„9ý ò CvûåÈ#Ö¬šZ"Ø;ôõSÍZ ¯ Iye5é)ø#´”d!þÓªÚ-{õLÒ˜vúý9lùfákÆÛ¿øåò*¦Á×þà6¾¾ùtNq½þJ É%ãèÖtq[¬˜ÂoÔ„ˆDežÒÎá¹ÏÜ^çÿh×ÛÖZÏoºyí¯“ù Hã„âãšî•Ëp<ãFұ̕\à†Q°MüoÞZ0Õ!k ö,p6Ù,†^pðMG{¶²r˜JÖ-vAÚ¹ÉÕþñ“ÈôµjmÒåÍŇoÜ!z;Ø¥*Bã^0Èa©/ãÝ~¸ø6øÌ·Ÿ'×6P©s¦Dmò«”¶å¸ðì„a_t‚óý{<渹€ˆ¿7ì»ÕÝ¥spuº¸»àÃöõ&NrjQ\ºš¶VÓZ'g<‰®q”)îi…y¤`»PغÁƒ˜ÍsyN_Š$Þ}œ<¼¾{RdûqãçÆ_â®Þendstream endobj 218 0 obj<>/XObject<>>>/Annots 81 0 R>>endobj 219 0 obj<>stream x}WÛnÛ8}÷W ‚v€XñýÒÇî&EÒl?,¶)Z¢l¶’è’T£è¿ïR²5hûbIä\Μ93ùÑÓÿÇ´œÐtAqÞãÇQ4õÿÈìð4£éhJ³Õ’¦³hº\ÌÉHJ{?h9‚é?f8¸Âñi4gK—7ã9ý­é3l~ì-–Ñ”&k|Êi<^E°ËÝ÷Zø6]G³Ö·æß`dÞúÖ<æ4Í¢IóíÃ^wty½‚7Ú¤Ècø7 ~lâÁ‡Ò‘°$è`¤U‰,í%Y§²ŒÄá …±¤ rx™)ëH§”Ë|+}¾ùÖ»¼ŽOf‡“y4ŸÀò€h+ŽÒ·e¡â=L«Â݆[áRKsé“~¦X„!Q6n¯ ½É'ñAãeŠP…MqŠ#ŠèêIšcó²ŠÖ­“9Ù½.³„¶’hˆšø íTªd#`UKŸä+Û¤lc§ „á4Ýë8–f#EnéYR¢ †èY6|EšÒ 0IÏÊíÙ^Ç«|AĪؑʙ̶pœ–@²,¢[m¤F:!avÒÉ„¾«"áÔö\³Ìjöú¬Íwb#YÖqgËmœ k%ÒH[±Gt­ŒuÙñ‚“øV¢®±‘Â/ì„ ‘¨Bbo«SvÆs6£¦Œ±CŽc@›ªNw[+ ²â·¾|¡.ývŒümUXw0:¦ê²ü“1±èç¡9à—Œ¦‡Kò‹~òéÉ"š­V‡C骀Ϊëýwþ~Ÿë[[ÌÀ’ÍPÿË»Žebw_ûgl¾M"@ů†]—D¿ø}»é„˜è€=´è° ÔEsyl«N”fsõ¢ ÔhÏ]”–EÌd± ˆQ<Ðÿ»äÎÅy½ý&cGÕ…méÃjEè‚Z'@uÏQ;¹”³Ô°%¢ Bâ E•※8WN=IB/–P Ä ÞrðÚ¨êAг jѪio”qAW`.R´ 7‘JÜl®. = |q¹8Ö%ºtç "Í–ò4®yX‚ç·8ùv™nR®ÀMµÉÛªƒVÒ’N}°ÏH{Á²‰´r´¯g'RHHZVnÑEx×ÎLyF¶ dä‚×\ ¹þ1ÓW[cV1üì£ÒO¢@˜WÄúŒâ½Ì¬ ÂÛé^sA*äŒVE5^¼=¯kT¥ýÇ+Ÿáb¬›ö[“¢ur\O®u4­xzM¢ñl5ŸÒp½ŽÖãÅ‚ÇÍ] ?ƒìÕ‡î½ö¶Gßðt{‚9^¯ùöMAÿÞmbL?GªNB)¡c:VPÅ$ÈyÝ/,ÐÏ(ß©[Ff^‹ì^¢ ºD`؃„¥®<W$Õ° CiÚzjå¢è©iðÆPu4¢ÇÇÛêK¿và D(<>ªfÆuFgü¶;|¼Äûi XàLé…™Ìý߈C +¬* øÌQ«œÆ(À•ÐëMúøX‹µí÷Îî'˜˜Öªm†MIàNž" µz€RŸ¬2j•D<>ò€é‹Sˆícw§K­˜¢êÌI&6ܬ•žlÅ:Ï¡“4B¸/_"SU€Õja4f~Ph_øƒÿ 4°HÕçµy­./1‡ÕׇóˆîýÞQ׎9WS†j <œŸ€@. K £rVf)¡CO·»˜ðLnàDåD˜0à4Ö—` ,ðÖ8¸[>æªb1¢÷Òð'7Ýq‰’=a“C”~$غöVò–à Gµ˜p¡k¼«d Á&Ô æ>4¨Stî÷/¿ìнè¹j_­ÓE8ÀÍ÷‹×3‘{ À\õý†ÂýÏ©ÚaÊ%§@y^ÿ¶FbWÅDÄéÁªs G©Æ+0ͱ”PÆ;\èÁ¦|ò0½ÓÜê°Ö¨]w„„äD> ¬¬†ó—O²DݰG ÿ%eAдµø¨ÈÝ–c¡¼èàÌ>œó*ÁÛ)ƒÜB6GÚë,9‰Æåõ¬Úê'£y´žÌh±\Eó)ÿÙ0b9¤M %¨DmXŸ.G^Té†e(À°ZÜA1Ÿ†áÕ‹àÅ÷}µ‹B#Ë-;[.øÏ‘d0žñãÕ¦÷¹÷?shQœendstream endobj 220 0 obj<>/XObject<>>>/Annots 84 0 R>>endobj 221 0 obj<>stream xmWÛnÛF}÷WÌ[Ä¢E]­¼%i]hcVÑ¢u¯È•¸ ÉUv—–õ÷=3»´&IÜË\Ι3£o9Mð7§Õ”fK*š ~d3ùCnÏ‹Óy–ç+š_¯h6Ïf«å‚œ¦¶þv±šgKZ.Öø¿¡|²Îæé­¦»‹I6¡Ùb•]cm1Ép\^xéìµñ,?[;{å;áÍÙâù;VgKX|¹öÍàâ"5™áÚÕÇóÕ N º«ù5ýbéóÅ7·ýl‚‡yžcK>åíqã"n|¿A {ººÁjN›î^"››b´×­v¦ ƒrÁ“ÝQ¨4ùàº"tNûŒîL[hRÔè ÆE­¼'ãIµ¤Û`©?rpvïTsI&ðúÁzo¶µ¦`_o¾Àƒq>˦°:*l]ë"°¯ã%FãÎ.„ ]KµÙ:åøãÎ:ª>°Žw+oêÝ Kxdjø²µ]8ó•Ó³{ó¨[¶¢Ò¼>òðÄØVžï_géÌt‘-Ä׿o7EM¾;,gÇ›vT[RÓÕÁðbÚ ù IÊè§'š'ëJítIÛ“¤ÔiS¾2ж»ƒv’Ðd¶Ï8Yßp^§¢@Èî¡Êhxœµ¡Ï{D¤2)+ªçžŒŸÅÎíö n’ÇŒÞõAXùJ…’àÏðÙrLƒÌ—AÖwÎ6¸ärÜÅùDô ~ Ý°W?KMïÖ˶AÌ­j—ö¶î8K—t¬㯟TÉGËHhIˆ,¶€(ûÁƒ§`ieK:šPI<îý‰©Œ"´ðçÑ”Œß:@¸ƒG[³ïl‡Åö©¢ž2¾¥Þ™Ü`‹c ¨KÍ® !HÕABÓjåèáA€iõSƒÿ•¼½zg ëÀ:p&Þ›î™'DÝCŽ:ál¸güÀzcK]3‡v\C~¿½c¤z˜y´_QWOPÌ Ìäñ•*íçâNßsÁH¨ºØ)lÓ°gϱÈCF1ˆ‘2iØ£ŸtÑ ³‡†˜%y‚i a‘v'HezÆÔ$VEç„‚ÑÙŒþˆ(*pƒ“Ç\`èƒ$ ÈßÓñ Ü^³;)-ðáQ»Ó BÓ° (’&µûNíÁ›¤ |Ÿ¢òÄW *òAC·ºP,^¶EYª¶Eíªú¨NIäÓÄÒ< +b)5–¤$EtX¥˜ÂÁÎÏ™=³âD*€—Þì±Ç ¶îG$h©½W?˜Š9J s@¬Ú€Þ¼ù‰8rù¿dE+îœTUשº¢ÆH¿`?VåÕbÉ.gý!ªo5¬Æ Î–(¨­©Q¢H ìÄ †Ò#+ÅWâ‰IÌä‘ÔM»“&4Â÷L¤²!õˆN¢¸_±ä$¿‡ÆAð„ ªAÚ-Ëp§‘wFˆØ×î±\׎‚DäçÊ4 •%½Û!}ÿéÁŸ­¤¿ÆU‘m"k í¶zšA }—)ÏÍê;2^‰rŠ÷ƒ¨Îûºý;³… 0e39{5êt÷œ>QÇ}ñ%Ýß›¥ºº„þ L#S© ñÍ1cRÁ…Îvû(ã‚ã³ûýL”ë.q/¥µV Œ?´6Ð= ~G¨˜« øN¹Å²@“EÌNØ ªpŠF¡[r=H8x?BrrÊcž±P˜àäÜ Ð³3:Ûg±¸àd¡³µ´ ¨^ïáÙ*·¼dœ5ö¹„Ö¶þý¤;h1wÅ’þ)»–òõz]ü'¤û×$Õ9êCKYC{3úf{¹¬­}Æ5š…JF+ã©ïr`•Q3-&IᦾëüñÌù­®Ô£A’ïGHHÁ=7FÓ“@ÂIBsu³NãjŽ™{2Éi<»Î0åc‚¼A[FÕOß²/síˆnãLÃ÷~AõN$˜·åý¼Æe×<óÅ<»^ÌðpÑy:ã«ßcÀ,è¦ke,TQlb¬‘.§çy6™¯×|:ÚD^Ü‚²Oó,Ï?¶P/©ÿ(^eï0°a´iõ‘ŒÛ¨i¼Ž­$Wò$É“y‚ª¢xžÁ*k¿â²¨|©(˜ºÑÿçœËº—”TAi Ƭç‹N&Ø-*!uÈȦY[Üð•=z;rÉc,LÉâ]ø00Æå²xÖëŒ>Ù~„ ʾ¡‡`b´¨iǨfü!éçñ B¡Ì‘¡¾ ôÄŒnÀ&/ØèÕÍ<1f:Ydë)~Èá‡Ø™˜î1mº`àã~ßx5øä¶ùjÉ¿ÊQ¾à½¿n.>_ü˨;endstream endobj 222 0 obj<>/XObject<<>>>>>>endobj 223 0 obj<>stream xWMoÛF½ûWÌ­2`Ò–,ÉR/A‚Æ@/ Š H¾¬È•´1¹«r))ê¯ï›Ù]‘¢S´ lÀ2¹;ŸoÞ<ýy3¦üŒéiBs*ꛫ›ÚÒýó‚ÆcZmðv¾x¢U‰«bÔhå½£vgðû22Ö´Ñž_n¯]r¦o-q9}8´ä ‚cgÚ©#²sÈV7Y §=祿¯Õ™ÖC×HC7.¹ Ê‹'¶¹=TªI¹ÉӜޣ0\`N>½ê[&¿×’0ÁÜúdn¯ÅÀë½sƒ²Rµ*µa2ËgÒý’}¼ f§B×7Ž[ŠÉŸm«¾ýÌÁÝ?¾ŒŸé”²‹©Óyþ8›2®ËŒRµÔbDïT³õï‚4Ùl™Ï–‹ž¡÷—P™ô¿æaPäw®i³íÀ3ü_×j‹¶´Cÿ ÌR=&Pá`»s%½Œp駱R—F¿F‡ÖÕ¨^ÁØà¢¢øÁÞÁ¾Zw²ÒØ)vÊ_§1AXÆÝ+:¡ºÁ=S L.±•ÆïU[ìýÙ·º&¼-.";KÑUºúrûcEï*ðÿZ1~˜åK£kê¯-c\ünžyDïoæ2”]¯¯ ÀHU´dð+…cÓRÜ.ìq¤ƒ. êÖá §x<_nóï8ZkÐsŸ„)15 Æ;¶JìÈL'Ð)ãH¤iITù»© klWÑDÞEf˜ JªÌ+H|ÑÔª×WY"è—Ñ€üaž1îŇR‚åòÎ’:F81d7,LÑôO®eÀû(QEŒ@ÊNjM¡ŠˆgàÚ›z_iÒß”üå´‰/†[ÂXSáÙôjzmsˆ8ŠXÛõù¿ƒz”Œp\Ýê”åuE>ï/a‰^žœuÚ_X- ((C2æR†Iˆº  ÂZÅâ”Kl‹Ëyñ`†ô B(Qà+ÒÛî¼ X(Øßj º®"»² 9|}Ñÿ[­zÃ5›ä˧y Ýž•^Ùæó|ÒŸîù6ž‹­J­E·¢ÉjHóBú”ô&øÎmÿüŠå ³%âj{Š¿¨q€FÖ+wBžöÎ{³ 1wÌ”•SX¢¬“uÅÿ\©F–¦"£Æ‘Ϧqõ`À/é|r-s·j¥*ý˜ ¬Z†{×õ¸`Þö7I`ù !Q " “-Kº/J¡ (‚±}×L¼P—•o3-~Áü1r1á6›ˆÊPTÈ!–{ÀE53Ãê=T%v3Ä8],7UÃæ0ôƒM–=-óé’.í;¤´[Ÿ[6}\æO“htœìM‡<—þèh‡Šï­Ì¸4)Zu#Ñ'ºb‹¶¡›vðäö‚뫎ÆÅ®tÄ!q£@$àùËõ^ðÐϰ¦¢lp’Þ° Õ¸n'ÿ½"–Bú‹Òø6Ê–Øiòz§Á,â늃p• /þQPOX|M¦øV8ÎÇÝ?ø;e´‚4…ïŠoféXöô°d|g¦i Œç|åãêæ·›¿í|endstream endobj 224 0 obj<>/XObject<<>>>>>>endobj 225 0 obj<>stream xWMsÛ6½ûWìL•gLÚúð‡ÚC&éÄ39¤N':ôà DBb’PвúëûvP”Z›NfH`?Þ¾}»ú~6¦+üÓ턦7TÔggW´¦Ëû;i±Â×›»[Z”xX#»õÆ6ä7šÎßÎFN{ùKv«[%ß¾wº5ÚÉ™gÕµ¬4©¦¤Vû®mÿ³£gUuú‚Ìêøœ~1λ ²ðÐîŒÓ8Í®(Oó âm[[v¨†tÛÚ–jíœZëœ)¬®ù—ÀJ]i{¶Ñ„[!UU{R„ãdWˆ*ÄëhÕÚúÄ1üÙå7]øœîq_¿¨z‹Ôz,žŒ/6º‰xÈI*pÉyÛ"feÛ:@,lÅqvˆ$Û*ÀHËý/läò¾èkM®ókIŸ(ú9)ßÿÂ׫»ñ:X9Tò`å«©M¥ZòU­²CÞœMÈr†Büå¾Qµ)Tõ+g¼§Zíi©8å©íšÌ›ZÓÈSð`¢ÑºÔ¥pA t8 K…Åm»t–‹”ÓÇ| ´ÈÈYfM`]J>¹glK|LÞíHj˜²ÇE©X“›ë®óŠ)˜fÄÀBdötL¶«JžKlC‘É„ “ï˜jÑóé¤÷ñÍ1œ`Jä‰@Ra³îíŽJ{WÓ4¥~Á¥¢k[€„]@¦5OABŠ¥wPÙaPqžâ>² ÀÉqtB ã#62"qÚº½óºïÍvÆo$·o¼zyk½B¯ä~:Í±Í ãPƾlôNÖ°wì´'dóy>g+:pH’:2Ѻ6ÏhS1ˆ¶“ø‹í< ?Èi¨½xy?§ñ,Ÿ†53›Üåw²â|Ö¸ú2d:á<#?É'G‡Q° ’­vºæ“ù…e±Ðe‡w9=¤Ž+ ¯f¥^ÞÅI涺0+S`¡”.8ÛHqÿƒ·læ>¥Æˆ§±Í˜bƒ~î$f!@ ,ÇË*^ÇûÜQÑÆ{ìD;1•:ñ–Œt. ©€Ï7åáЙ!€´HŠÇФ<9ý? ”¼ Ä]Hb4¢¥-edé”D Y°’Eá|#£PL Üe·òtP4Ì%eæ±q!‹%޲ÑAÕ8¶„MBm†æAÔTw˜)P*!*~{4hcù‘°JZDò‹©"1§„GiÖõÖËÔ8ñž~%0´Kš¨"ÅX“±ï&Í"YÊ$ɸ™Ä²Íâ kýdF77èžò-:,ÂFÉ4ÏÒ©ìöj·^é§YBã[úãâ쳿-öUÌendstream endobj 226 0 obj<>/XObject<<>>>>>>endobj 227 0 obj<>stream x­X]¯ÓF}¿¿b„*ĵoœïð‚€‚Ú‡‚Ú¦U%.{íM²Ä©w“Üñß{fví$¦Ð!$pìÝÙù8sÎ,^%ÔÇŸ„¦N(-®ž/®ú´¢›W)% -–ø:™Mi‘áa‘öˆ6Æ¥k]Ò£Åû«Þ¶®Ry ]:]Ó‡Rú#}àw}Š’a<ÀVì"z+ë¬Î—òðΰÚùý[]Ûª´·½ïØÄí£°>Í«tãWXVefßñ¯ ÛùÍÍ«Yëp4Çc9ø]krkMÛZgziJ5ç?(­ŠB•K;‹Ï¦¤ªÔT-±¯ÖØYYkîrMu´×tX›tM*ϫ֓«H¥©¶¶ãL-w9Œ-«ºPÎT%v"k‡ªÞ˜rEãÖôÇ›EšG…vë*ƒiøi5)x ¶ªv&Ýåª~¦QœSTmŸP­Ý®.ábäÄy¿ñÏÝ{ºÆ]Ä–îê5Êl\ßëtÇNÅ´XóÇS¬) å3£a[CYJÈ^ ãÑp8^&c]å™üTáP^ÀÌ”ÖqÆôºrš!¦þB u¤;M™Y.Ñ#ð …e/åЀ"> è“éäòÔpÖ—«©¸0)¨A©Š­;’u5ºàÛU å¡ÿ^€vKë]·‡Ú„rÎç”^Aº$À®É÷í£ÏÅÖôÑ?¢+$ñ´ g1øZ $áö¢'4+O”"›¨à¡6ÎYІ¾1”¥ƒÎsO19ú€ì±t*EORµ×õZ«ŒîŽ`/&"Ý ïŒ*·5ØÀ™½ö˜-ŽþdŽ’€#åÅ[¼ðrOÈê\¿ïP- ËÌÖÂu{>çCǃx> Ìyæèùë}â]ºøÄîöåS~8 ØQ&Næç)f?&)ï^W Ž}"yÜ êe?A;`òuZìÁÐN®<7@hÆ Ÿ‹‡]Ò ðxFv«Sƒ.Á»]Û}€³MJ{À„Q–Š‚ô8ÈÍ7e{»8 >Ìá+Híe=%qÑ™³=Ô.¼àOâ‰ÿÖ:%µófùñŒúp2hQ J hô¹½wMzÏ3°ÙV¬q ¥ø¦rè`Ö%Z}o,¸ÄÜBœ‡Ñƒü'ÏFšÐ.Á•©-_lnVk¾¹ˆ®ù8s­öí^Óc~S'Vp³ÎÈ ›:@(r0K³<´÷„Ž»mºa„»ž@9¸Œüý”'€ЧÅO°î±Þ®p ŠP« Ünß…$r©Sp*9,g ö¾ &>5'YèT}+küN÷|ÓÙëŒAz!/Ò‘QÐÚ»âWi7¯Fá*ŸLç¸óLð?Í…ÞëvD \31žäx4èãùÜ7íÏy8üÉߨEÞÈEXü5˜ÌxÛËÅÕÏWÃF`endstream endobj 228 0 obj<>/XObject<<>>>>>>endobj 229 0 obj<>stream xXÉnãF½û+ ƒâÄ67qÉe1KŒ tÏ¡M¶,ÎP¤BR^bøßóª»)Š‚Š}0ݬ~Uõj•þ¹òÈůG±OADÙþÊ¥G‘+ÖžO^ºÆßˆ\{‘GÔ(ÚB&ð‘úñpú"pÝÔ¼÷ÒP$dŒyÃÚá§¾H°ãÿè “ø‚%c”yM—¬uÉOÁXèŒø©ð&Œ,Ë ‹ŒXæçí4¾,ëaF–%Æ(óš.Y‹÷ÁZÄëd`d\š2²(3`,1Òû2o§õeQfdQbŒ2¯é’µ(³Äi,2²,3`,2b}™·Óø²¬‡Y–£Ìkºd-Þû‘ð’åY–0–é}™·Óú²h‹fdQbŒ2¯é’µÜgDâgxÚG–eŒEF¬/óv_–õ0#Ëc”yM¿n®nn3ò<Úl1x"€nr1.èŽkâ¹hÊÛ„É»ˆ„‚ùjj´ÿÔšŠÐ9ï€;~ÏN(Bÿ";õ~&k3êóAv¨¦ÊÒÓLé‘eIhúâ©÷#­9Ñlõ#Ùž˜àl•n°öÇiÅ“êC#½ÝNv¤aL'ë8ŽÂ1(d-°¤¤ü ÉRºbœÉciô±\D¬+‰DâÅg%aÏÅZƒÏê®H×EÍ úäàŽ Ñ0b¯ûÜ:1`ªr‡Ô‘,y–]Ö8z’åQ­¨>¥’+èw£c$‚6§— dZ¡Ã|†ÕvuƒPTÆš~áê(>ö±e®ÊT®0 Æ$…zˆÙ²#Â.(ÕM޵kÛ`æšQ'~¶! œõ¹W¡º ì}&tm?¹Ìà­^,j½2žQ¡‹µ…=®ÃP°][<õÈé'!4Ï … §¤rÒõh}³=bƒ5M$یÌJɦøwï¯ ¡ÄŠýt>/XObject<<>>>>>>endobj 231 0 obj<>stream xWM“›8½Ï¯èã¤Ê0ã’Cj“Ú©Ú˦6ñ!‡\4 leyÇÿ~_·ÀØØÙ|Ô\ŒFêׯ_KÿÞE4Å_D˘f ʪ»)m°°HÓ0™Å¥óp-h.£E´\P£©ÀžÅ|¦‹Õ°žÌÂh5Mýÿ£4 W?Ø3Ø¸í£³Ñŧq˜^Åñ3~’Õò‘\Z¹íéÝúîáqEQDë‚âU8‹’9-`z­uvoŸ¾þ­*ýjýõîžL]XzQóŸowªmuS¿åÏh±D&@Gï?êvßÔŽTYò~£žJí(×…©uN¶¦v« ¦uÖ’)¼µÎ˜ÿ8(ñ1 §sTGÓ9Ñ,ŒÙxm[r;™Âè|B¶šƒqšL‹2ÝrÜnUK•j³-[¢pÏW«K«QBèw¥‹0U‚y&Ë8a×¶!ýMU»áû,$ÞgÛºö±û¼ø÷ÃcÖA;¥ ã$~¢n;É~ÕÜ56“´‡’œŸës“ͺòþ˜ªso©Ôꥫ”ö(_”Æ-Sgš1H L—\ÙÙí’Hþ)Eói¨i§a*Ñ¿/•sº [’pÖo™¡uR†é}£Ukê u›‰CÌuc^xñ¯Úµ ÝH5cq²FI}¨¹) ü®[:¨££ÖRÆÆñOÊ8p’>@¦!áБ¶€€×2[UR!Té½{Ÿz­Œ²ê)åM­`·Ò­ d%D¬¦5`ñQ0¼%'<;áÔP¸“ƒá*CZ%C<òõNNFþ[“mikˇq²@Šûû4¬´’¥ÂjñídѨˆÄlŸ"Ò;sÍÛÌÈag˜^@ÊGÅ ÷š f¨’äŒÆ§lfi¸DŸHãËáA0ÞªfãDJs?¥PÜ¡!>™Ê”ªáH8ùNÜÖ6-¶©&X6¨4szX%[0 XbºƒROù x¦1[ á)ØÁŠÿ©ùº°cF[ÓÙ¾…€=y:°ñ\5]÷íëçÚ: ¨t¶Uµqƒó§od1ò¯JÏìÆl6`z§ºã4å`½cÓžšœ'íuTÕ\!}ÚïvÖaYÔy¢ƒ®œÕ¶Çâ`Ú­À]CÞ=?/‹7‹ƒü;èª(ã î'¾©´öÙÑ~wj_^Àõåþ„ta÷è¨N\źßÿA¦…ýòJ¥+ˆÑ Å©¯ÇàÎS0ÔÁ‹f®K^dEì“`ÃÄ}÷ÄÇÁ¶ÞíX½¸×ø£'ʶmß°ä\Sk£kݨnœþ½v:•,ÂÙ<ùù&Ãýb6;ë1ÏB´»0ùI÷ÊMƒ!\Cz§h· ©ýºA„Ž{ŒÍuá&œwe1b8EÑ®fÜ_`?X×ë8æ‡ ZÙ²ùn¸ÇuþšMãа²Ò•mŽÒóei3(>F½‚”:¡B6óë;}Tzß÷oãOÕú†¡_™…<4û¬ÅP+bß™ƒòžzŒOŠªHù…†“A$äÈÜ À¸iØØ÷‡9]æD'Dy¼lUUºÁ%æˆAˆiÉshxÌIm”÷ §î@pÀ뫤x»^ØÇwXò[$>¹úÕA»ñrº:#ñèC qì„ì3sU8Ìdò⹆öùA÷›Ë”ÖKÅqÕäãï #û/)P_?ïyðû±Éý~©~ÔÈü>ÝÏεÒëÝp~äx \½{»¿š ¿I »àþ¼d¼uœ4Ó¥»7]_~:Ð~T[ñ5Œvœ>nÎù«ÃGÜ?«§’ 6ôW­ð艀p+‰êÔ¾ ¾=/<ò(?în®A&F ^ŒœÓ4`Xùy ,—ÛÇ ?¥¦|aí„}³&øûg/è]Y—± É9—gÊ•©¾@ád2À3dËÍZàNÔOƃݗ¹9a\˜§ù,±‚þ#üœ`y¢¦~±Ï:ÿòŠ™þ« gä?3ÈØÁ¼—Ùî¶ñð˜ôïÉé†ïIÜøVr±÷c7 õª‹‹5Ûân_°ÄC›ŸÃ#ÁEQ.–ñ”·þ¹¾ûçî?è½ÙÇendstream endobj 232 0 obj<>/XObject<<>>>>>>endobj 233 0 obj<>stream x­WMÛ6½ï¯êkÅöÚZ»·í¶öÐm}è!Z¢mf%Êi;Î"ÿ½o†¤,;iÐC ‘%r>Þ¼y3ùx3¦þŒé~Bw9õÍÏË›mèÍÛ9Ç´\ãk>¿§e‰‡e1p¦6•jÉ7ä·š^/?Ü ŠV+¯å‘jí·MIÍZ>ã—•r.œ|äG9˜Ñ“§µi¯NT¨ªrg{øÕÁœ±Î+[èή%ãň†ã»l‚ÀïÑÜ9û ñüþ5·¦Ø’˜E Æê¦=ѺAH¢Y}Ð…¿%eKªÕ3Ô9‡yãtÁ^Æ^zÞÖ^·GÕ–Ž”d’°)ßî 7™±ÆÇ´àšg]&k“Y6“dÞ5G:j²ävº0ëS/Æ.ägã‹­¶´ _ĨIÈá¯tÕØÌ÷ bWN#Àxñ*|¿ÊWQÛ4µD÷æm©À€O§4ì‚íaý'޳U© JÕ!âO}Ç}nm=œŽ1)¨± ª(°ì2ЃjZU(!g Ôøä0Ô3£%çÝÁóÞš{- Âø5‘jî–Mµìз̄Z'án[]ry•ÔZÂJö#T O³»Ð7ÃÉ<›KQ“®pô‹^ Æ’@§…Ê—xL²ÉÅHÞVSy¾-‰‚¨LÙó]ÛLBd8]ìG0 »ØJÃöxÌxãê+¾C…{Åjr'ëÕ'M0v“ÈÂÇȸŸÉï°D|¾SµxÌsÎZR’'¾>[d³Å<¼g³6j7A2hÕ”§à*iH¶ÈFù¤GIÈ *}%S!po@ô²dÇ” DAÁW{O{<µg}:6m™z6 Á~\úÒ8öÆmù]À•öGždA]W²oðSj±DQRaû§2ú˰ðqp+~-z ‘¸jJÍ…CÌU ±ÛªʬM…(‘´„ |TÖKøÂ!4Ú¡q RmfW©¸$‚i®}J«ô¨¸.šªi¯ª@:yˆ­/Ø%ãHXx !>² „Á¿ðÇIžMçó³~ÔRóñ"›çyàÇY"ú&~la8ͳ»Ù…}á÷—}–÷!謪zù3®ÿ.ßÀPkË„òªÂ,OEíVèÕU(-¹= ËQô“0É:a’ÞAy@äV»æˆa‘ãyÅtà9bTe>+a´Wî™ -5³ZGX]7øN·°Pë’Ï‚§]‚ÒÑdõ±ŒØiŒK5è.!–þÔMò?àÉõUš1^@I/»Q&eƒÐÚ˜` Ëì”±žcÓÍÆ´•ÚWÙNzDÎâê•ëÀ+š‚Ž=‡v»ÈüjÄýúŽG³liE, uª@ááý"›æ=¸q.hš…Å©G «?É^7Ñ÷XÌ[ g±ÃJ#t ;iÍ„]·ÈŒ3£5è•N&šHH%»Æ¶×}bH°»UaÎÊË.ÅA ¼Â6(W3쬺 fZÁââ+饾–Ì×£†MzZk¦ Ý8z™š>/XObject<<>>>>>>endobj 235 0 obj<>stream x¥XMÛ6½ï¯àq¬}Kî%h‚È¥A zÈ…–h[,¹’¼[÷×÷ II––K§-ldkøfæÍ'ýçCÀ|ü X²(eÅéÁg|‘ä>÷sdÒ”ù< Ò KY'Ù"I˜ðp“Ìß' O|£ß™ÏãäŽÐ bW2‚hC¢ ãá+CF§5qžÝ1ec×uÏ^ŸÅyšfNâGkNœ2„›ã­ÝLã‹S1âX‚ØÝ1¯áÞ䎕§Ð âdÄøb·sôÅ©H1â”XÁØuݳïƒçéM’„¾ÉW…ãšAܤwì–Žî8ÍQ¬8%V0v]÷ öY”äÜGw™ÚŒ­¸…f7+Æ»¥Æ·&bÅ-±‚±ëºg0ÞûšìM®XYq Í NVFwì–Žî85)Vœ+»®{û,ŒsŒšÌ+n¡ÄÍŠqÇn©qÇ­‰XqK¬`ìºîŒ¾Áì C7+n¡ÄÉÊèŽÝRãŽ[±â–XÁØu}Ü>¼ÿ¼aAÌ#¶ÝciIi³m‰Çmñø¥Ù·ÝI UÛ0±k/ûT‹¾—ý»íwÄrèc^rP·-—½<íêª9°¡eíî»,†þ‰U7H+4 ;‰+ÛIvU#K6»ör8âÉHÃ#R8ߢ)$;ÉáØ–¬ÝÓ÷>ó8é¥3x'<­+cÕyÎ~m `1àOÕ¿Â+[Ù³¦XÛÔWÖ_Îç¶#Q©MUö³öLLôO+Õ;ð"ê¾UâÚã¥<ë+2ÐDQȬhO'Ñ”X÷ö²ë‰¬I›§AžØË±*ެzY¯ý…¢1üâ©|¢ãÀj;ùv&*CL{ζ0aßÖuû¢$vµ„³0¤«þʲ¬ÈMQ¯Ü¤`Œ0ñ,ªZŸ£Éé€J'•Að8Læ}ÕôÁ€NiR‘™Cg_´Ê…“¡ýbX s­0ÄJB·‚W¶Î8ø8ÖFƃì~÷—š„Æ<¸eðÃ4OB=/Bn¬Ü-ÛöˆŠz;æ<œ‘µñ¦“[“eÑÈoÙ»IE FZ#Ób€™>{iÏHZ=|Š?´ybHDwóË‘ìf1aiøH°Þß~ǘ'Y–ÆËäµË!ðŸ($ríÌÍþÓÞµ&¿öå9z!úî&Ñ[Ê––® zǸc,6)Äkj%fá¨Es¸`…Ñ»!-*BËMÝ sEe_½ó@ެ¶ïåe©Ò3 ‰s©õRdmAºú@ e‰âX”aÈ´º#›dÑâUÖ‰7ª® ¤îfté#^ÛUÔ à]5›ÇÙ_·E=î×(u¬EXAIñ }­:ãÃ<{©†#Ò¹¬°‚ º'Üèŵ¨«Â¬è‡Nœœý|Zº²X®L ,Ð|12E'á^ÉvWÕ÷Æ}ÂÜ*z}mÐBººÈ2õ´¶Xû»_ß3Fã{¶ïÚ“~ûU݈ZÀÇ%]7;Ùôt;˜ƒ«ÉbÇ;ÉlýQ<«/( ûÄt{ÀPÄÜÃI€ª^dÂhš*vš’¯Í3þa÷ITfm[³Q^‘ÀuñÑAuë¤N£þXõåÁNè\1ŠrL=|¢[ þ yréeù}zÿ96ËÐOøE”¦ªI­¯:<¶E˜»J_R¼QÎËð3 ªǽ5¦_ÉH* IÛ/Û‡ßþpvendstream endobj 236 0 obj<>/XObject<<>>>>>>endobj 237 0 obj<>stream xWMoÛF½ûW rR‘¶e[¶rk‚HÛ$m! =ø²Z®¤É]…»”¬ýï}3KJ4•´E Dä~ÌÌ›7o†_Ï.éÿ.évBWSÒÕÙ›ùÙ­èü^Óå%Í—ty•O®¯izwKó{çz¤KÂGU™—ó/gÓi>™ðûb”…fcjYå•ÛY~=½NKòòW"/œßßµ—g—7wùlrGÙä&¿™ð%ïòUNÖQ\2OªÚ”†=Ú¨×ÆQ¥ö´0 ~«€…°1Úª’jï«×éòçǫ߲߼gD`;ÿº ŒdýÕ_Zk²wÕñl?ŒÒÑÔG¿#U–$Då´ ä—$×µw'7Tàˆ0zRÛ‚Äí£ŠÖ»@!úÚ rªó}DÊu+¼Ð‹å™Á>§>ÂPµrÁòõòØA»ž+oÝ ok߬֯iiëË=ÙH¼ ´±Ü”ª&¿øbtón`»ÛìÚM´³q³M0uV˜¥uˆG|KPáŒåû[Wçk<áoãC° ÏÈCu>"ó.˜@=¼Ø]­`ƒæ(a–¼ì8b¿ ¦Ü–6îÅ8ï,ð'¬ÕFζNŒi·¶z-nE¹0´„ïÁm…3…ÜÖºÿÆ#àÒ¨BÒ —UÅ“öÎ5¾u²n\&—ljÎy´ ÊÈJ·B\›Ú öÎy[Sa‚®í&Ú-‚^#Ññ\Nïê²L¼­·pFC¬­–íY j­Kn/LÜqéas5¦G¤ÎѲöN[Mq¿ArK–¨• c*í£¡·¯^égµUc2QçmP‡Šÿ†û­©ÇL/8ö.ª§T6€ Ž5:Âá3 )aTµ©!¨%gTÍ|-Œƒ;ªDE¤záhå¨6ÙRiTSÚ—¤Dh 7ö€kGz `ø02ªŒ°·&§ÏœFqC…àre¹ ^%Üd¬6É<~‹¤®|“õç§¹.`åÄÊÇ»¨Êà wZ„st—]I)][HD­ñŸ(Z/@Dež’û§{I­kUö "ÛR‘zk¡´«u<ÐJ±ö…9ÉÜ5D á¡J­[›ÚŠÞ¡´ñTS ÌÜÊ^ ¬jÊhYÙ{GrêÊ^’Â!å~(<Þ‚b‹=­ì¶ãï=o>£ƒôReâÚHu &så ‚p›à*Å«$mp(¡«† ªzÕT •@pÒºÿöÿ¶˜ëÏ.°”§¶ðÃ.ÓËlïò·Þ?"úßJ¥‡ïíú÷>öWχþ}3œÿÕܘ‰]çH˜A¯Ûfl¿!CŠPõ µÝiÎófÝêëméÆÀР!w1B²|SÚBx—¬å‡‰£uBHt: ‰óqç‰;zÆ ½L a A€ÝÄTå¾~¥È AO~ë)-À'À¤Ф€eÇ'ÒfdˆõDáçd‡9¤6 ².Óbj$ÄApÆxh&ýÈEx"V£ãÃ˰?-™â™ÞÞ“g¤»0%síÛ˜„ÏØÂ/\áQMcân\ôΊǾAd¨ósxÆë’à½GKG¡Bþ#øžX×8°³0t‰à2›Ò ³‹Àœ½©=ìW•Áxʱ ¬qW•wð‡»&LÃZ"aÞlÇ_¾;²ãñnA•@î=-Ï:ýĬ‡YEÕûc-b𖉲Á‡wYé‘v´"0¸Jó)÷åf‘É­&ä”SØåà€+б%àØÃ…\ˆÝô…j_+Ì„‡ƒå>§Ÿ0¶=TŒ j* hÜÜ¡J<=ón«!©Öv.˜iSäõé¯ãáe©j´)„eç÷³ö{o6Ëï&3Ê®îr|qâ£ëÞ®0ÐÒUûéÖ}Ž$¡]Ý·HH¡Iê}Yú'À™§˜1 ÙÇóûëî›õbš_Ìnhz3Ë/ÅNB2š7˜úqÞŸM.nðñyMÙíÅŒyœ_xýúvš>^'Wüøn~öûÙ?Ž£ô$endstream endobj 238 0 obj<>/XObject<>>>>>endobj 239 0 obj<>stream x}VMoÛF½ëWÌÍ ÒMå–Æ1`hšV@zÈ!+r)nJrîR²þ}ÞÌ®$†N IÍÇ›73o÷ûlIWø[Ò]F×·T´³ï”åyšÉçìú*½¥åò!Í)¿½Ã\>/ïèÑÒ§Ùo«Ùmèòé6´ªà“çËô!»¦U‰—U1ÿçãªhhcµ#Õ‘éü`¼Ùi¼”4tª]›Í`G{u oÉÙ?úÚ8ÚövÝè6¥gO½ÆƒG_kü¢ ]ê®ÐoV߀ Y^煮۾Ô=©ÆvRôõ+ÿ<ïô‹O¶Ê×òvq‘Ò“éo±ŠF9G¶’»þ¦ OHî´ê‹Z— Úצ¨ù“¸ÿn<>wòŒjH¿¨vÛè”?Œ€¬`#ݰÕ}"I˜^Ÿ"³w©+ÓÛ‘@?fkµê`í©b¤!sþY5ûËÚV’/8¼à¥}oí¿¦ÛüÙ¨@Í<¥ è×½êBǺ¨°ŒÛëæ° µ®,µê6pç>05L\tMiU+?)RP.º®ŸÉ‹‘9š ~pmgœñºLé'4Å o·±9“äµÑ=·ð9zh£äø(M”ÇÅͱGÙMz#Ó²‚ßàÔFs±çŠå›&/MUé^w@d‰Çù-=wò‹¹Áš{ªKRh µÚ×Ct'Ó¥8ɨoÛÞ´a-Ж«zÔÕ·hŒ¸s^<÷ÛâПB;§zYlËΔ¼:šª¡i0k›¡eЗhð$§Þixšng %¨_¶) +Ë_ †s÷ †ö¥ þ”ÇÁ°Ã(RT¦Äp&y]­J»‡Ià›@Û©ºa;ú2?­ÕZ”Áô`Y åô—7)}æ5;y¼Jd‡¦dD2ØÈB¢ ¡µ2ÀðY0Gÿˆ_Vᨴòí¼©£]€¬71ÿ9ÝÏZZò‘ÒYDÈÖG± !F>¢ªw˜pØëÖîxr¶º0•aDñ½h²8òþlã9rn¦:–&¨ÓûÿÏ4!ðÀã[ÅQš_¶àÔqî#Ö=ö=ôBc‘õTfJͧŒÐ;àm4Ó5;ªHìúQw ;Á±ŒÊ.ø×9ó <¥cR®{Õ„Wúÿ7VÔêvëqŽåZ"$HŒ¤×ˆ£«Í6ßjð¶Å7V·ßKPÈݔԔþ°Ú…ÀÈÎæ\,ž,\K<[ø €æ a“uß¡²Øzü3|¥‚Ô3adÔ×p``<ƒq<^ⲫ\árºÅµïáæž/Vá,Lh…ê{£Ÿí’»«6züO©Éïnù6Xγœ=?¬fŸf?(4eendstream endobj 240 0 obj<>/XObject<<>>>>>>endobj 241 0 obj<>stream x•WMsÛ6½ûWì¡3QfLÚ¢>,µ‡Œ“‰g:m>Új&=ä„DÄ$  dMÛÿÞ· )YTê$ö…±»o߾݅þºÒ5þ‡t“ÑhJ²ºx¹¸¸¦5]ÝÍi8NG´Xáýt6Joh‘ãq!oT(lN¯ ¡6ëç‹ÏWw3›ÃI–¥Y†Óƒ[ò%µ(i¥D¨"»¢?ß-dIÚS(U+Ùº¢†ë:zØ”Zê@FTÁv|üÓ§J?$Ú<{–4–)ý8þ5%ÃQƒŠ²´;OÖ( –p>ZzQ©ÎTN¾Þ('Ká}Þ“68Êdíœ2¡ÃõqPÙ\•0« \/Ò«_ßýññyJ nœÚj[ûrO¹òÒé%ŒŒzÉF„¢Kw)<_Y‡`üP´5¢ÔaŸÒmˆ6p¨î.–û^PArjŒ—_8L| ]é ·ˆæS|€|!r»ƒË–sk¢‡ø®Ãè•p²àtM~Ù ¼+”!T$&Pã}û ÃàÀ zP²æ¤ºšRšÒöcP™¦ôGw@Ú 3Eé{Y:-¤ªMØ“"¹$ n§½bhÝ)&À)_—á€xhÊç÷&ˆ‡^xíäo®îd«m–ØxLI6I'Qkó£Q õ£9òÁ áÖu ù’ÄØ[·ö//]‡$ãi:šèÐè-Y{õ5ɨ­ˆ°ôƒWå™¶qža'jœl'²[ [«y”É‚XZ¢JZùKÚa¨Š¼a†ëÓNÏÓš0m]i¥ðê'`°Ú”±¿AðO¡ƒn0áªfÀáï¹ï:(=Íë—>ö$j~*"–°Ê{%E&üÍ€ÈäÂatuý¿Ç‚hVÇÙûÃNjµ`l`= „mvÓÌeèìÄߣ=#1~p~i‹Y×´ìªëfZu½ß€“Ú¼ $ ?[³CÍ :6];-ʺ׽„c³á#®Ì“ÖL[‹Ã”z®ÓØ)+Ë»‘auÓkЬtÅ lzêŒM^ ä•É›Vpwà7Y¦6>(‘­Ž†‹§„…1É#ÿA°P㔉[µÙÚr×P„ßmãÃá¶Æk¦Ÿ¤8WË€ª1N™Ùƒß°ÜU&¶ÖŒ Agsœí.µËϽœ!™C%ˆ~·˜Õ‘}ö²qVò‡áõ$c¥Ä ‚KU»ÎA²§¿ù@r3OÇSìŒî–SÅ{ÁpžÎ¦ÓÆ è¢_rñ¶®–ß×Ѷ=u°íHO²i:žÍŽN‰þ%ü±Ñ#¡? õüÿ@OÒélüô!âçÓc˜'°çÖº÷ÖãJ¿ýòWÖÞCïïKµé9¡}2KçÙì)ì£,åÑû ´û`·j±ß(Â…QâF+›|ùgðÑ×1óäÔløòù<¾ ¸Goy‡&ÿ»_ÝÛëQÆ*ÎÆøµÐÝš»~B‹½†ß1@w,¹¹žóéÍùωñM+êlÂ&¯¿]üÁxãÉendstream endobj 242 0 obj<>/XObject<<>>>>>>endobj 243 0 obj<>stream x•XMoÛF½ûW ÜC@¢-ÇŸ½9i\’4šukr%nLr™Ý¥eÕÈï›Ù¥DÓNÚ"@ “»3ofÞ¼éóÞœñoNgGôò”òzïÕbïVtpuNó9-–x{z~F‹ùär´£ÜiŒmH5do>é<]R^)ïéÅâÓÞäòR7ò™V:xR]°5.媪6´´#Óø š\ÓrFÝT:]έ½}«j-·§üÿ!Íæ/³# ˜8kë·]}£]|ýÖº÷Öª¦ˆ¯|°wz±i£9ò:P×ÒÚ„’ ½T]à¿êàÜ4Jãɺ1^O¼apòOC)Pâ9ŽW1øÞˆ¦F߇Y«Byý"£·6è)N© Gã=˜4ukR¦t£sÕyM¶ÑT×+±1Šž³7e |.y–xMcB ¼Ö¡´…ŸR­UðáÕwy®uÁFŸ?|T56é{wA-Ž‚Zç¥jŒ¯iÙ59çÛ“þÜIU™0skšY\J[gs€aÓ¶Aåq&ÇàºDþóe¯ù’.¨AÇ¡ôHjÇ‚ÅÖ6 P© N/——ÛVªšÑe4Ëdf™ŸLOE½«A¿TZ(Ûn¬«(×÷‰OH¦Qp©*=ºÃñ½ùß«X\«Í4 ’×î]… *îäÚ¬ÊÀ 4ÒΩ õ½ªÛ 4¹> < Sßéµ3!èFœÛN„ ïÛÊäHȰSúÔ¡Â7ÔŸq·Ê!—ÐICx,3ÿà*Oòʺv|L³m¼æjÆl~€ÖÅ CJ’Íøæáa§ƒtøå ?ÀØ8þˆ’ø%ßµÚ ‘ÿÝÉPV¿íæ54±¿¯r,†ŸBÞ*1é #Ùü[ÀÓIÆÆ¨q }ùšó~¨Ð,:Ý 8-JÀ ÓÏe<¡ùõp Û2ýÐ1 È&¸HÿÌ<ãÖ•l 3)¦ñy+>ãÿeÜÕ8]ùÊPí£&--« sM4ë#s= Z˜G[ÒÑ6¾[vÕ“²ºm%ÿ¼¸M³´Ї·ÿ‹?\]Ðü$;æ¥a—Ó‹l~ÂsûÇ Æä$ÔDz úmKDú +Ù'|iZq´«£œgs™ —èaÖ=h 8eùw‹¼Bÿ£« hbïŒ/yZ:ôg"m[@A•µ•/".žWÄ ûÒ#P„4žˆ,ª2Ç(Í`´8O`^‰ðDÈ:“ûì…¥ Š…¦µ‘³1¿ã‡¥€òúT±˜Aà$RÄngªºS¦âŠ’¶EèPÁÔ:£ŸEÖGž#¬^ ûj[ÝÈT’ê'Ö$†}¶3™€ïs¸Šéæ056hŒ{™_1ž‘kÓÜÙ<æ‘Ë·Ë!ÃÅÆÃ$V|aZoD°Uå-«6OÀXî¨íîG8Ñî@?Âãý ‡øK‡§~rtšŸŸï¾wiê#Qƒ{ÈOü+ËD?gãÛD²¢Ž÷Š×»]÷™¾?¸:î—ä‹£ìô?Dœd§/y›ˆSF üª€ß*ö>;:<É.ްKŸ^üÿ•ãøì”â(&G§líÍbï×½Aº˜Ïendstream endobj 244 0 obj<>/XObject<<>>>>/Annots 86 0 R>>endobj 245 0 obj<>stream x­WKoÛF¾ûW ÐC@¤-ùž’ rH"BÓƒ/+r%nBrÕÝ¥µèï7³KŠfœ" DrgçñÍ7ÿq² 3ü-èzIçWT4'gôöä|¹Ì—t}–ßPCç—gùm|©éÃÉëD¶tzWÐbA« n_Ý\ÓªÄ꘽ujW™BÕ÷]Øu^¬>ÌLëÃÎÙB^h§LH¹­§¿øËò*¿¸¹¡lq³«röC+mü •Ý3í6¾åyÎÙô6Ñßü•]\”šÖ£êú•ì“êΧ‡ ¿„NÕñÔJü|vôîM­¼ç¿Ç­«Ëq¸™ïvÚGÁ´F¾(²o}ÀDßÒôÿWئ±môÏH‹ ƶ)ŠuñHò2Åwy‹(Dò§˜Õ”'Õ–I5pOCÊTñšÿ1gHNò°Ô…)uò;$~•j·}úÒ·mÏÂèÏ1‘߇ý1S>³¾Ó»›üÙò2¿Ö~°¦Ñ~N¾+*R£`©Õ{çÒi B%€ÁhO¾²]]RkUj·Ó-!!îƒj ÈØ ëêÉ4ÊÇà ²€:Re´S®¨/æ´FéÙ¶>ˆ>Ûjò;`·u»þ¤‹Óª‚5¾ÝyµÕÑJyhU‰?{ΦÓuäNevd<< ÖRa•ó:ê¦Õ%5Zµ>§WäuaÛ’}hØ€à’lx¾-ÎsúÀ:À;<Šñ‰½µ{ ¯câÅÐ9h³ótê©P-ôðNÂÊKX%'úF02¨¹®Í8“IíF«Ð9M:КáB„ÈicK]#þÚltVŠ:bØ{7§½ Èn ÚZÏñq°Ñó…Á#£ uL8Ì‘öV;Bê„'Y¼“IUmþŒøC³Ý¶b6{íBö!k³C@®”¤[µ®cùŒŒÆnÓµ÷i¬¸ýª%ýE5;ĸÂFw ·…aÛcì†@;DöùI‰¨íjUèÊÖ¥v0#óhA€©’š9„J“áΣƒSøôD3 \œÙ¹n¸Ø ”.Øà`öÔ‡œ>2¿#;”:)é`#c}²9¥[XdF+ÿ™ W¤çëÌ^¤\~ZpêácÐ[hÌÅQÆS+Ä™0:² 8ÛpSèCMh²Ö©J.fF¸§‰0Ÿ?ÔÁ&¶<ÌBòJLL²èN9d#Ö˜DÈžB^ÙªvZ•è]½1u`£\ð^°‰øÅ«¡.¤ú}R9cž‰U ”‰/Œ¤q%#o:ßæ/ùÆq•FvßRßôMoÙ410>î!ÖÅBøj ËÙ·u¼;æâ{µðî1Z. ÀÒ$RlhÆ?>%âc‚jFI&R”Ïž™N_y%Š,=àõÔ $.Ú9êQiû±éyNUÿ2æ§cýéÐí•GGCý$ViLJП /FóUçzõ$Ÿ¬æôî–— 7ïœÙò6_\2ôïuP™0!øt8/ò… g‘b  åã@Dõ|6¨eÔE:ÍéƒiL­0…1B˜€éF£Zç” PO³}¥Ýt` bRˆ/11÷mì_Â4Y©_ì1ÁuÒtÙü0ïçô¹µ{´Eçðí×ø0g F½ ]ð=!µwÏs¹UqpOÝ>ÆgŸë§Z©7á;ÃÕw˜n —ã_r?jw 7Œ|¥ßïW6à&… mD\âñ†¹éf3ûÌÄØ1ôOn¼|>ò”Ó/ئx'Ì¢³¼oŒ‚æ±ñÔŸ!‹¾[§žß1vN÷ÒGMS³2và°*Kîi0ÂÉiÌ„$ÚÁ¯Ó ^ëÚÆºGïd`/â[“Px„¤j}’U]À!ì~¼¹@}jÚb%§×‡Û ï^ø8rçˆV@(¯HÜö ´‡L÷´,j)‘#æá½_V71ç}†{ã¼ Á“âôî"­É˳ËüvyAWWçùÕ9Wm4Ñ uîðÿ{’õbÙõÙ- ÑûIm_\_ñ¿™ålyÍ~^üzò´n£¶endstream endobj 246 0 obj<>/XObject<<>>>>>>endobj 247 0 obj<>stream x¥WMÛ6½ï¯䤖֒¿¤ô– ôE ´‡\h‰¶˜H¢KJëuƒü÷Ì )YVÝ&Ù"¬-ñãÍ›73oÿº‹aŽÿbØ$°XC^ß½ÞÞÍá÷)Ä1l÷øvn`[à‡mü®š\B[JÈ5~:¶ ÷  –­óJX ÂH°¨ZZZµï¬jÐj8J}¬¤Û±ùçƒÑ]SÐwÚðrû ¯ãE”àuÆK >Q×tB%šC'ÒÎà$A>+¡šÑÕx­ô©:ÃIµ%ƒ¨ôáLW0:\"šbzÓî“Ì[ùÇÉ*Z1‚?JÙ`l.,z„,‰6ó”ê¸Q>ü!¦úLçn²h¹^ºEcŠ8À0Þ$þ¿h©ºqS?OÖWX¹ƒ|  5:~,ªŠ+ÜÕ·‰ —¡cþê0ƘßHr#Î[‰»Ú¾ÅîjE-¡ÔUaQ@æºÉ1(ê#Ô,öªzõ, rî›Ñ­Äâ«ð°¬Ïþsr_Acf¯Qí'jX¾  š‹hB£ØÞÝt¼È¢ù:qÊ–‡ñŠšoŠ@ü Âlö'\‰;‹‹ÿ©í4Ú`—ÿÞMÏ!òŠGT/iK³ð2®IB8°¹Êñó©TyÙ3]Ƚj°×R:Ûá„9‰ó„ú‘?öZRú¨Û"‘øÐWÀ?Ÿï¸`¦-í*÷úD£¿Xš~07X)Ö Ô_ø0hnúU¡Íõ‘†µŸ@» ·ëÉu·Á3<Šªc“Âxb4«4½ŒìT£ÉíÂty«ÍÇ—¿83ÀVˆ@1W®,×RÆh\èCÀ™ß´äwЊLØÌ±-ÉbÆ×áõT!~4ð)ð2*!òc~^^Iƒ’Íj€J}–n¿ËL0óß’ êGVãæÖè-{0=ï5ÚžÆ|ºf£äê. Ã"ÐäÈ^vü‡±F£²ç0km[8ÈFçvzˉ.ðÏÛ¼ê\_¹oŠ™|(‰†eNžÍ‹‘$6<o¿T94P¤ÉBpÞh©¿åÔB^¶ò‘Äs¡Ý©rkDÁ‘ ngpBm”lÈ?RM>Ûí˜wΞ‘Øõå «v `ÂûÎûãš+ñ²Ä~3$fÄ~}~‡ž¸ÌLÆœ¥ZSžåöû‡¥7º˜õ,Ï—øÇÂ*JüË¡8'¶ÃÊ@ƒJðÃdŽ+±™g´èÚO”ìp–K’Ò†·Û»ßî¾ÿ«©˜endstream endobj 248 0 obj<>/XObject<<>>>>>>endobj 249 0 obj<>stream x­VMoÛ8½çW ºˆ[v;·nÛ¶-ðaíh™’¹•H—’âEÿ{ß õ5Øî‚–Dμy3.4Çß‚nZÞPZ^ü¼½˜SNW÷kZ,h›áëÍú–¶{üئ³íÁT´×™±º"EVŸ¨ÔµŠÒBU=ßþy1+Ïoñæ%¿çK:Lz ƒÂŽ¢ ú IíLajƒ.ÐULÛƒªyßœ¢Å2NyVje+ìSµl>z—{U–ÚÀ¨]¡©vTuj²³@ h2­êÆsOîA{oöš\±'ð1ý¢jD¨úê § Õ™Œ­jekƒUœµÒxƒ4\±„GˆvWr_ N!‡!²éèNÚgMA…²y£rM-¢KªŒM°fBÜ ­Ô›M•+u—‚²Æ#¹› )VHq¼¬¢3 ˜(»ö&­»@ž3³ÀvBi…òÓÒHXؤBÔ%æ#rk_+cÑæÊä–ŽªQv’ø¨|]]R‰p;¦¦'k÷?LÈ?0ãÜóÔ•¥³¨ Iî?@0N}ždš:–2çK ÝyåÛ ªÌ×"ЯUeг4éê~C‹U¼ ó%ëx- {ýY•GŒÏâŽÞ£e…S{csdlæx2ó’u42¬±4¢$‰ õ‚Û^ §Û°'öìµç¾>­–wN”òé8øŒ2ïÊ ¤ABݰ"`7È‚˜CÙϸC ¼<£m ëi³ÔC+zO'SBœ)®Kè—‹°Ó4îX´UÔél1í¦lߤl– ALg©« bˆéÌ •ý2œRË‹\[1‰&O é(ßièé’üCyMÖA ê(n~ª˜ ÂÐlA1-¬åOÙsé¼¾ã˜W÷iëŠlM«E½öziD]ˆUÍQ{IÂQ›u|sÃ~ºŸõÛ¢ömoz?I¥rpÛð4t78¨°-[Lç—ô=(Z‘Jþë$^Î[£ˆ>¯è /ˆíŠQDj»÷ì MóPˆzP¦`RŸñÆçD_%WËS­­*H‚̳Ð5³§(È |GZ7‘¾ÎÂq2Iׯ…ÜÂ&´».¿GỲÀ]?hƒè¯ãÛd³JÀö:Þàwñ;AÞ)Ÿn<¤“Y‰žÚB$±§C÷xR†¬`¶5{ž³Ù³‚kŠëü‘Ù%wôŠp~?ˆSÔûÒ5¶f÷5žÞˆ¡C#!âpïmßV7$–yý©A/‹35ÌÇP˜Ýp¤íœûøQë#çU;ׄÃÜ6åç$ζ 7=lz«¢B?è"<)>s||rÀNÿpÈ6§Ý+Ȫ€d ¤J½ï…÷ô<… UïOBP* êÑNšýWÆ0Ný¤3$óë8ÁÑôØ–›øvÙ¾Œpj¢Èa¤¿|P`pþU‡1YÇø»Á÷yÛò:$ >bã–ÐÂ2‰ÇSŠñ,6ñº32\hZH- ŽS“½XýYt%7ñjý¤ d ÿ6׃ëJ탩ü'ì ï†ÿÊå‘eŒÊÙ3ˆðŽŽ&ËÌôú>á¶š™Ï¼«›©ÎDM®ÖôÌŠtö.¯îèwزÿ‡øqïnCÒ0L߈±«ûU{²ñ n’nýºØ0ÔßÞoÓ‚"Ú6µóFÂM·.ºË¢u—ZݶÇP²á ¯·¿^|4Í÷endstream endobj 250 0 obj<>/XObject<<>>>>>>endobj 251 0 obj<>stream x…WMoÛF½ûW rRs-REùRä˨©ÛF@ $>¬É•´ ÅUÈed%èï›]R$e§…ÛwçãÍ›7ï!MñÒ"¢YBÙîâõêbJººÉ( iµ¦p&¢8¦$]Ð*ÇÙU6Ù7¶~¹ú|1¡eEfM¹ÙÔ×ôñ­ÙPfšÒªêþ¸ºI[+ÁBÌÃ8¡ LÅ2Zư5ùÍXEv+-~)zP[ùM›Šti+“7™ÊéáH;ee²®UM™,qŽLe·fcJY5ãËÆØ÷¾:;j¯ º+•³‘«µÆ¿.ís‘5Iª÷*Ó²ÐߥզäÜÜÃW¥ÞÉŸCˆþþà<}ÑeÞ"Au“mùh(Â8ŽCLç},ðâÌünL^¸@'ÔԺܸ<íÖäþDÝìUåB÷~q³©Yþxu³¤03®P0 @R¥b–,9åwr·/Í®ip?ÀA¡,2zÏx¾a<½™®@€+ŠDäðºÑ€¶8^2H» å­]Òa«³-éšv¦R´¯dfu†èƒÙ)’û}Œ\M¨&WWQ¥¾6ºR;Ur¡QmSGv>¨A5tY[Yf(ïŽ]â´Ó›­å’{ÄsÂuˆ•È=èÕÑ70’éÅñvM5zŠã KTJçZªc¥áéó^–r£Úìq í‚ÆíH{IGÓ8ÕóPóuŽ®úVFFQ ëÔºñ>ÏÊ>¡›»;oº °.±¤,E8wTprIoU ugi»ÿTmH%ÈÞ3Š uüóí‰V6‡šSƒJ k–è©HcZC”%­ tÊT/÷^œ“ªsRg[ˆP‹ÙˆVÅÕ˜í;NHVçCäÁØ-9F»®a²²È•yÁRàìq8 :RóózVC`„®ý{´‘@lûËX’“;ç6IX‰Ë1y"ÖªX»hï=Þ€ÉB +Æ#áùS]g­e4O—£*ÿÌ÷¤ÿq¾ˆP†a>ã Ä€xtÓ@º½B%wºùÓØcØÚú¹4»¶}7CðÊ1f0FöÛcÍóÈ ÁpÂ-'øýðYeV¸i8t7r…Ówî\;è úÝîò‰VÚrP`pà~qJ W!ÉkÃlent“éŒíbÕSÀ»f›q"f GÆ£SÆùRÌ—©ÿ~øHÑsˑ֎$ll{m<ÈŽ÷¾ žTà¹Ú­¤Ÿ‰·7?~5…†½2˜N <©JƒÅ« ïn`ùY|I ž èÏtlŽyd]o±>({P˜¥@ý¼ §ÔÚ6~1qUÀ®Û÷Æiôƒ'¢ç‰;4¡×G^´NXŸ„ÜtËÓlù_ÓÐ-´k dýó¶.y ¸EÁçÄQW¦Ùl;g" ãvד:)õ”ñ]ôRwƒ~£¿©Òõ-_jUÂ%:6öÅúüƒ4ÓtX³R¶ñØZûž5µ5;ýÉú ¦"VY¨¸ªÚuϨéÓÄ Ó³íθ‰:ho¼˜`!W{V•O/ÅvœÇpâGV(Y6{›×„wî›ÿ ɰ…øm‰û°»6öÖv’_yOGù±´„­4ú«Aw Ï\Ç¿ôœô‡¨Ó´«›'ä\NEâÞÚF»—Äg4OC‘baùó#; UcM…à ƒh:ÇëV¡Åtôš]c3À;󨱅ÃåTßðë$‹6êm7PÙT¼hw¶Ù”?¾[]üqñ/¢s^endstream endobj 252 0 obj<>/XObject<<>>>>>>endobj 253 0 obj<>stream x­VKoÛ8¾ûW Ò\¬­Xò» ,Ð81ÐC7»[hz`(Êf!‹Z’Êcƒþ÷!EI6œf Ôs8œùæ›ùO/†þÅ0O`<¾ï]nz#ØÂÅzq ›ŒÄ³Å6)êmx_Ý}Ü3À€ç̘>`wÂàÌ3€·›¯½~*ŒÕêÉý†_¼ŒkÁ¬ð"¦TF¤-/Ö¼ö6‚a2¦ úë~Vä8)áV<Žš„ïo`'´À?i UÅV³T¤`°<ä δð œ&gy.R „;Äx[k¥O@/R/ Æ\D"öÂîT½ª…´’åò_f¥*ŒÓ#ˆÞ1°Êª=nÑò 2­ö°BÀ)ì^´vu¦ò\=Èb ©ÈX•[¸;v/•~GšÀ? ¦ù2Ä_2Í–Ðͱ{–W˜(:t±Ž›ÈãI”,–”æ´;NæH¿W µB“†âÑÖTü,7D.G­®¸ Y!±_WÑÄ2LâhŽÞæúš!aÆŠÒÑÏB*)9˜ f1k2|ÇŠ­H $•‹ÒÒBXÁM†+m°,ž VT¥û]‹k†v:u-1¾nãÔfÉ1Ë"ïê^è\¹êF:ÝöY![2Å´3°O%™kPWÁ “CwëñDWØ¥¥ÆÞÖ÷§Ukf(NUy¢jÝ€»ÊCÂÕ6ˆGi,õ ;)4•ìÜöMuç…Ô Ä +¸-rßF;YšÛ·®æÛÁA£a2é¤ÓM|rEƒ±üÑ„òW=HÁÕ3mÇËwNx¾U©•LÉtá×7ΑðÌs`zk¾Á³ó”Œ±êæ­'™y„ÏŸÝÿ½›—Ó$ZÎgÞœ4Ž ¯uÎó/ÁÒxÍÇIkÉß Ð÷ÕØLy aó -;…לl8u¼Ùuç‡Çh`#ËÉ,š,-¸B<:t?/rœq[·Ãy²æüJBzn¸§ÇT%ö1]4ÞòvD©×¡[;ð.ἡè5ïÒ;ÿ¿~;Ô5XdŽøÐ¡’ý%éÃ"d{ù(q–¤ék=ÑÞÿMw4÷òïêúI¸¸JÞ»ØÙ…Â9é¤Si©7­Nµ2¨ V?ÐÍï’ÓiôË—·Vžîa‹È³òü.u2;¯^¶xý’Å\9‹ s!øœYt„„!yÔ=t¿ñ'Êð7/•u±6sÚ‹ÛaMëÓ1½JÅiàßÃhñµG/Ö“ú!/“h¶€Ù|-gÍß7œGCØà£G㣈ԇÉh-½óÑ’”Vî…8€+ÿz¸×P˜ÕðÑ=®\à“0 ÇŽÏëMïÏÞuØâendstream endobj 254 0 obj<>/XObject<<>>>>>>endobj 255 0 obj<>stream x•WmÚFþ~¿b„N*‘Î ¢ %Q£Vj’VAj¥Ò‹½›˜]j¯áPÄï3»6o9šëEw²×³óòÌ<3“nbêà_LÃ.õ”®nÞLo:ô@/ߥÇ4]PÜÝ~Ÿ÷Cšf¦íuåÊÓÏ7m*«µ*Ò\–å½%¦ÍÂ^~ü›:±.h9S0¿~=|º~Y›ÒI“ª§Œ¾]¿^NãKÇý‡ïßë^¿÷òÝ} _4IÜ ö{1êŽúþ'' §Ímµ[ÒŸ§iN±è‹Î=Z‡—ua7:S%ɼ´$©*U- ­L–ïh+w´°ÎKWT©« ­ µQt2Ò=ÑIâá@Eäˆy¡ÒBI§H¯Ö¹Z)ãTFÚÐ[AŸ4@$·Ô%AI©­¹#k¥ÒPjÍB?ÀµJ»p–ÉNä¹Ý 6y¬—(CÄÙ;‹x<öÇuu‰œ¨ 'ˆH… ‚Aß™º)»šÚÕJš ^žîKG{@áY@¸‘NoTíïˆâD  ª=¦¨;q z¯ÜÒfeÈÏk¢ßl©p‘9½.*FÏ3à˜gTw7±/ïO–² ­¢¥Üpã ›U)ð^ÕŠ­á–¶K.)·)ÂØÈBËyÎi?¹Xç¶2Ùd•Wxa.@Ófc¿¨ Õcq¨W0a€ÔSñPüª•Ê¢ØÁdä > •òÂÚFæ•:¸R£wb<(VÌE• z£À ¨ºæ‰¯è¹—GˆÚ]˜[U€ Ÿ3µdžŒN³?õU{Ì^þ(ÀoåÎ8ù8f•G2 Ä ÛEe$"ñ•á;Ë„ËbƒÀGtÔ¬ÍÝ ¤Où¸]d±Ða&5°’[N‚ ?†§¹Ív4A Vh*¨s>‚îCõóÏÕ¤+FÃA0ûÿM"eßZ;² JF"ÝŸD<HWë‚IÚ€íÙð H™h œô5âÚ™ŒÓ¥J¿Ø5ÇßÑÉ[÷Ž„¶"«Ü¡ìQQ{šÍ¥ÿ<[ÛäLÝdÏ6XáˆS/?2Ù92ö•I쟟æ 7ÚtŽ…ú§Ò…B¡â•ÀUЃ£ * JŽ[ÝE4 ™{§N]ùU¹¸sšãÅO? H=Jž žöž@u͇¤lí)D(›ä½òãb)}í êÛ\ÍïY»%[³ˆDçéñ3îŸçˆfíùìÅwèôqþY¥žÅmòKGT®Y4È ½D·â7$[âwN_cÂî³ßÓ#íöôõI_¼ïPëVÒíœnév׺”Ú_Ïþaކv‰ÔµÜÃ-/Â<Í"8¸ÌÞö)Ù\©GýëVV²É…f Î4ªŽ…۾ö}üûÜÿmúbº”æAe¯ÍßouÍ^#° ×eÐ[ëñ9e•'EpÆT(ÏõäÈ(ôXŒ%¤ƒ·Cè÷¼Ûh'è—0ÑŽ-–1L1íùÆ(Gn·â ûÈnë¹×i@T‰ñÕÌZ0‘7:’ L[:6bÄw…â³6¨¬ÆÔBÁAu‰¨Çu®SíòÝEXûþ«g`fïê‘ÔŠ¢– ¿¡ÎÂX$½`зҸ3´›mªåå$D‡pE&Ë%;¸yî*ñ j,ûõ‚Ûí$Xlñ„aO ‡#žfa£hZ9‹-#çp¢F.v¼½î’ÕoÆU¯Ëš~šÞü~ó/@%ï×endstream endobj 256 0 obj<>/XObject<<>>>>>>endobj 257 0 obj<>stream xVMoÛF½ëW ŒÀ¤)Ê¢>.[Ô@M\T@{ÈeI.¥M)®Â]J6ÿ÷¼Ù%)‰ÝÚ†E‘;3ofÞ¼á·Ñ„"üNhÓ4¡l7úe=ŠhC7÷M&´.ð4YÌiãbI“Ñ;¹¯uF€aPR½_ÝÜ/z£ ž…³vã?qÞª4t”t•%«)ÛÊìÒ5eº²µ.Én%Uº öÚ(«t%Jõ¦ÙÉÊšîqRUÆŠ*“׸rÇEª’ãFL¦¡ ¦ªƒÎ;¸æp;µÙÚAP»–Øl,ÜR‘-ºÞhk%,S™‰ÆHÒ@U®ÒØêœ2Qáø ®|”Yc%¡0{Y—O!­·ð‹?¶D‚pV¸k—¹Þ3D$¶F‰L9B-Ù^æ²P•D.Q{p5WËoÂQ—ÀµÏ&Õˆ"*Ÿ“¨rוͶîfèï\Øú(hÍÉÉšÄkMàT6êÀÕqÎ΢•ßaæœQâ7]¡­²O{yÙa—í‰I˜Ä1õk)Œñi>ðGÐè8@"†‰êö´}Ī«=éªR7òå…žùüYNÄ?ûƺz'è]z5|þ2¼ñ@{¾õóqp¼h©ÔÂ0¯§ã5õ½KÙ˘*)sÔTƒ–ŽD¨W_¼/côe+<ÍÀÑ”–¢l¤÷i‘“óòå½§äëi^¸Á0Tù ú¨D?Ê´NJѤzß8ÆiÄ¸Ó î”1ªÚü»@ÇC* BeŸ=SçÿÂMé Ö)\ÿ^ë<;_³ âµS¥¨¹ûÙ ŒI>froIYÊ5·=FWIäùPÛBúèdaЖËN"ª UˆÒøn^;)ñÈX˜¶©Y6Xù”—šÎKgß“¶VÞÛEØ¢èû u:¯‡qB%¡‘F¥%¦öcE…Ȭƒóäžvê,~•Y«¶«Õ£¶Y¹ZAæ¡òwõÆqH!Š®³±sarä ô­HÙÓpl•òyçá‘—ÉN¡»y(tYê#èD橲âq@•¡®°BøHßù2ëdf2]†QóÌǽ |w-¹Ô?ÖŸÄNÒó {Ìç;ì¼ùÀ ÎÅg+;Áäv&‹ÛÓB# î/½À9Ź p÷¨ué°1[ÝzÁ*C!5å„ô»¬bŒíF‚Û³gC‡[½ ^`Èú rxqÒâðÌÂy¼¼é"\⊋ó¹À>ojƒÍV¯ísÇ=pÙ)šâýoö ‰ÌÝ>Ä"îÚÖ–¸ÐL» ùK0 £ÙdžÈ šŠUK‚·c#iÑeÀ‡(\,ãä"!Ð;Ägq¸œ'žªò¦Ó/I޾ɍ[»™NTppI-ØwûžâÈÕ¹N’ ιù‰g¦ØÛÞoîoÛ÷®å cšEQ8Ÿ.¹%fÁ hÝX]+Q:4q4CÏÀ²yäÑïîÕ¯>/XObject<>>>/Annots 88 0 R>>endobj 259 0 obj<>stream x¥YK“ÛÆ¾ï¯èãºj9‹™›ãH.Åe¦œ²Ã’cƒ…ÇR̯Ï׃Á AÃM¤=ˆ ýõãëÇ€ŸB ðRQ¼¢ìôÀ—ˆÍ?ª¸Z-‘D1%ë”âDÄéjIµ¢ýÃ'JcÑ+ˆ|HÂP¬! £éÍûpI«è'è«Cê½H.^©‰ªy<§ÊYåe‘ÐåÂ+å­ÔY»æóú:DÃ"¯MS=óh÷Œí: E’Œvݹ^äº)ñ³ÈEϳ]û‘†Dø¥,‹¡;,rVùX4èr'‚Qrá—š‡EÖ®ù¼¾‘Yä·iªg- Rœ»( b‘ЉÂÌ^ôóÃøw“H,ÇwG׸ M«ñÝÑõ M-u8¬ù¯[œôæÝšÂ‚5m÷‰0Y/cœæBìú1msœ·ÙãÕ4ò è}Ùª:SçVW%mUv,õ§N5ßmÿ0§=£,dE‹AÓ"JDAÑãÛgUR{¬ºÃ‘ªÝ*kU­UÙJ£­ªsU7t®«C-OÔ´u—µ]­’uÕ•9岕OöIþRQv”µÌ`‘þÊ{8¤´s­O²ÖÅ•vW *]ÓNå³®jAÇð*@Oº<øZ(ReVu5\nøa’Y†PµŸ @Lž›®-´°T•€l0nò£'Ÿs~–diÍ¢F—™Â}ÝJî à˜ÇåŽÃ'Ä·ôý®×Eº|®²>jtî¾Aεb3$‚Ô>aê3‚T"s;Õ^”Iâ&‹‚]•ˆ*›È×_°O‘ íQÕj_ÕêeìeKuW¶ú¤¬Ë°Z±#cçô©!ìUkŸøv®à„1gxÄ8Åd«À ë¨<Ÿ 'Û ß´ÙÑøp’¥>›$£X“• ¤f{‘¦Iä¨õáE`÷{Ô!*Ä5½¿pi^M#ªbg õÜ£ôn×ú ™ˆ}ç裊Ԗ¤§­Œ£4ô4#ãXnÜà;­¬ªµa4jاÎtÇæë‰>lH…µÏºê ì¹h¬e±x¶ø§AÁu®Z©‹>°­é;;UT:èg†@cÆœ8à "úD—#ü¿5JÕ Ùzi«aü›w¼Áäyâ³Y¥#꘎DÎêGpéY« {ºHVxa¹Þà™µX&ë÷’ïmÿú6°™è›„§lþø3³®´íƒýó0`¼©•û¡ f?¹ÃʱS‘lRØ •ª^ôÓŽÞé´0ºú—² ü‡·«zÁt4»/Œë+ˆ†þ£û©ŽÌâÞk§?½øš=?˜žöæôÝ;ü˾ø vÙ8}ПuŸ›ÿ?L&z£ÐpOÖ{Ì€×ÇçÛÌøÂójÛþÙ·fú0îÊöHpãRß|l'¹ Ár;6½ø+”šÆŠid§€a¢™Q¦—X‘y·Œ7©ð®pŸ(¢(Ý0…otºUêëth(Ž^I{Sôûc£1ìãoW¶‡Ò¬¿æ]‰]x³‘ÿ67Mó;aó±Í¦ùý;Bg–T`£êxÆDï÷TénÒòãֳ«+‰Õ–…=ÀìnPݵî§/…,P¶ÒÐ’xˆ4hר>zš÷#þ Æ›f5‚܃¾àN2¬·/vê~Õ2ÃWÓ× ØÉ9qáC(rA­&:fœúéÖ`y–¹qn»¯ÝéÌ$FK·+I?-úýv‚…¥_bä•i0@çê¢jLîÁI3«]‚šî|®jæ_Mؽ02xr4úPÒÛšÙÆ`4´â¤0ËÐëžy´<Ñ®3ñøÜ!‹¦r«LóêÝØ®ÌX1‡nÒ*¢Bÿ‰ù‰õ˜Wn„Ú.´Ûy‡Uìy•u¼·õ{~¿n/xß~Â+ 3¸xá·‡§½žØÈKF±ØTÚ̲IJ(XŠM”Ðj‹tiJç_·YA ÚvØ´µ4­1È-ø§õ•àg;3®â„}x»}øéá¿l-rìendstream endobj 260 0 obj<>/XObject<<>>>>>>endobj 261 0 obj<>stream x¥WMÛ6½ï¯˜£¬µ¶×Ÿ½%E(P4(â¢=äBK´ÍDU‰Z¯Qô¿÷Í´dÙ-ZY ¶%qÞÌ{ófôûÔ&ø7¥ÕŒž—”¶:ÐÓËš¦SÚîqu¹^Ñ6Çm:zÿnûõáéE…‹#ªt=NsÕ4´7¹Óµ¿‘iHQSéÔ¨œLÙ8U¦š íŽ6#wTŽï¨õÁ4xXg´·5‡¡¾œÐ]4v÷U§îàð1OŸ“òýgp>À½A÷ñU×gr¦Ð¤J °ìÞ'÷8|~˜¡î¨`ÿ]l”³ræUççG|K5>2…nuÐñè>•÷ T%S¾Úo HµÎÊ™Tåù9ñylh:Ož½^Ƴu²–Òþ±)¿ˆ6šëƒÙ,™ÉïóüÅãJhkhoJMM‹Ð9¹“%ˆº’¬{1 –`DÔ祩—ŸY"!X¨øQI%€ÅŸ iH¸³»¥ë ºQÍõÁ©-´[ÃÄ šZS¥j|= ã<K¶âº©]vWßæ¹=™òÀM[|çÉMƒ3pwÍç`x‘,„a©ÝOªE/—Ì;%±'TµMùñÅ&YlÖþ÷‘L|`\©äˆþà[ÇÓé,Y¬!öqUë1'ÂW{å.õÛð§Ê6îrëx¶LæëuwÑŸ>•hb¬Ó˜Å¯G]v§ýÄrÕo:mEg0´=3*QhAÃ_ùTf&g…ê#{¨AgB],6nÏܘrÐILÓQfûdœo…ÐØ } ~IG)dõe¤¾¼ÇðhÖíÅ<ß'È &~TUC…ÍÌÞèlñoáC‘–,­jXL GÓÁø"ŒòC„³x½/ÁþQ*ô{ééµlBŸdšô¸¼$”â„ 3%C×[:"(zµ—7¬a…ŸÊPT[ŸTIX±~¨Øv¨XB¡K÷éÛõÄLšÂ°Çòi¿}Ú¦Ü+{Œ1AÒkQ.=Žb@‘}ée‚>Z•ªÍ¶Š»o}7B¹†-í"ÑŸÄØ®à{‘œÇÑÉ·Ö®­¡Ø@]eM Šú¦óŸÀ¤–s¼A2ˆ•ÛTq%Y˜K-·Lð"àØ+bJ±Wú:&X æp©zg\ #ÄÅžá4SØ<Ò®u$ó+TÉ;õÍgÀ€rç¾'| iú |ùFA*¾:Èe‡#n\–•1æg!NNVº‰»ÐKPNm”8(LdÖì5¯›GÃCaüùisuÓ Ù{°od±E$VŸ@»8 T#QYt†*ÏX>241ÖÑõ¸+§Ï%Ãü0¥¸†¥;i=t)N¬?\P½¯<Á•ªàƒ¯à‡g3ï|ú­ÊU˜ÕU[ nîæúªÅõNƒÝpÀ'( ¢õ¤åM×òô°¹ ¯ª6jËÈuy€ÂãsÐKƒÌà»Ã©! HˆŽ£¬œ¿Ü£éÅÃ>,kì¨à Ýõ@@4˜ûmÕ6í„6Š·±éããÒš·–Ëå»)\•ç±_·|§À±„ñ ñ pSÜÏ’6“ÏîðçrTHÜkQG¿mÔa³ò •Ï—å†EÌJbGÄ(Ðp#‘“ì¾=[ýæ".^pð2”Töh‚×ïh>"× sý&Ÿvÿï½røÃ…{'{ÆeŒ §šo¢K~¿ h¬*Ǿö°7t+wBŸ1råó^I› ðC‹x@1,¶¶Y î°sÒ^ÕÞ”CA¯j dÙ™(%,u[Žùõ"¡g,ŸU•Ÿ™}´˜>]´Qߤ۫ÒÓ½ÒyСVEy—H;5Ń»Õ“É ïn ïâÍò䙤r„Öñ½Ýœáòoÿg³ì’\Í’õ<ìœþ×ጧ{×OçK,•+,ƒëd3ÛÌyAewº¥"àZ%‹é|±¹zʉìb–lVK¿Ûv¨ïy1ïÿzÕd ì‹«“#ªkmJS?½ÌÃ>›L’éfAËÅ4Y.7œW☶x‰ƒ ʼÏ& ¤‹]z5‘›î½·Í#øçíãöá燿çÄ4endstream endobj 262 0 obj<>/XObject<<>>>>>>endobj 263 0 obj<>stream xUÛnÓ@}ÏWŒ AjÜÄu.…7‘xDeâa³žØ[ì]³»NŠÿÎÌ®M‹ÕT$‘¼±çzæœñÉæô]À:…ËÈfò*ŸÌ¡„‹í È÷ôtµYC^Ð!—Ó÷æœjÚoE¸ºÊtut9‚¯öªöhŸ9èœ(1·:Ün-J,”.GG„J Ü+Åóü†²Ï—IJ§hE Ö˜Æ%ð†þý¯¤øé•Ñ`¤ì¬åA9¨Õw¬É¬>d-­h+%)Œëv3÷Óyl(©oFéd%t‰àLƒ¾â2)4·c:ßvÌ>m…õJvµ°¡ˆò -îÅs œ{eçÆ4bA…î…TµòT‘ŽR*M~ Ùq§Coúo_tŠV¢mQyE-ÒïG§< @8E½F#aÍ%GèÝ Îs±•ý Ð,ƒYºL–Ù×µpŽm¦pM@ò) ÎFú]¼ìéKˆŸàø$ºßtÎÇ“?@§àq¸ev7(}HDcMWIÆcí/¥o­‘1õÃΡ=ì6ð„-üb ްÙÜ•Hcé»8Ó˜÷Y±Ã’¢Ÿ±ß?œê˵èºÚÃ×Yãm¼ýmdþhÔ…ƒ\‡H/ài 9ÎhÑwV‡4ƒ ÿ pÜoàwŸüPq¸1ÒƒPñ£ûʽ8ë6r¬×L‹¶§±<ÀÖ‹Ù¥W{E´<*_I¹3šéÜçg :V6SšÒW=ðÆy²¶tã¼EÑ$ð!BDÕÃDEz–¾#…’JkÊÊú3Å9­-‘¥DFšš$}Bµ,T"©½!™ÑRQƲ)"mޤL8ŽÒM L<ÁáÂ*±£mF8ì µÛ—Dt¸ŒºëQ ŒÙ=h H2†D©Â´ uP^ŒéAæéió4˜?>/XObject<>>>>>endobj 265 0 obj<>stream xmUMoÛ8½ûW º-P1–ü!{{êîÖ@NA -Pì¦(‰©Dº$e'úß;CJµ«-‚IJ8|óæÍ›É·EKüÉ ÈaµÑ/¾Ájµg›ð:_f,‡bÅv°Þoñ/žßÝg9ükàýâïr±„î;È2(k¼²^ål³ÝBYá—R$o»DÇ“zþ -?Kè•à[®Áh µê¼´ î5Ô\x<Ï×X—ÖtSˆ–+ýßÉ!ÿ,‘Cš­fY%ËÇSÁà•¬К¡ib-Ÿ|x`P¶rözé[Sr`¥;íÔ‘rK¬èóÂm¥t¦ÆXçxƒuy3cA±VöÈ”B'NJPA(üø>¼B8þž¬LOÜúH_>I1xYžñ*ª3ðîJr–vº\SÑ2^:çGXazÔÝ€¬F½ëžIåǪM¯<æ¼!*uå PÇãXÊ,mÔŒÁ[ä­A>ñþ4j†_yU)¯ŒFÚñ2\°ÿh+å°ïÀ§4„‡ÇÁyfШÉHÄ~£°5¦wŒˆÜÄOó¥ù†m‚>`D쮓±áë‚ƬË7Oÿ ®AdÖøîÌ­âØÿY½·ØJ;²FÄ ·´‡`hô`ãàå—¾„h'»z¼F)ÿ‹tóŽXüH˜^ä[¶Þí®fWZü>ðf Nƒ«y5É zè(I;ɦà@¢‚9>Já_Q¾˜ijÒ9€ï³Ð¹>xÓ£²d–gº_ ‚V‚9ŽÛ$v0: !uxšÌý8™YQ°b·…t»fùšöôA5®èÍ_ÄâÚìFGÜë .×±ø»Ãz„Êw,[í`³Û³" PŸJÑA %2Åyí1Í—¶ÇTi±ÜS¾´©ii¤ u±¥ÿQU²*èë»rñ~ñžk2lendstream endobj 266 0 obj<>/XObject<>>>>>endobj 267 0 obj<>stream x}UMÛ6¼ûW ¶‡:ÀZkÙòGÒSÓfž¶I]¤‡\h‰²˜P¤BRëEÿ{ß#åµ£MdHïc8oÞðó$Çœ~96 ,×(ÛÉgz.³m|½Xͳ Öy¶FQl²%¿û#/ð»ÅÛÉëÝdŽîî·ÈsìjJ)æÛl½Á®¢ÿ»rz¯te#”ñ(…ÐÞb/QÚv¯Œ¬gûCƒÓ¶×AuZ~xeéT¦”è½2 “x±û8™ù%Ä?hehl•á}# ç·sÌòe¶ Óúª7l+ØýGY†Ÿ ŠÞCytô”ÕmüzáÏ)¾ï¤‹áÒC8IØí'þ„kÔ׋V¢s²”•düÖUD𨭻>X†¿TüÁÃ÷ûŠNB]ZqzâJ@˯‘ŽFvoqTDGàm×(T)¡$ž»>0ƒ*õ!d3ªW¡³>Ì:áÕÐ@h8³UO¥ðJSŠ9JW÷zÔ18QrÉšZ…S†7Ù!ƒªq”8 ,*a½ò õKÃ{xú¡®U‡5Eíl‹t4gmë9ŸO~®!ª bÔ|˜’·ZF&5¥#§nPʨÙ+®sw_Ze™f‹U¶Šzù%Á1S\2ìÙE)àåQl\å,:\çÚü¤?¥´ ý Ý$D~{¥Ø¯’cmM ¡”)Ý>±÷°÷Ò=Š ¬¹O2îàñ/Ç-ÖY±Ý^ Ñø‡c݈’3H÷´‡\ŽTÎÓ¸!9/Ùl\ øoúmСNcŸ4ôg°¹Öµ}\¦ñ+¼jÉ H—Z³œž ÀæœEeã.ßB«Or4[âôi¬€ÍÓ¼È×–vƒˆÀÍ{áÒh°&2ðm(ÃVøäVk{dñÓ®µ?ìü]¾Ÿqhì‘Ö…Œ”Dy é? d"%¦o÷äKæfÈüލž×–¦ò˜áôd¹¯paáóðð’|Vh'Euº¬Ž`zòƒ$,62wZ[²žêdDK6¤ÙJ\o‚je†×dRtŒÓµÇÎédk%yûŸÒ5¢KÔ—–+0ófXyO†§+ø`;ˆšoc£´Œ~N`¿Ñ`ÜjÊ‹uÑèÕ¦K…oßój(iÎ3.çXÌWÙËEõºÈÖ+¾jþyØ•šÝõÁ:%¢]ÎÎa³Íü%ýíÅnƒicãh‹Íš/ÊjºÜ2¬7»ÉÛÉÿîW`endstream endobj 268 0 obj<>/XObject<<>>>>>>endobj 269 0 obj<>stream xVÁ’£6½û+úèT Ø` öÞ&U㪽d’,‡½j@¶Ùb%Ù³N*ÿž× سžCÊ jõëׯŸô}Ñ¿ˆ²˜V)Íì×|¶¤-vEå{|M7å%òbNô§R ý’›Í«ÖØ}U[©Ý_Òøòüb¤> [©v÷öi±Û¼mÄëpc¿¹ÿn¨-½HÒ²QgYR¡š®–VÖz¹Ð¡:Wí°D6½P]KV‘=rÄÿ´KF´GU~b$Sìcºÿó¯ûÌߥÔË7YXòÅRDVIª%Aøj<»%!=…‡ª=½ògÔð*ZX9bäàxôQœ|IA´ 1ÌcôÀ;05'#]µ>y_'SàË—Úsñ3î=‚½â%•¡Nh[§Z¸~Mr#E[ÈÙs¨|ã=”ÿÕôGúRúßêíe(¯j]U–…,% ‘Ò%JU{÷¾¨…Að¿g=?žLOØ ™¢6ª:­ ïºÒcYV,\Q×—F"ŸÈkËP# ÉAwRC¬Âܤã}}P/–vnUKÈ·•BW#°ìQX’¢8Œ IN4ò‡,N‹J y–-kª²„_²¼ÉÝœj[avÈV4!]ì¶%áÊrfá:áÙûÜZ­LQ£^d@ú˜a Öao“qféÖö€mªZè«ñ3(^Ô bÇh'­ek¡ÿí8><6…Ô–ã}޳ŽeAÆ›Í&–Ár=Î…_ê2br^<ï™vÏpŠr"Fwµvô,×¹ùÐÓï'©+Y†ôÙ²=é–…êÜÆkÎÁÊÂ4Þ®¶€•ް>ªõf¢@”pè&Ü‚Y&Ôþ›h\ÝiÆ1m sÝ+_ÑÙaðkÞ̤ Ñë8Üfém¸g‡CGúMÞ¼ø‘X •¨a9uÀŠ¿®ˆféyf :dFÖûþ%ºì^]ñÇBhQÙ0µ}ÿ°“ŸÕrÌć^fÃ|ªkµ‡ô¥b'˜|?¬f,œÁxaIƒ(x)‡ªÖQ=I‹ŸÙÏW)÷˜Ò’ňJ9ÅYè íõp] ®fð4ÁRÎúWMÃJ¼+¥IzžŸðI$˜»á¬¼Óå±·I®0ÚN:þí ŠI×£enž¨QJßäv]o¯ÝéôÅØ½—ï} @ºÎ²«íµôVtÆ¡ÿζïBîõôCðá=BüD¹PÆîÎnâVî î X)ýÔéªçJ\?p ò¹Îb‘è*dT¹s‘ì ¢âÓ2ƒ1+^ˈé×ßHzTͳ;ªœbÆ3Ús2󽉮«aDìɼ;ŒÜˆC‚¹œëp¹²½ýÇ›ì89EgpâsQÃ)Æ£ qŠ_¬¸R¦Ï7:x§ÁIžoNæ|ˆ¥:\^¨ï…Ce¤õèë_¬–¢!cKü~±Kú{a¼\ÃJSt;áëæüës^ÔP~²JÙ\¶a]-ûãèþ9– ^¸ÚrìS>ûcö|Uhendstream endobj 270 0 obj<>/XObject<<>>>>>>endobj 271 0 obj<>stream xVßoÛ6~÷_qÈ Ì&ÕvlÇñC€lh€ÅŠ­VÀö#Ñ1;YTE*Nôßý dÅq†nÉ‹Lï¾»ûø¿õF0Äÿ\Žábé®÷kÒÂ=¼»Ma4‚dƒ»³ù%$~$é ©Tªá<ùÚ”•Mùl© Þ¸5¹†Bí4<ÓÎxOæsˆFñ} vO´:ºŠç³9ÌN{qáÉïg_iµƒ%ùƒ>ûÙ¯i?šÌâ‹éäà à;­!¢äé hin>`{þ~› ’>[/D!ÔLÃùÌÖœÞÿ…?ŸÅÃy¨TY{'sS„úFÓ«xzÕ)ðÁèDЧ“䃋ÖmÌ—Se¤¹rî÷¶É؃¦0€ýÃ6Ã5…ó“{] úej‹TyX¾6ÜX1ó5pRx–Yð"÷ÿÝí¼åi4žÆS¦Ù­©œ‡½†Lo¨V~«ÁÞ}Õ©Ud€œª2ê麱[8!Ÿ·°ßštKçFs:ÍH»Ù¸e5ØêJ/@Ú½:á/ã·a§ýÖfìŸmŠ{ÿbƒxÇ€IkŠ™ª*™Šà¶±©0˜¬ŠÆáF¶1¶:/uÕEAÞ¤¶€Y–•)¨ !-Z"§sŒ¬³fYBÅG>ù =££üÕišì Ubþú 1ô£qžÒ4ìëåJšA3¦P úT©¯UÞÀ–’aY¡Šh¸Ó¹Ý¯Î!3®ÌÕ“ãdR•终!=Çöܤ¤¶ÊÌN;§îµÄ '+¾/ÝÊ×e™F>OY«ê¾Þé»_8$¾8@ª{e ^¯´«s´Ëkí#¶ê™eA=Xs "9Ê‹Cq„ƒ |ýˆ0Rãó'nÍA°é.NP)ÛÛð‰™O>ƒˆ²ðÒµ<x§i”‘Œ..bœíõþIšÙâç®jË*B”„”\>åÒÑw§‚f#›ÏK¤Õ]£/yÙ'ÛkX,ØÓ»Ò¾®Š`RèG‰¾nF@#?í0¡º£œ9b­£ëWëÈ„BYŸám½†û|ê¬Îø(<¡­Ù‚’EÐ^ž¢tÞI›Btr«i~Ä Ý¸†W=Ž®›rô9.ýñ£¡­¸A’òoý”÷_>$?e5èK¤ÕùIT ‹ˆò™çP¡5ê¯)Ò¼f-§Eº1ªH5Ë>ù4NRZWßE\TgU…9×UekžT2€’hî §&J^2ñí$¼GÆÃi|5žÀìrãë¨_>%i$µ·øôÈÉ>jÌ¢Ëá½T»2Ç×Ä |6ôÜò ¢#“Ëð œ éçû¤÷Gï­é„Ÿendstream endobj 272 0 obj<>/XObject<<>>>>/Annots 90 0 R>>endobj 273 0 obj<>stream x•V]oÛ6}÷¯¸À^\ÌV,Ûqì½¥A³èÚ5°bëhж˜J¤+RqŒbÿ}ç’’¬©é€!,‰÷ÜsϹä—QJ3ü¥t3§ÅŠd9šÑÏ£t=K6t½H“”Jšã÷¦y+èèÿŽÑëfŹa´÷ŽÑušÌû£½÷’éM²è¾Ü"ü®î%¥)m÷@¶ZßÐ6ÃÃVމ¶•ŠD–ѻ݃’þÅöatu¿îfOç×Éõ Æ¥rN”#oIÙ0ß‘6$ }|·•)ó¨+kJe<‰J‘««ÊÖ&S´ÏIÐÝí›7˜ŸñšW_oÉÖþXû„ãÎhš.‚½6tPFU¢˜ö¤­szW(_)ç+-=ùï!|ÕÆya$Ú=IUyh²Î)7![ñÊce³ ‡Eƒ˜ í1ÓšâÜmQ*ŸÛÌ%´Í£R_j x8hÀ^[CÍœ˜•–s·GÌ÷Z ¯²A(] Å,ÅÕÀË™ìuáUÕ칺ßPz,c妫u²ZÎPÇlü«~Bvw1»o‹ß«j  ñ¡’×;ú4vJ¯ÿùVÕ¥0\ÍŒþÈjCéf³‘…ÁÀJH+SàµpŸ^„ c¼¦g‡TÇ@W27úK­¸,Q&(DŽ((¦´ÌÄe‹)ج¥¯™ÜìlD êŠâœÐ/ªR:)ªŠÀñ„ƒ²\n+Ï8Ë6’MèzmKtʵ„Q!paj8L¿zR²›zH¨5‹ûLhwn¶$™CiÚ‚ÆrþÀJ GýMB8Î&*áê^47Ópêâ¾qB±Ìˆ@À“*á8ò"ž#ýœWøŽReŒÎÁÞÐjB¿çš}Ô-rt²Õgˆ>øša¶&Dl)?°oÔÕUÔS®aÖJæçIظ—<ð1Ùâx,4`!Š;*©÷Z¶%aguê×n4S{mb>(2ö¶¨e“I ²¢,t¹´E"Vãâ¬%zeè‰Óù:YÃ|¨3Z³ø¾½æÉ<ÌþWyMe))* ˜`´ƒâQpÿR…:ãÑ`jçYF\‰˜Q'¥É€ˆ4v® Ñ^TàÌÒ®âºrføÏ2ý†öÜÊŽw6phˆÎ;‰37S(>ÒÚêt®Aà ˆ»‘Õ%ÎkÆF=ƒŒ'¤’Cò¼œ6ÜΗKº"wܰÂBz)œ–üš>Ïj›?űؖ¸«ƒÐ0sŒäKõoD_yé|•,×ëËÊâÖ™¿H?>ìÚXã :öÝd:܃èo^ÔBoAõß6Tó´gÀ·Ãÿ‰ÿÁok+Š˜k¼ŸCïàlëñ½´.Ý‹º³ý5Ü\e/„'M›Þq‰KûÚ„î! íÏÜÉ;n]Ï1 <.r̾å"2êD¹*pE‰ò÷zG(°×¸kPl—ÜžUÕ´®¸GOŽŽ¨;ÕÈ8›P¡?«úú6šú±áM'ÕE”_»ñ Ï „ç) —X ]æãæ&ƒ½CŸéŽ/âUU0Zx w¦†¾˜MÒ™,ŠÄà;s@ÛóAË=Žb¿ „†U]J Ç|óÚi\L/0ù¬3Ÿá†‚KÞíE!J’áýŒºÉMßByž¶·ö §YmÜÏ}ï@á~èOh^m# ‰ªpïÅ{[öÏ1nxñîó­𡓦1ãÐÝ"a¡6!´Ȧu~玞õ»:]Ý/›#<ÝÌ“Õ×êEr³â«Yì´SÚÖÞV:zv:Ÿ]'›9šÜÍlóìým‰Å¸“gãeÊ ¼ÚŽ~ýÎâÊìendstream endobj 274 0 obj<>/XObject<<>>>>>>endobj 275 0 obj<>stream x¥WÁnÛF½ë+èEFMZ¤dKjO¶Q’¦ExèÁ—Õr%n@rUîÒ²äßûfIŠ4íÀ1 ¶Äyófæ ýï$¢~"ZÆ4¿!YLî’ÉŒötµ‘E”ì(š‡ñbA7«%%)l9½Ï…µÉ×É”nÓT;mʈ¿Î(`kؽfÿØäNX-=û"ï;°õAU²õ­7ð¾ÿ¬Ãø-‡1½ÏatÆú®_C}µYµôzÆÀo_‡×žº$STÖÅVUdvT*©¬Õ‰2•ƒò„(K•¶ø­ž¦T¥Ó"ic*¦äj#ZçS*›]´)‰¶`ö’|AØxFs.õ|¹—KŠB_ëiøªöXQÜh¯PåÖ‚¦¦"—)íóÕ2\ßÌû6à¢v‚;Ä’Þ‘©R¤PçTe.HTNï´úüDF®ª¥Si›lÐ%+*p¢TŠgèP™G*­Q HSluÙÆ{]¶"§B?º¤]]J†#ríN ¬®¿* hGÚÒÁX«·¹BZÂqn}1FÁ:çÈÌR]æºÐ€~IV—’¯`G6R>1ì´Æ‰áˆƒ3aq%UÚí”t6¤$Ó~¼ó”ªÂ³#Š.s%*vFhëmCJf¢Ô¶èH²dJ˜ ä…RõÇ;þÖPbv£Ä 81{æhLWä WUD‰6tª´ •@1g›‚Û×l¿"'Ž„ƒ¶š—£pÇLË ­àùB…¹J•)ßg_ÙÂàPaRÅÜâ õ²¯«Íš¢Eè{œÅ«på'é/UŸŸ€'µog6Ãøè“FÇ’íœ×¶i>ž²{ÿIréG’gÿ `8¤{ô:Ç (ÏssÔå~Q=‰â«ßøñ Yïeç¾ÚÛ=…ÍÏâÔÉ:‘?kô„:ô´l ¿=Ñé;}óçñM¸X±X´+á—Æ.5Í_ÐÚ_,º€ãKD^åÙ‹dçköC -˜éG5Àöbyœs U‹è¶ÒÀ{UãÑÄú„êGãI~…žÅÿ!‰Éì8™Rnöû—uíš&x?gÊDÙÕyhòV&\Ç1ˆ–Ûç‰@¼Üûy>±Ýš¼-IpŸ6JÀœª.Y€[Aáq°†Èc̘ºLCúb ¯#<ÝÞæÍK†ÓtIË~§F]FX –}ð Èk›Ú+Vâ-·~lL(D&­.C'GáÃÏÕÃ…—¨Äpci¨¿J™iõÈÛ0C>ûÌkD·m Û’‡YbCÄú¨óœÄáŸFñ:Ï… ³í¥•5²cüî¬ü’ß Øó{<ÎŒ÷ ïvYç¯1^ƒFQQ[G•Úk‹©õ¨ýjðw´ïÅóG ¸@ yê ý'lë/‚FMCúà(Ãe[{*xzKíéOQxºŽÃõò†ßlÓ>Æ|.çñàáG æà}3Ñì:\ã­ghƒ¥ÚÊ­O %+…Mîh€ú¬TmËq}°9@Þ>¬Ÿsn&4Lû„»J¥£d†5!z¡:úý•‡þeoÀ-‘Ž^ðÚ }«oW›Eû"sª1þ ÀâlÅLýó9‘9”ÔÎTxcn‚Î,XÎÖlô¥FÃy!COÔuÑñ½ð°þH&Oþ{\ßWendstream endobj 276 0 obj<>/XObject<>>>>>endobj 277 0 obj<>stream xUKo7¾ëWÌ­2à¥÷-m.A‹Æ@€ú@@{ð…âR“©”,õ×w†ÜõJrƒŒ_3ó=f¾O2Hñ/ƒYE b;ùyÖ°&.~eEŽÿ‹¦d3:p÷9«áO_&,&)¬áî^@–Áb…wêù -~,Ä@åp³ø:™nÕQéðæ ·Rû…tžVîîço—“¼bUŽ÷§¿{àv©¼åö^m¥¿‘Þq ¸†¥±áz-[hOšo•à]wbpo,È#ßî:c«<þÍÁ¶à3ø m¦d ;³Æ'?ÄÌÆ²ÆÌ~ZÔ[…™u| èdiÅš:ƒ¤.Y^¦¸ÖNïÕzo%Ô}Ä‹)H‹! Þæo!#%â-Áð 2«¸¸RºÅúö«ÒÈàëF‰MŸ…´Ñ5‡t-™±:oŠF&i=:#d m¤Žh:z.d>ºƪ¬¤c ¢s¿@(ÒÒýUJ—·(Au( ŠÖî…7ÖÁ ªùˆòu/7Dîu‘tŠë6¬Ç²htš£îNØcºY¦¼ÎdŒÒ å‡ã„…•kÔ“´ï¬äí Ú½%¶{¦)Å;õo$ïeúº‘:VK[‘%|(†{¹‰ lLø*~̵§±ý!}¥%2$uŠ4Þ'zPœ¸V­2[èÔ·`°‘·w6| ¦Ž¹™˜l"Ç¥‡~i(àÌ|AUs¡ÀÓÔYÇæ‹mlèÒïÁ`ð7a5q…ö Q@ˆ|ð‘AM2œ$Õ|Ž®F k)Ñ—@9´†'.µÒ¹0p ´­#£Ý9vŠÐ ]ßw•cp¥Á¥Üðƒ2–J –VÙ¬¾ŒÝJ'¬Z¢R°m ±)l§í^7ùœúrÊæ%5[©M7IL{Ä+Æ IÓ]l]J ]$(µfYZTùeàQL(‚÷¢¿ «pÐÒÕ¬„çKœ o!iàôs¶}ߎpãÇ5S“ý†-ˆ2¤K9àˆx•¸×{ÅÊÁЋ£uN’9)^<³ƒ§®•!ì™5{ühVŒÑ†Î+1pF­ôŠÿ×ú†Vö;OS–5ÔuÊ"Ì랢ƒ{ì6hìP{Nƒ=ÇA6KjÜϳi¢Så0ÍÊ‚~~ZL¾Lþ§¾ñ«endstream endobj 278 0 obj<>/XObject<<>>>>/Annots 92 0 R>>endobj 279 0 obj<>stream x…XMÛ6½ï¯ ‡u€•Öß^÷$A· Ð&)j =ì…–h›©>\‘Z¯ä¿÷Í’eÙi ±$’3óæÍ›aþ¾ÑF´ÓdNI~3¤ŸoÆ“I<£ÙlÏ)§ñrÃSFÜtŸsšŒ–ñ¢óõí GléþqI£i<¡ÕçÏ&X´Jñs• >é*z—)ké7ób ûjõåæþñF#¿:ãñËee"+sYIªÒ¤_Tâ²#™TÎ$*#SÛiSÑZïÔ³)+r%ía¥\щ#¿ùŽÖµã…G*ñQ9MeÁ¶‡&±cÚÆ´ÚÕÖ¯e“ØDò)²{˜IèYUFŽÊ|½b-3i¸fݾ*+®«k殞){Ø ]éMYé»$eªØÖjë}b«ø‘L§bÙ«ãY<“(ß´Õ ÈH N3ÈÀU,v&Ùñ œ#'V†b_éDýV©®“ o-^ô"m$U¤~±³dëu@œŒcC•ÞësJˆ:¦÷òVe¶$«U•ìða-€ˆ#>¿·6økœÕYß2Nm¶z¨ \Òã¥OWÀ娔™ΘtêŸU’Sl™w©¼î£Ôì+š K!.`@"å¯éÐqg$D}±ŽiS•¹ØÔ€;T ýîõ‰q'°›ÂU $ØÛ8ð4éèæ N^IB%ixo[÷Ÿ^áÝA¥P@Lö&Iêªf÷ÚêôÖÇ&†} Øÿg£üoKmýì¬5k“‡BG uê¿(xòwmÀdT' v•#%ªÀ×^,á4 pt;IÒN¹KÐÂfÈ‹Gh•V鑞RȾˆaà´ ð®ñ—žÉV®®ôÓ«˜Þ œ2®PÎ<ÃͲÎfYg)Y“ï¡i ÿ%ÉyÅVþÐ3–”À§ªÝŠœ:Iïòo½üAϦ9_¼xSfYy``°Åa\z/I!„‚TšgÊ¢Ñ&ª5ý#û„µÑñ.䪆LçšR r”ŒÛù1ŦôòÌ „¥òK>´‰÷; áše ãñp6ZÌu4œäÜëÃI`…EAÜáàV;hÝZ;aÙv¼£ÒdLM—Åâ}xçñ”»ÕgMh?š˜ ÈóíÀÖNßú”œ²d=½ ¹G_ÈÒZéÿÏœ[ #G º€[‡’VëL_u}|Ýõ÷›V€}aqÈ8ØÏQé¼|)=*çžËý·l‰ÞƒwP,‡ÎJ={Ô-Ø-ý ”Ô‘5ÎkÓ'¸ÙèÊ)¦öq>׃Å7μF#;¡‡lj§2 çt¼ÅOPíŒ-kXÿÑÏøÕ:M~+d”£‘?Pÿ©Þ€¨)å`\™Z2‡Ðð IøäÌÉóx°BQµ%ÂÝ“ssk9N«¼Û;Ô;wOHõ9´žÒŸWI†`˜Ÿ\ã¸Ôú‰âa.9ó·áíÔû1Í(š<Ęû‚Ǩ6!7EޤÏiÐU£Àïh¯PÈлSiy8áÅÎó"«ò~îÑ/XPúÚÖ˜é­oïA?XÚ{3 ¼ÄàÆoU…ù¯ÎT奀å´Ç´¼†È‰ªHˆ±Ÿ¼kpƟЉI<“Y„S!q §^Dôî“0¸2ÊÓiGº‚ùœgZ̿鹡Î{qíW4uvç4c8]ÆËËÚC¼/EkVðÚÏ(wÌ`STƒSB¬šB”<[é'´ç)æµÚñ„‰ñ5J˜uÿ”)>`ÏÇËÉ2 ±oxå1õLa¾·Ó¢°ð„Ð"ž¦³åY ßiS×›ößD÷3oiÑ__û¯ACî°òØÁm±Œ§ónB>”´[ @<³:žO·hÍÝH=ßù¦® Êl ¸xpÇø]ðôº“Ö½FW×ZÓ˜>÷ùç›»F¿ƒÅumÐé!“aêõYÉÞ÷,¦þø7|º }øŒ¼§\½ÿ¼¸#xmW> "{]ïÈÀŒ“?¶D¿B÷áᤄì`0`Ë×3L‰[OÖ³‡‰ ùà}ÈX²¸uñ³$Ó#Ê&56©-Âs¨,®j¸e…Åà߯K%O žÌሞI¾”¡=1æÁ.m$¡û²íÃm--áwköE™Ì‡+³TËQϦÕ9.|W9¡Cs닸1«®uVÛ»ïàÞ0‚‘vnú]ßÏ…¨½+êgŠÿ“w|aæcÔRIJ•Å©)YòßN¢ÐL±äÿúBÇoôUŽùÁ–†zDàþ/ä,ÉÓ7þûþqÄp<œA«¦þæ¿X²ìùnѪ>±(jÖE‹¡,útåÿ¦‹¹Îé”ü´ºùýæ_±n endstream endobj 280 0 obj<>/XObject<<>>>>>>endobj 281 0 obj<>stream xÅVÉnÛ0½û+è¡)P1–¬Èv/A$@€¦  C€¶F¦méŠtb#È¿w†¤/h.šø`QÃYÞ{3ã߃†øÃ8QE5¸ÌCXÀéMq ùâKÒ²ÉòÚæÅÉUÉù?NàVYQóÂÊ'q±Ê‚;ŽÌz%ê¢3sïèÕ"rˆ®ú^îô“¨ðv.Œ%+gƒA[[€¾‰"•±«Z>‘ ]À˶¯ðB'IÆÒɤóð®3£HþÉb<©ôÐKL‰ÏbßÀ+™D"zM…×J?{¯µXHƒ°„Ká¿P¾•ÜHEG*<åέ“ÈÏéÍ$ð„Œ& yÄŒò¥$ r € ˜h<äX4h¼,AvìwôIU”ëb}Pp® º0³~pþ„a¹Ø5[0˜ëúП TÅ®fá ñÏøÚêŠ[Y`B[Xr¤‘¸$’ ðÃv/IƒÉ ¥^,Äìã^2KÀÌ-º2®2£‚<x¨Ea#³…œËÂãó‰ÜtªÇê’3væÐ„C•KWP‚c6‰O;jIïèû¬Ñ5"±+Fî•„ïÿ.ït‡ö6Ñ ¼~¶æõ¬¬·†E—ƒ‚+xP,¹Bè`¶U¼òÈ7œ¶ÎHCޤ=ê••(ùö »¹v_ZÙ@%ìRÏHjúÙÀÓѤ‘ZöHï¡L ƒ[×|=l"ÍVY¾Ù#ªmƆ-—Ñ^¹®Ë2–$4´f'RõÓó=áÒ=oo$çtÐa§,Íp µ ÜZ¨…]×*H ûœð½ÚÛ5 •ÖâóäÜ#Ó… HìK AŠ(fÐx«~–ÆI8Ä"Û¾™þꔇ¦,yÅ£óÚS: Ñçý€ùo»“»­Æ6]­J‰’Aq)#iÞ—[ù’[dŽ‘ œƒQt Ò­^M®¡›4JP¨>k }.ß00 Š?bƒ‹gálpÀÞ^â”ë–6@/÷=ýÀ ŽÁ•ƺf¢vîæš$KSƒT«Ò‰©›¢»êVÝ=®ÍŸ?)Vø>ø¿Oæ™endstream endobj 282 0 obj<>/XObject<<>>>>>>endobj 283 0 obj<>stream x•WMoã6½çWÌ­YÀÒúÛInÛbÓöPl‹ú¹0eq+S.)m¢þú¾Ò¶"»Šq, çãÍ›7Ì_73šâgF›9-Ö¤÷7ßoo¦´£šf3Ú–4[äóå’Ö›E~GÛÖ[}ûC­Bø°ýzsKÐó3ÿ•ì2þ„Ýmf]h÷öͺh÷ÄÙ|/ïîH>ÙŠp^ÞkoTk¢iOYkBË_¦trHôtiúv6ýøx—RÆ¡ù*_I?o¨­ ©Ã¡¶Zµ¶q¤) ÝÁxÍ…ÐómÙxz{þ@½5uä@P{CÞ„®nùÀ5ŽÞ9H6zìŸ?äô³£qpYO¨´5^…c¦$\B㢃hƒfžRÊ …ö¤@i>ò°N‚ÇŠS5μµtPmEéAóòÕè–Owˆn|Œ"Óc÷âq3à°Å™H¬d”§³'VþÂsZØØ7Xà´*Q¯äwXƒc1l©Ñºó^tšÐ™—ø +Ÿ’ãºqÁ²„¨ü‹Éy"'ƒðbsΓ{–ÓÉb”â…ÅŽ 6×rk{ª!M×±5²¤®c9½‘ü±S›€É`Lœ\Îñ¼oVùf~¿„Oó…Hñ/WÄ)Žö#½4ÝBÀH&‚þEŠCšÖ¸ÖòxQÕa\·ÄM9‚'éhÔνrࢠ)9í"x â°¢!“²sˆØ@0lÛ?pQÑ^š¦Æt`÷¸Â²,‘l‘OW³Íú}ìW ‘–ô¨o:áx8mËžµ%¾ˆÕ+T»Ãt`ù³èŸ UÓÕ,ÔG´ÏXæ ^©Yìæí¼Ëë{^˜‘)ñ¾÷¼çù\(óé8†R>ã[†ÁD•ƒòP:¡0Èi@Ú`ðð¤Æ1t š7£;Vªî ó¯o±F°î[“®5àk ¿÷®U@bú¼A ì2àï)LÌ‘˜)tÍËpLXLÀ¢¨$£ t»`ÝNœìQHƒ‘aÛÛèQ‚Èw¤ø0îpyÊ"rÕòüâr|ÈèiÇ»&©ñ‘K9]¶ä„jº 0HTz¾ì¥ýŸÀ&Œê>žW¡dÓð¦í<Öú,Þâ^dÿ¤Rÿ "b´÷é Ê_CŸ‹^8’ñMÕߣR^­ò;Ц8v+Aû‚¡x.5KD›GbÐZÉ0‘}™îÉóé*¿Ÿãn¿Þäë;aúÓ—­®)£m‡ ä‡ë‡®E»l3£k7ÍåfÍÿ·Ë5Ÿù¼½ùíæó>/XObject<<>>>>>>endobj 285 0 obj<>stream xµWQoÛ6~÷¯8ø¥.«±ãÄé€>lüRlðÐm‰’YP¤KRqŒ4ÿ}wGÉ¢57Ë–<ÄyÇ»ï¾ï£òu4ƒsüÁrW×£ŸÖ£s¨àÕêf3X—¸zu½„uÖùäw ñ[ãU!ðªÞj [g+'ê^®¿Œ^­òCðt~™]Î1~ò³ÞÓòþ´¶¦Oç0]d¼J€W•ñ³åq«4y0¢–ðÀ϶Mhó|äï^ê2n>„}~¤ÏH¯¥¸“ÿcz[UÊT+¥© á*{˜_e‹ëë¾ûï·” ­eÑ76èËÈû@¦ÃŒOPrA4ÖHÒÙ÷ã»±»~ì; Öè=ì„ ,ˆí¿…„6Ä ´â…)€Ñ>c/³‹Aj齨ä 9‘”¹A´&—>ƒ·†*­Öv‡ð‚¼DÂ3ÎÚm<¬²°|ZW'Vǡܹ— ]Â’¶Œ'HÌ¥8&j×õø×nØ‚‹=é•´ˆ 8À ²ÆïÊRårüýQpÿÊwm£#ÚU#\¹0p+y$J„Ÿ“>8•#–8 •ÊEPÖ€-#‘ž¸3l¬—vv0‰ZâJáÿ îˆðOêág-Vñ$Ö1)±è5ð±×ñôðæ Œ™FcøöÑgãHÆnp2 SpÌê8Íóߤ“Ä­jk©|¸ÙQš¢'Ìépþ0`?jY?À8F<õÁHáüDL•Á 8™ ~¥)zbŠß› îyàB{›NtÇÈ'Aç{{FIܬH)ôóu,Ï:R§Rž¼«)æ¡PNæ%_4ŽØ®:I»“+ƒ5ÖÙk4·…„@L6Ãsc3²F3Q9ÖÀ{ºœäéáPÈREüÅ­·öNþGVFB><ù^kÊíµãüyÃŽyš¸Ä³3´}|‚¥ŒmST½?T’=:¸ÕŽãL9V†6€þ¢{3£¥g×Ä©@N74 sìí/n`°Û¨|s°›þ¤R‘Ø:< f<²™è%Dä²òg JÒ[ƒÆs4’ÁÙ(. Û"Ö‰1µØC¥ð7–ÊÎ-ÝA/UYbUx¤ÜñY›ôðRò¶¤ØtuE9M¼¢Ú5¾LeÇ"DoÀ(ôÄj©Dì½5Kø4‘_u'4•†–J€ûbö"À¤C½{Ìïùéå?ªÆé£MU(©õ[œûù6ʂԟæŽwæV8ÔW£…ãnèž Ð ’‰2eC¢ÒÞay0“6OW2ò„aƒ‘gú2º1¨ÏF·÷s‡sÌ`Õ.ÒÕÿ„Г(¾¢ªž$éûîŽÈö™N_ë Îc‹6ÉM´_|ÿ 4Õ–ÙlC…ØÛSïQSˆ2›3*Bvp¦>ƒ:ÛÂß‘Ðô7ñžQTÜ…áö6…§tpöÀN…M¬ë©»ûÙàÅ#cõñ¼ÅmѾïÏÏ/³×óþËp‘-¯è­ÿûu®a ë&X§„¦ÓnÛtyþš6­¢“ýJï/œwÁøÿF1Y,)à—õèÑßÙ3øYendstream endobj 286 0 obj<>/XObject<<>>>>>>endobj 287 0 obj<>stream x•VÛnÛF}÷WL #e‹‘hY–üÐ"I«"@ݦ±Šhô°&—äÖ䮲Kšÿ{g†W+ŠÚÀ0 .çzæœY~>™Àÿ&pÀÅ Âüäíêd ¼^Îa2UŒogó+XEøczïc¨$„"Ë@@.‹ÔD[“C¥ŠTi<ŒUVH I)ltÂAl,(í ¡ÃÚÓݰß9EÊU’`åçRY ÎäòÕê¬`4¹ðÌêm„˜GZ DyŠTÖ±¿s]ÈÇâ\¦”Š|=*NFkB~ôa•J'a(îèÄ9¡ß^J+ci%Vë¸~슒Æ&ËL¥tòQä›L^“ÛëeØá4 .ýK.à£ÁZ9?µ^c™$Á(K†i/óa?†ò€3ìþæÓ|[¿¤ÆlÁl¤þãã/P[8™Å½Íœõú‰Î‡Óî»X¥ÊµÍBeì½CÔBQ"˜ wÀÅŠÌJmÁÉ Ã.Ä2ÀÄýÐ|øÕT5ƒ4% º‹¢­¹ ³9ŠƒÖ³nˆø éØÁTnAÛ5„îô;*3˜ùÓù¼'¥•Ei¹¯¸°8S2]þÕxNb‰¼\aJ‡œõ1á¬N³¦7£ÉdáO³>6À‘‘ü‰QH¾-„© ï¡JQJ¨6šÇ3,€sKWC¯¤nÕŠàâL,hSøTÁëå&Sÿ¢Öú(˜ûsæðzD&³@žs$ð¶ºU¹Ê`á£f¨" ÿsŽÁÁóHÆJ£àhUÔÓå÷z õ¢Ù{yNE÷®£ÎmÀ¡¨¤14i­L”+¬(”Ñ>¼3Ú©¡5‚²eöõ ^ºÌïÐ9{§°qØ@*ñ•!´ɸ>w Kœ~‹©}Xb•tÒƒ!DWÆ‚ãâ¬4f1þ«TÁ* “¡~*[)pç™ ”ŽöR£Jp|ìƒÔI©°½[Ú€Èê»Læ¨EÄœ3ÙC‹÷p{B¡U;B/üwnFJéQ+ôƒ×1Ù´k¸I¶¡×ë‰Ú5²ñ6eÑÄ9}¾ªœJ´@ Éõ5lÕf#å9C‘©{dŽ)’L¾8e%tå¡IUƒêò¯”G¯z.õõ9:ÿ¶«TÖ‘Š›{Ä%v/ÝÖøF«\d0êî _r0mlÀZê{m*¼_mâ`W7ö¿ÐMqߺԔȣ÷pFî?Ô%˜ ðõÄݤ:ÐŽ,ChÆÜÝ7ëæj¯(¥c–‘aDZ5|j¶hk…­kþzuÊóÝÏÙ,É#Ôx‹ò…‘+7Òrª¦EŠ6è|À¥FJò™E9â"¬E³wø±Ä}ȼã5J$øP/*)ñV!&0Ù+jýã· ÒÚÔV—_XqÚÈh$à@Ó/Lšl™±¢6™5&}AŒ(z¤xÞ'ü»-<þÝoe¿Nr\Œ4Êï!€—/áÅó€Ëy»a%x]ë§'Þ£G®À7/ÿòFZ{ë ÇÛ}ˆá·§í|G”Ø5€Ö€5 PÛ¸³àŒMh…5L›»`|é/‚)Ìfc?p@ý¶ QÕ°* c•ȨýQk6º/xŠ7{—èôjVLçäðÓêä÷“d}¹endstream endobj 288 0 obj<>/XObject<<>>>>/Annots 94 0 R>>endobj 289 0 obj<>stream xXÛŽÛÈ}Ÿ¯¨ìKd`Ôæ¢^‚]' ä²O€<ø¥‡liz—7ó2c!È¿çTwS¢d 5 c$²º.§ªNUëëOþù”&”Wwýù.ˆ7bC±¿)Ud¡HÜ·’>ßÍ¿Wú™go=ÚS‰0¦ÈK„ŸlDäEä‰ÔOü4¡NÑîΊ„™'¼,9½ó‘n¼ÌÊøq ¼pCËRçš®[›49—Bßa°9™5.MBËæ¢$I|çKU× ¾Ås'“F@¹š0¼ŽÓ¢Ô¹¦eœ&®û}ŒnÑÞԢХªëß⺓‰S‘%7 jQê\Ó  \t×ý>F·hojQèRÕuƒoqÝÉD¾È¼àVE-Jkº”‹îºßÇèíM@- ]ªºnð-®;™ ›0½Ô¢Ô¹¦@¹è®û}ŒnÑÞԢХªëß⺓ñ2‘bŒÜà¨E©sM7€rÑ]÷ûÝ¢½ ¨E¡KU× ¾Åu+$©½YEE¡ð¿zËRçšn墻î÷ݲ=ԲХªëz¸{ÿqC¾O;¬É&¥‡òÕA«²èix†Дeó¢ë=V~,‡í»‡_q.?ž[#ýq€£«ívxQª8Ðvû³ìºf /+ŸJvý—w[zj^¨jƲ O´+`M­ýP¸ã-Ì4|ZÕûQ× çãÿå|ÑÔÚ·Û?Žùo8tÛ*uÏv©Ô¿)’5)¹/Õï¾ó¢l:9!y«–9š'Tž¶‰ÿ½®t);ÒõÐ5}«òA755-ÿétG•þ¦kÚ²ú’Ðôœ‚ŽvºTç^ úTS+»Aç#ÞÓ‹ºˆ"Gx#Žòã•®wUm4›gˆ¿˜½Õu?ã3 6»WÃÀ¹çJ8sŽ_Ê™îmÓ]8rTÌåcB~VåA°Ôûù±ˆlù­ƒLd¦~Uw€Ñ{úl­ßÓ<ûñÑÂÀÎÿÕ`õݽÕ6•r,Ò ‹Zo¿(L¤€*0ª‰Þ„b>ÝO ¸øç-ææÉ®~8{Ä‘þЪ¢¾l¬C+z’Ïv½¬}åÀX˯S‘`ÏÔÚKN=0¶…Wˆêv2W¨ÐAj¤6€(`ÅêÓŽ4H³s52…§{ÊeYª‚^4TÞ~¬T=Ü“„aìPlœÏ|ì:<§Þ¢ìrâO0®ýH›Œ ¡X} ƒ”Èzªr'pl`øç/O.°ÝéK¢F öÁøÄ%¢wK$–[@×…ÎIO7lo6À->áfô>6ÏŠÔ7Yµ¥ê_ gb›Åˆ‚„ËÒ  Íè£ ^nã¾T5x0<¡Û8Sd÷&–î8ÿ,Z#^Œ;Øy6úƒ9- ;ú¹é{ýX*z–å¨,M˜h-{°C¶üÔ`þº‚FãοÊÂÝêTÇ…*Õ`hc%ÐhŠxž¹†ÏÍh9oªª©A›&W·à» oáRG´ŽQZa` nµÜÁfýM$2?´5gzFö[ˈŒ…Ñßhu¬Îk\¼$âñµ:ª£ðéCð£6MÅfóªZKl8ïëù±µŸÅX6¯øþ@À›.Ö¦ePÒ¶ÏŒz›8v†]tî'hçð5íEABã=~ð|ìs9Ój¡±b+” íºmXa"ln$cÏOð3‚ÏMs .(†=R–ü$ƒM\ÌoÙ”¶oqÌT­…rf20—›E“6È“€/Öo4vµM¯yvÚèRl½þ+ÁÙbÇPwˆÀeuªo¼ *­.BôOP‚|ì›rYç%*Áø€â ÒŒëÅ­45h¿6K³†£~lÛ¦C}0q˜ù/K¬&roE×uƒ®kKi)oûÀ¹h”5ƒq¡îçv°kµ]SŒ9üÂbƒå‹·‚'U×O¬j|e*ªq«3 g˰åÚ‘TÚ]œÅ¶?ÿÖ X›Œ“0×°·´dyЧN ý¨°õãÁ}žF 5Í8aQüÖ y¹ÝþC•Òl?æ±£ìå­€>`¼­ûAbÃû„Ŧ«ŒVpšL ¯ÀˆóY×@…}o±‚`à™Q‚ùš«vh:äZ³ž’þõ÷‡¼.ý4sS™ÌsÕC´t2lnÆ‘ç|Ô% 5ežsV êÚÉÎln'ý¬¯S9Oaæ6 çÇ4ÄσܦJ_rsŸ7­ôÆ<hÖ†yX•Ê1›t_õ\ :¢µŽ=ÓŽ-[ºƒs0NÙÃÓå2Y)è¨÷»±Ä {·u˜¡(×jßɪâ4Ÿov(„öuÔ'<ûÝØÁKìLxbGÔŒ' Ž}gÆm÷{îË1æÂã0Ö|%öfGæÛ›j kDÏkõ—w‚Q§ uüÝ¢<ËPgð9U×,#§±;‡XÐys0) –d‰\Ëg‰]Ÿç6 _TKÓº–XÝVqO.?ØÝBñƒ)ˆãåÀîm¤ªv8P?ð.l7®ôéþõ#ª‰¸î˜ùoüjÑ2(Df4-:biLݘîëU¹3Ð'¸¨ Ëö/ÌC²èwSqa_õhv„côñÄ&b @æ…oAšW3^Fáë6ˆi\ãì´õ‚c²‡¥‡ùÂÙ »ÐnIóä?o,\,@Ñ¢ûÛa„ûœº}§‡Ã–?^¹¡É.|8’ß\à3ðr4{Å ³¯ØKò‰{­ë̶ê[[ê\3ðÜ”{U2€ƒC'{¬çLóœÁÒ³vTjüš"œu ã2Ky¡ZfßÚòùû‘»¥ó¦”Ï“4q2-Zª[ÓÃÔ²d f£b¹uŠŸþ!ôÿ]Å¢iŠ2Öú§‡»_îþ ª®Ú¸endstream endobj 290 0 obj<>/XObject<<>>>>>>endobj 291 0 obj<>stream x½XMÛ6½ï¯¤‡8ÀŠ«ï[4@.)Rø éA+Ó¶[r%yý÷}CêË^†JŠ¢(âð͛ǙáÈßyäâG‰OALÅñÎ¥^ĉ'bò|_„qL®H¼ØKbj$ma%‰ð½hzŸEÂs=½ìùžH"»ÍavÑchA‰ì‹ïq¦‰Ç ˆÙÓY¬‡©HƒI?ƒnv­‡Íf„°Ê1Èn¦9Äbó£±\ƒ˜-Ų‹ôgiú"x¡‡Õh±+¢c1ób±:RŠX-n`̾–øº"‹ãå6Ô’I»Ñb¥ÇÌ´Çî‰U±[ÜÀ˜}-v)@ŸñÑXFU Äj3AX5‚1ó샱:bI¬7 fOKt±Žæg yb7š@¬š ј™áXé(Q¬70f_K„]òÓ-5™òÄT=v£ Ä®JŽ™iŽÝ«b·¸1ûZ"Œõ ïOªD‘ˆn­Ýh±ª2„cf:„c¥£T±ZÜÀ˜}-ƺŠ,˜å NôÅul7š@ìªôᘙáXé(U¬70f_K„1âÅÈ•h6¤˜*Èn4ØUéÃ13íñ{bUì70f_¿¬ïÞfäy´Þ’d"M#нÞ`Æ]«gÙ<—ÕŽ~ͧíòâ ½«¶usÌ»²®è©ÌéÍúóݪ•‡-?<¼M{8ÇóB‘$9~‚áϪÌ(/ºòI$þò–,nœ†äx˜‚|¶úCvç¦j©ÛKÒ>•1m›úH—½Ä”ÍKŹidÕQQyµ¡KÞRY=Õ_ä†q] BòÆ{ª›ÙæCÞvTɯÚV <¹¡O«Ë>ï@¬¡²¥âP·xêjövƒÈ~ ¥Á§7‚Þm—iîyE_:Ên_+–N ÜŸÒq£‰0‡—?¶õáÜIÒÁƒP£tQ<¥Ø ú)üô!•Åž @?J:·X-+ņ¯Î§Qçàwžˆü(M¯žOO¹Z]áØ£¤lNØiUw ï„sx^ã÷çb”á^Ñ}Êg‰­YœBáe‰£$…81%LÇ<Ò‡vjê‚í&3SUùQR­I‹ß 7KšA¸º)we•CdEÏ!~šqŽ9ȦV‘í–H¨-=‡S#Ûó1<<#Ë-U5mžÁ¸,ƒ=²9OŠ}^íXZh)ßv²¹äͦE^@ÇAô>! q¡í‹%ªÃâº×%Ê‘£ìGï£Ý÷…Õ*'¦*T Í«SGYWª¨c>ʯeÛµ¨Yìo.e‹r¨HOÝ3:Bj(;£âêd^„0¦6šbø÷mÆñ‘iê_ç;+€j©PIU×äÍ3·&¼ºé~+Õ„ˆÎV™ªÍítîT§áêc£C¥ó·¢±ðÔá mF©ilFÿaÿÑ\7›o;ûv¡1ïùÝØ‘nzñRJEœ¤Ù7+eìB£)Ë ]è‡JÅÈw—Šçú"Žø–1—JýøYª‡O–KQè=ÃÍü¿<>…olÅSÁoËÚ_#w|䙲 ëj1'mós“ê c~(:œÝœ1ßèË•kKïDWetcË‚gô, 'AÃ#Kî_ôš7­þ×zîñæÏãÚkžTôEdX˜ 4eÕvš‘¡ï‘p=× UÙòäÃ=‡·ã'˜ÍµÒôù2æ7ÉpeN–ýeÞ£]†sR_ T nÙœ-&ƒápz‡,ô+¶z5xÄðËSÞí Îó¾ûßS)¤PK5ƒÜx6—7æ#½õñ™þd7i>/XObject<<>>>>>>endobj 293 0 obj<>stream xVßo£F~÷_1º>”JØÄ?ú”sñÉ•_Uªú°…Åæ³.‹ã;U÷¿wflÖI’Hv`æ›™og¾#âïf>ÜL!Þ >Fƒ!làzq£±wQŠï§³¡7(Á¯Qì,²¼â%ÌYž»²bñWX©(w¬ÊDá7¶Ûçü—èËàzq £‘†p}ßó}ÄpÄŽ’LÆ)Ìȸv„jË*[q”ú+†T‡ÌŠªrÏcIìéCÂŽ}‡-{!È4å%/* >wt㩈/,?pè”â:%z9ƒëO¼‰²šçLJ²qT=QÉbU…‚!ËÎïAÙg…¬ö¥ˆµs†d(çš'Vn$ü§,ý©7¾½=#íUñÃS¸ZÐùùK!Jž§êËßè£UXÇ>?®çmŽ?P’o‚ÌW÷OO-”.HL<½†²|X¬Á޲ûNøÃ‰çßúÔM‰Ct©ê ì6&'Ò[¥ÎïW«ð·N±½,±mxòVÁµ|ødbÙ ²bó^¬õÇßÃyTxKüó›ø5›Ì / µˆ³7Çcøiù=ÞGËõÃédº`zÆJ¾yOZ«ð9\5MÒEŠ‘{$,ç/< ì~-ŸC0°  ÆpØÇŠUðojÖÝî`ü ž:Í8ÎõZkÄI½0ǵ:yzav‹%Ôjï7"ixäD+†+{^ªsÓ½O zRœÖ!žs@ãð¤ò4KHKaVÀZj›0*æCƒ d¿CœÎÂTÁš¡Ï¨8  mU¦¤.Uºns$Wgê€;þÌJö<sï©¥jTYé šçŽ8ÓCó–jnƒhË!+^D¬o5‘ê"ƒoÚ€ŠÔð¨É!ætsqHEž‹#râP¡~u. bµ‰`Õÿ 0 ê•L^¦x!1– Þ•“¡+è—Z¯;› æ»9¼ó Á¬b]qϰ'Å­.êÕÞ(¤¡·A`œÐE'£ü ˜ÛÕÀHÐ*¢ §ñ>7Ü›çÐ`èßO£^ÎV™Ôv—{W7”|/ÊJb/–ºOË„jQµéýNs®p5+bŽ–™ü£¦Ö7à¢wÜfñV=£ŒÏcK€Ö2h–¾òäWÌÒ¢NaÇ«­H'N ‘Rˆ+`EBÿ—+áWêÞ –«¥æŠ²Á’<ôãNx%µAåj´:–yô³ÔkˆBi¯:“:\M@ui"]/ÆõºI Í?ÆUzæMIIÿ\Gq.D‡J”ËÉ\­=dåΆwd¤Ñß±jgS½NMTÿ„ÑàÁÿNF[Ìendstream endobj 294 0 obj<>/XObject<<>>>>>>endobj 295 0 obj<>stream xm’OOã0ÅïùOÚK‘š4Iÿ® *q‚•,í¸gÚ¸8q‰Ý²|ûqÊJ¬PŽ=Ï¿y3ã·¬BÉ_…¦ÆrÓg·*+±Çb{ª‚ÚqtsÝ@µü£ÌLu££ÇÑjO#Á\©C6 ÓZàWg!²˜UûQ÷QØ¿•q¹B˜–vØóáÎçþ­ôH‚+‘WË¢f ’`ž¨bõßx¸Dž˜œ¼|Õ§»D6s¼wÄ5ˆ×žbç[ ·´³µÿ¥ž º'÷1U{7yx|9‰áN`)ãóÕzhѧ v£ï95Ý?÷ÜŠ³å6~6ïb|Â%PqI_¯‹u*ÿaà묧?º?:úZš£39¡ÑÛI;DŸRi홂s¼øØI[ñ£JðÅvu™r]®‹›z…fÉ‹´: 9Ô)úÑj'^òOUÞ”7"ÚZi„t"ç›W<ðÇ^Ëq?Ù”›«f#ï§­kÙÞ«ìgöõ Æ]endstream endobj 296 0 obj<>/XObject<>>>/Annots 96 0 R>>endobj 297 0 obj<>stream x­WKsÛF ¾ëW`¦zÆZ‹/ëáSÚ&mI&cMÛ™(‡5¹’˜’\…\Zö¿€]Š+ÉNœi“ƒù±> ¯£&ø?„iñ5dÕˆn'"æÐlðî:ˆ$Š!™M!ND<½N¡Q°}…i,¬ƒx‚IŠšG‚=]½ Sø]ÃGôùÇ(LbC˜&b„ÓD¤î®„ÛѯKD²«73çb2™Ár ‘“Y£ÇPÄ`™#šeÜ–Ú´Ë/è×}’ù¸·G‰ˆ"4^A‹¶P´ ¡RFŽõÝ•0[i ’µÜ¨vÞ©Æ<޳­¬é^ƒµk¼:¼&/ª0[Õ€¬AÓwQ  eÆ‚•ÐèRAF5UJSèZÀ[¼‡º3íV•å%^3´­Dl•®7 ­ëÞo» ·˜“q”ŠÔ:¦'Ô²Röjì·E¶…Â@תŒ™eªmñÉêâ’Œ®Þ„H©å'DZfsâ0Vq4kÒ[8ƒ!{L®+YÔý‘ŽBÝ@VJÔÚˆŸ>d…bŠ´ äþ­ /ZSÔ›®h·…Ù+å‚n[£*N×]«`ר\­‹i§D¶Pÿ*æ3`^ð¥}ÐvX`gO«âÁ±êÌŠº5g×Ei—XÀ À!=dï½FÆßWž β· ”؈áW:ÃRíê‘8Ç® õžÍÅœKïÖ2pÛw7*WY…"ô­,5âŒ$¦ 9FÒêJ:¤í9·u¥ÚKÊ®ËCßˆÇÆÛ[ Xnô’漟NÒ²u¯šGWÖØ¾ÿ|Xf%P‡êšú*1 _)Ô:”’DÃlQ"(x”Š ÃG®.°ÙÁöé ?\,´ÉÊÅâ7ê+Ïι¯ú/¡-ê O%`VÓªb³5ˆöžÅS’$I¨Æ“t(v°Cmà` tÒ2]Sü@)â9j= ÅݳèP±¾YJo Õ¨5’xI—}üÌbrJý].襗ÿ^º‰CÔŸ¡çÂêUú»ØÇ>tãIX‡ê u"ÎJ„?;.ÌÔÈpØ=gåñóÍ4¡Ä‘=u^ü/á ÒZ*tXwúsˆãÏÏãÐ¡ŽŸCóòQä霧–ÞSDWTE)š‚LÎÀ'é¢}vÑÏÃ:ŸKâß—š=Ö8Óè¼Ëp:(Ù”. {܈®¢VáîaŠ õãO²Þ+øÒµv¿ÝJ+n(hýxèh¯ìeY2ñœüD5k‰c°µàk‡† ‹ ¡ 3œÂyN’K$4ªÒ÷tƒMÇUÃÃÔj)y¿j¼f%d o¦“KvÇ0„C®]áÚѺ®¶ÊØ>ÖF>0.‡ìN!¯Þdn9¡¶LÕ[åý!ö®Vû¿h »a§" “tŽj7á5gí¢‰”¥‚ñ= a|ë–÷9b¶G>À'¾xÔç0¸IyÛ“úYÇå µ Ówhe 6^OÛŒá·÷EîÌq©ÝêÜ ̳uaÓ…W1¹*•±‡»š£ñ,a­ö d…CÁ–O‡sec‘ E}ÖOváòeéŠNMÅ4Š&)N"³ß‰ËFÉü‘–bŽ—p\ŠíÐt[·+½¡*žÊ©/úÆB”Þ?zO° UX à\'‹w¸»½8¸ùÅÒÙ¨])3äÅÞbö—:÷ƒÂÞàbº¶Ï´ýCÍo¯ÞÑ/3OÁhÔ¡òÙ£¡¦·®¤[Fïx¦¾Àï¡@‹÷§AÞ1[ª¨=ä-6xíÚ¡îðΓÚ—è@ñ (F>¬ÑÉ|@òrèG‡îð·|:KòçÓÈYÌN|g]Ó¨>Ü't‡ÊÅÆ— 'ž^ÿ¸Í{X»pW§ÍˆzÛ‘K¹L‰Çh‚?¯ç)þžŠù„•Íî¦cXvF7…, ÿÛ¥ÁL'sÚÊN·ödzmý¥1Ù¿^Ž>޾Œé¨Xendstream endobj 298 0 obj<>/XObject<<>>>>/Annots 98 0 R>>endobj 299 0 obj<>stream xWMoãF ½ûWéE"ÅßIÜC±-𢽤E ´‡\ÆÒØž]}x5r>ä¿÷‘ÔXŠ“,²{°4š!9|Ì÷Áˆ†ø?¢‹1M攃!ý1˜L®’ M&ódNÖ/“aû–Óíà×%6mèüúŠF³dJË5,Ì/ÇØ¼Ìð¸L£/MS»Õ¾±t›W?]~œ__Òh¤›ãñ(±»·ÑóF2µ¥½·5¦4KÍÖ’·MãÊ ™2£ï{[?ñKµ&WúÆ”©¥{S;³Ê­Oè_K™]»ÒRY=aßCŠG“Dîlí«’\³…åÚZ2!VO¼7*MaåáLß½ÉMý$+â_žvuõÕ¦z³(á¥óë´½»šN)Ï’™øü-7^rÑßê^lÄre5üÌ?á`ˆõEÝëÝæh‡†ªaÇH‚ÙçžòÏÇÃuÞ;úüÒ®°æîM¾·™mê½d*Ï“éåe—d¢ÞñòåÖúWY/ÜfÛÐÖÜc•¡ã¨(üPU3üO¤[V–z1é­-IÇ0" ¹î]¶Mºó”ÖÖ46;SRqÄIÅ:¬Àº0o §~gS·–I žxU˜È4=®XS€x7¢˜ÓÉ_•=‘¾Ÿ›3‰°k|ËÉ·¼>“Hó'Å"P!ú£+)2Yˆ(ç#w¾áJlÓÄKb[հ߯Ҫ@-g?ΚµQ…äýw³Lsº»c[½àˆÿá>­Ý®q(è“/´ un¤€nn¨ý±ÈM¹ÙCNNZKLY âćT…¾X„hÞ¸ÿø¯ WÈCKNøèûÀ/‘+Í%òlj{ƒú+ ØPÄ©îkÈn¤Ëà6«[Ddõù8ên$ªÊÕ§ïAP„(ªÇ®Øå¶°% ‡îJô ôs)UJ\³ÙÔvcOw‘‡¤Š÷•Í«yº;ƒÕòƒöðTS¨ÃªlŒ+åÂÔð¡ÕkÎ*±o¸é7Ñz Û¤ ýYB22‹R­ª½GÐR7FÏ‹T%߇̪‚zr•ŠÀAnÜúõì´Ù‰ÖêºÊwSNë‚Ou¬OŒ kGvÃòñ]‚@õ®þÑÖ®¿~bs¨T ´?Qtíy|sݾÀ³rU:FHC/ª Zß‘>0%4aѯHd/ËSÜäGa«G4JèSˆÙír—*c7’ÎâŒm¬=u,b瑯tkÓo –A%÷ŒÀ¿­¸J¥}l01¥î5W‡.)QíIQüù'vQm=:q;¸8aTÄô+ËŒ>Uký=Ì`¯— ,^ýÂÌ©r Il…ˆ>íóeW]J -„´Xð÷Å"°µÓéYr1¾Â 7ºL®ø¢×?Õ–ª#ôÆ•(tÒVÕ~’ ãIš¦ 6È¡”{ÄIjÍÑÙ"¿O·xåÀ0O§Ó‘‡³n–êqm·áFÄ¢wwšÐÌëJ9Ð S3<µ#3ÓQ¬¾¬HV:« h«ÀèH"bMÚu/SUº@+¾ú—¢“ÍSü:tæ0ýýBÏý^×aù¾¡RCìáüzÚNããá Ni>»H&WŒ¤"ÓrßTø³A*:ûâ‹¡lê:á-#ÆF§sþó&‹fS~ý}9øgð?Ï_ …endstream endobj 300 0 obj<>/XObject<<>>>>>>endobj 301 0 obj<>stream x­VËnÛFÝû+.‚,hÀ¤%YO£h‘u»iÓÂÚ…7cr$MBrTÎÈ:ú÷ž{g(R2ÜEÑ6èyÜç9çÎ_gCàÿf#ºšR^}\ž hM—7si¹Âît>£eežülõƒn.¨Øiò–üFS¾k]{2Õ¶Ô¾”7¶¾ ƒ%GµÎµsªyæãNMu¾æJëÉÞѹ§Ç®‹çË/ˆ!^e#øM¶ÝêÆíè.q»|CÊ‘ÎÖñÁ¤Ð+µ+½|ß“jÐFÕk]d´Ü €\Õt¯IåƒÐ ºÆRYšz-+í7¶¶861DvÅ›'‘ô"ÎâÖh’M$Ê_­GA6Ê“"‡ H!heÊ‚À6z)—æ«Ø¿¼Éc¥9áñ˜ÒƒÍ,7 ½°·v»­Ëïs¿ób%¡ZU§ñÆûéhšçó®¢D{6ØïqçC ÛxB ªmè'çnýñN§ÙhÄ*©ÏIiØ?`à?e"ÝG:úIå¾þt¨9ãw‚Qâ&ú™!èèÒi25ýùy™——ÀO€ée^*çÔ!æ¢EAےϵFÑ#};\®£ôôÓ¶4¹A0­ii£í¹­W8é=ÀSDi€%Il½G“»D8aCx'1 ï $ïÈœ3„"’^ºwçmˆrÆ @B ¢Á_¶áª4T ÕS-R%Ûè¹ Á8"¼âÂ+ˆ–ÕrèíÕ'éÁµ|²—*×é…®¯Ÿ¬ÏËëë.ë§ýJhMh^€CGH¹°ù’ý¢É(Ó¶íÅRkÛ{âû ‹dwÞ™55!µ^7zÇ"ˆÛŸ`l>¨r‘cÍà?{ºgW'»Ôî’ÂVÊ@n+U«5K3rÍR¡cKÏ.o4gWAÑÓÑ<›‹lÝjïuCÍOá5††0nÛŽKň¹ æþÁ݉ÀeR@UŸ£ ýR>}!™ðèÐ%§3È\ØØ•?£ßGópŠr’=LASƒ'6ÃÛÉZG8SEŒpza9†\™Íº–ÏH°Œ>>ö@9 0Xt<Ñ^G²µ°rϘ麙ÁY[\DÇŸÑO&F—¥}d7P(ž­g€@ª#wN¥%л£×0¾˜Úù­j0i¡yUÈb¤Ü8>GƒI¶i:‹O`yPJË·Q%_JÛSél°àîßvjóoR>žMûk2a3?.Ï~?û?¦endstream endobj 302 0 obj<>/XObject<<>>>>>>endobj 303 0 obj<>stream xµVMSãF½ó+º¨¼UHØÆ³·,µTö’l W’—±Ô¶gWÒ(3’ ¡øïyÝ#Û ©M¥i¦?^÷{ÝžŒhˆï]ébJYyòa~2¤ßÎh4¢ùo§³+šçø0Ï?»†©Y›†,~Õ.»(ðÌQhYaB wó/'ƒ›ÆÛEÛ°þG÷NW)ÙŠœÏÙëùÆy¦R~ÕÞÕì˖ΓÙÝ gTدjbHÉè"#’ÁvÍUï Xb,û†<¦±®2å¦1 øþüŠSÏ+PÚ[%0¼âåÒxR‰÷üöšF“ô"ŒgéL=0Ù×­ñy’¹²†Éüní|“üdªœ€Ž:Ö$öÐ]ášÍPMÆãt¬FÿøežÁÆæÅPP‹k±Xõ-fža¾Zr§ ¦Ïh»¶ÙZê±è¤^€@Tœ÷lÖ‚{@ËÁ›ª!W bbI1ž {\…¸lDn”^¦Ã”>U€Ïärpë­„3˺~‘"M&”Œ/ÓKMïFzBÎ èÆøØ‰Æ>É­­\ÛÕ˜ðu@Ðm+>Nâå‰Ü9(ÉyiÚ¢¡‰íeLô,Oúm}ˆÐUL™©¨ L&Ж‹"þw9ÕÆ›’ÑCry@oçõV6O1‰‰†ú½ÁÏQËA‘ZpýÑziç%H*´’Ú¡È—\u½‰wàQ¸B¢œkÏ™i@$i¾­- Z08Sº çr«¨¶lÅ¡U‚4Ï:—édGëôZÛàãn5ŒBA·]´ë—„»H¯§×ÂõßLÑ2ݬ9ûºoµ×Htèm-­çÚl Lµ 2µªWdŠ$Û0YpÅÈ@³hnSeQ#ì§Œèçš]/^|E4ƒ)ŒŒ•Çô¡wh'[5¼‚}8;uÛ¿pUa Nv Q@Ü@ö@O”jѾ¦ªXG¥xÿþs´ýß^¹FÁJfzäM÷ˆ¯ìF`Ïïßu%ý"|F@/Ôþ7üÞ©ÂŽÞûrň+G>õà=:ñí¬w,w‡ÝC)t|Ò!þÏw¼fòé¹{ÚÃ"šn<ºQ?&/à復 _2ž¦“Ù¬¯m;†Ëér¢½zL‰€A§w-ŸRÒ¥=‡âõuýú¤£¸S®#9ve-Æc ™.eÂ%ÔJ)Žv«œ/Maÿ’¹Ž~¯ê¶‰'CJ¿3ñCÃÕ1÷£¸ðFU‡Œ(ŒÚëž*Då#~Ч„è_¼>Ûˆ¡õêE€aU ´óµp"{o±L`üI8b-榳Ï Xß–`¿.,r(:Nc™)ä` ¡ƒ× ƒ2YÓbuгGþäf]Hm“瘀ºh¿‚+ Ò#AÁqã ¤x™ÆlËNzŽëÀ± öñIV…[Ä{?Ä>Õ âüv²Û¬¦Ót„a:MÒÑL§c\Õš·X­Ql’ñð3»ÔÕPýÇ¥ur5•Ý?\N%ºó“_OþoTÃJendstream endobj 304 0 obj<>/XObject<<>>>>>>endobj 305 0 obj<>stream xWMoÛF½ûWÌ!¹0I¶ü¡œR£M‹iŒ9”6!¹ì.e[5òßûf–”hZA&‹ËÙùx3ófø÷É”&ø?¥«_RZžü¼<™ÐšÞ~Hi:¥eŽ·—×W´Ìðc™Ž¨ýWþDϧ˯'£r§h[üÀE|x~ãV_InâÙ›ã©üþ.{n¶¾Šo¦ßåï„’éùxK{#ùÿ3’ÿØÈ|6¾¹ºÓ“·®÷h&³ùx®a.7L¡p =˜bËŒg2i³5E±£tÃé7ÎèÁà^@Æ[³*˜oR?n¸àžh1!¸ÔšFä;¹57P9@¶âÇhM®ØuÅÙ˜–¨dSè2*ìyÄUî| Í•{¤Ò4 lnðSìvÆ¢ïHõx`!zÆ}>Sy * ×ìq^B¯­ô]îŠÂ=ÚjMÍ££Ô•¥©2È"T.Š32E³qÛõF…¶©žË05)P -€â«"]™’ƒ„Ì`(·E•™ŠØ{ç;§®Ê:WÎö‚­RŽÅÞ¦0~GP80w6uÍUöB\/²Ï¶´P‰ŠR^„D+äÇ 8£^xÁ•œ8\÷‰‚ü:ÒЀ1ðØå1¸Åâwï¾r»ì¿ð¨£lˆwMÖºX´/¦+ŠË. ×¾•ûÇ¡ú-E&F, ”_[±~m#¾g”>5N!®=?X· ±ÏPkŽð¾AÈë÷ÎÛµ­Œ´7(EÚ^¶èkïÍ."qïŠL¥îFw§¢F‹íרõ€jxÖ1ˆÐw}¹çž­A Þ ³´+¥ñ±CG§ðeŸAÓè"—ç´.ÜJ¹i¥œÿ£¢^,ž\“‹Ågá6õT¼+í“­¢ß½¬öD‹ßœº"BÇ3©JÓºP"”².ܲPõ{#À™õÎà{k?rŠà¦å·ûfWó½Þä¶W;trâjÐ…†öF”ZUGÐñ mͬÉùû¦ñvµm˜0^leëÀ­Âî…3g±–BÍ©Í-°UÄèÝnUŽ8Ï%î‹Ê!e¯³dŠà(pËp }š%6é¦5˜'[4÷:š}‘¬za48;‰õ”h6ß‘Í !FC ÛUZ †%LÛÖ£F'—tÂÚ™ ‚“†ÛËùˆT+94ÁÀr§UJT¯í1Ö§–Tnhz1>KK2»_ë˜ýˆ Ðí~ž IÃý‘¤µªçôËò›gªé½°:”µÃ‰îFj]ÎÒ2ÕÝ©¸h"Ö>Dúr0R²mhYJÙìá-ZŸ8EÕd:Û^Úý¢^:š ×|èôlbæÖp’-YÆÆzoÂËî Ts)9Jq–=f§­PõgLŸâüƬÄjâwgê~/Z¨ßj9ÄÚ5§‘4ØìpR­>¹üÊ_Íû||5»¹ Ã\]B´ö¶”AjÀ™UcÖ¸œ·Iée¼©éѯ&Ýir­)ì?FZv¡ÉÕæï%±c3Q<OæÓ«KN&óÃJ){rÛr¶ÿ^¥Öö(#¸»Ð EïF<^5¯û$Zr97 §ŒrïÊWÍá¹P‡1F2Ó˜• |w*³Dv6T ¶E£ÊcŸVÌ ¢9tä í×. ÐË‚žàµ«¼Ðh3$\·VÐÑË>×6j÷m‘t¹›^o$‰ºüß Ð-%&]Ë{Ô+S|ßþôDIÛô\oü³<â @ªë‹Ô‘¯‹v'¿hwòÙdëtyyޝñá¯O²r'´Übn£"N,¹šÜˆÐeâ[ÙÓA§"rO |%e£ù•<þ²<ùãä_ˆ¿*endstream endobj 306 0 obj<>/XObject<<>>>>>>endobj 307 0 obj<>stream x­”MÚ0†ïüŠÑöÂJHøÊªÚJíªH=UU£ª‡½gBÜuì`;”ý÷Û„ò±‡ 8ãñägf¼¤0¥o « fKàÍàS1˜Â&ki EE»Ë|EI‹‚ž€§÷Å/ò§³$£2ò¼m(T¥ÃöÌXˆÆ÷ï¢éññC\tQ6>ÜÝùÿ7£YtÑçþ×7ÑÚÎC %Ü(z]¼"þ_Ň y²ÎOˆÆ³æçbðmðÁ£  endstream endobj 308 0 obj<>/XObject<>>>>>endobj 309 0 obj<>stream xWKÛ6¾ï¯ ‡¸€­õkýºí¦[äÐ,‚h¡%Jf"‘^R²ãþú~3”l¯š´Ý½HÔpžß|3~¹›ÐÿZNi¶ ´ºã×q2“?òÞóI²\Íh¾ZÒ|–Œ'õšò»ZÎ’¨`6ÆÃ|2IV´x˜&¢éþýäÞ9úx÷óv ºZÑdŒÇ+Úæ4M&óÕà ò“d6Ñ6ƒ­m:ø C­3z,U:²½;[U™”žwŸuZÿ¸ý /G“Y2Å¥ÁOEáu¡jãlˆŸZK¶2êÌŒ`y±/øÊo.ÔäDÙÈy£-TV•ç`¢ÅLSXªt½wŽïNH9Kõ^Sêlªu —S¡­öª4‰ìpÏCuõ0¡__K³½toôºë½wM±§”C'zåù[tÉØ½ö¦V0<¤ÓÞ”šB “é÷­´¼;šìF»®v:ËŒ-úÝ@µH­Î‰rœ"$]‡ƒ‚HnÏœHá­²´ÓÔpv_«tºWÖ„Šj×™§¬-áM.BÒê›>$±”|0¸Ú¯mœÒ6U‡Ð”1ÕHþQy£vÈã’©ÎK\'cÉùLûèrlûàiìIIõùÂ,Kùt2õžJí)œÈ «ƒ³Pú5»ºI{‰»±æ¥Ñ„dÛÚä¨Þ7ÓµÓP„’”sASÞ”å™^€÷² *¡]Y„Ê>êÜyÝ3§J¯Uvîpዌ0|kí+c]é |Ïé] =sù™~kÁ‰aPÝvÛ¥¹º7PMè=w‰ôZôW•Á]s†´kj.m”aó‚›|f‘Õ ìË„¶]ìCªOõæ" ˆ‹X‡^´”:jÒ_ Rãµ\ U–ºü ß[úS„€ߥR Úp!“&…Ž3™êPꪥn‡ Y}­¥·.N‰ï½Àv¦(@~è&«sÉ6²€|´d”éTÀ‰.Æ(÷®¢ƒö(}Ť@*;Ë *8‰\fµ3¥©Ï€ÏR×…úZϲñ¶¶ =:[ƒ€Q›¨W9ˆ/J·S€Ìò–XÏ {c Ï…œÙ&úÆä^ÒÄ ´@ë† \_R;½&ß Åа9៞=f jZÚáʉ]5_ñt'H‚«ÀrµB´œœ´RB¶hwôZÏÈrŠ£-ÝÇÐ8òV18·U*@»ZÓdž`òå˜|£é*Y ¾€lS§Œ3–›&S‘øÉ:H'PÐùÝ¥.›¹SDB8#´¯œjnñ›tïÎ`nvìÓ§ÍæÍ›Èà™.Me@]Ct³ö VôWÅ€™©7ñº¹#à*ÐÜÓ Þ/2#]Æ v!ËyáØϸòœç&•ôbå71ì”&6ÛŸÏ{7)yDÊuz}ÿf1ø!~oÇs|‰®ñóà²Gqýû߯Æ6›wˆ¬'ÙšdUF“œ’øt5> Q<²Ò™qäµBÝ â×o;yëDt8frð”?êÚl®ñ\1$„ý*›-â:àÜNtT;­Ak¥ù²ðؘZÉ!ꋹ量¡ÙäœL=Dٽ٢޲±„a/]§Bk9Áa02,ŒÊPû&­y¢2`7uT¦”në–¦ žXa ¿3Þ3—ºÿB˜û€QË· î9¬GÙàª^$°Ÿ•™×6Và-†ÚƾåK£xë2ÿ§FL‹vO¹)ÙrÌ· ÀÍ/Q¾òBNÈņô‰Ã*£P<Þw‘ÀÖÙ!™³• ‡­ÌÄaÜwN& nàØî:¶®êPŸY÷ QÙ!¯N\à2–4 ~°©”“·«¶é£X,¦8Â-.¼ÎºÕ4¾õ,‹,È•—¬8X¼™¾ÛÝùJmgYRÞX™7à ”ýÒ`=ðà›Sx¹Ó‡5ƒ7=ÃMÄÉàkö¾“.ãÞpÿ4oÙj:~HÖÓ9-¦ód±^2j¢øˆ¶M‘FÜh9^³PÛ†Ìmq»š/uköå—íÝÇ»¿”sj]endstream endobj 310 0 obj<>/XObject<<>>>>/Annots 100 0 R>>endobj 311 0 obj<>stream xWMsÛ6½ëWì-ÊŒÄH”,Ûºdâ¶is±§fÚi’™@$$"% ­h:ýï} €¥¸ãÚ‹"ö»oß[Íi†ß9]§´XQVfôó(].’%]Ý.“+ª(Åßy|*éýhø\Ñb~…Sá,¿>ã-<­†oÏx{3Kƒ·w„ßÓ«··4_âÍf‡ÜV7‹äš69>n²ñÇZT*£‡í™9z³ß¹NéÚ¾Ü|½z{Cóy0œ¦i’¦°o Iµ´N攕ÂZiI×å‘£U.IÔ$NŽHïÈÁ"—63ªqêÖÚu_›¶vª’lÜHã;ÛqìMç‹Ä„CíLèwI…€‡F«šЭ ÞÕn'¬3ÉŽÃi$3$UÓ›¬LèNf¢µþge›R9§êýEH8áv°u:~ìNcåHY$c­Ú–’ppÏ÷“"+º$”Ã5¡ÐÒ6"“ ¡€áø2¦%©ª)e%kç›pº‹%Y ¢ÇÉ4ÎàZ±!;¡C¡[´!ö੊òÕ£ܽ¯î»X&.)j”¡ð[ü)D½G­óQ¢×\ $m´m¼t…Ñí¾`Ë‹»•°nŵn›Fßù誫Q—*ãŽØ|üá^¶•¨$ú3okJg³Ùö“™Ð{v… {d\ÄŒ˜óð ßìQToM¶Ðm™ŸêCVŸxŒ91 Ù=¯Ý¹sU-RÀ9mu~\³¿Wo³8# ×å’¦)FØãöž³î1͇:l†¨:ögz?+Ðæíä&œ]¯A7þþÐ2äC}È4ú‹!ƒZ¯chþð„ãþ4û;?ÝE8§‰îö÷úàG3B3´ábìËè«S;OøÈmD@ £4è‹3î1ƒ&à ÈXÏ2fð¢,,}mE©v* ƒÕZÆýçÏëõ‹ôq¬M`°Ä {šVŒI æ_‚;@69N‹¿Õ5&Ä^ÂÝçtPeÉ£ò’ù„±ãç%o3L‹Õ´fí]Éoà  L²katž&È…¹²–|=aŽoY{0^ÜóQÅü`}9¶’o×§Ñ”+:¤JºBç  ””É7ŠŒ†Ý2Å€¹.¢œ8,¾è¡¾Uï´©B}Ŷcfnæ³dd„¥PÍ×"Éè-ÓJ#¿‰Ìa8' Τƒ@/3A¤^|º³ç5æDü.¹4;îs£ŠÛß#[]¥ÉíõŠõ1xÊ Uæ˜áu#3ök6˜F‹~¦Ÿu†šD6Šótµb…¦7ÉbuËáÖl+ÝA"?étöMÆ<|§ÞœÖùTÅ;‹ªíkÔü`ϧ±¿y$Uo5˜Gï-¡w^ Kõ—ôÍŽ >3ß4–ÕQv1Ðw@|eý´p‡ÏØ–uóÀ É[‚ Ë"™Á–™Kô£ò:CZ¬ÚEDŸ³×ή†þ%b•é|hçÚϤü¦¬§¿XLh r`*²œ 'ÞÁ ·-ÐÃâÌÓ ÅT»#fÄžeÛ³Kmi3§Í„d²O.à ÏýäuâÛ¢`‡M*ã‡ù>/XObject<<>>>>>>endobj 313 0 obj<>stream xWMÛ6½ï¯˜[`͵üí½É"zh·ÍúÐC.´D[L$Q!å¯.ö¿÷ IÙ²³Í"°! ‡oÞ¼ùð÷›„øKh6¤Ñ”ÒòæÃòf@ºû4§$¡åo§ó-3|Y¦=WH—«ŒÖÖ”ÔäJ[Z™L+'h™+ÚXYç:•¹£kTIN—uq¤J©ÌQcHºo´×MNï–_ozºZJs]dVUþ ™ŠÝò÷õ“‘âêžÜ¨ªùÅ‘Y}UisKû\ÁÈ’n(—Ž$åJfd,U¦!Ye”Ê ~q푬kkj«eÓxu‡UµU÷ÈF›JðÛ»O JÆbhèçbîáSk]áâä˜,0œàÓ•¿»'è7Ïr"’ñxœ¨þ`ræX9ŸªÛWÎJYm.+Y*WK¶D¬ŠIAð=e™fÛ6_Hê²È‘0&¡?ÉbšÌ.hGê Ò-Î3Pï@$¨V´R…ÙãÂö¼´ X/¢ÀB¹S³7Ì0€žÈß<ƒI2›^^ÌÆ¥úÚ誉J6Àaé䙀ŽôìÀ´N9ßg£`‘ Öax0ôQRi¬«™˜$ã)øŸ‹ x@q…LÑŸ %ï×Ò‚sÀ ~ŸŸ” /ô|¤>_øq§X:^>·Ä¼á)5…±þ¼/µ1Ëq*<¢óa ïÞ”j]}‹¾.”EÏW ÿ:’ÖTúŸÏSdá€Ó™úGòLvbåkNfßš]ÓÄ;q8„¸°ªÿñÎÈ^yù#žöÉ9¿Ò3¸YòÜÿà'Xؤ5¿oÛ€Èà yy^pxrrÒñå’£Á°½ÅsÄ÷tÇD8ß?î”=Æâ']ÑßË´à Bw(ô?€oÚü05e‰BAÁŸº\hýäöTÉÞÚ×H'ðU –ÓÑ7T` m±¬„e(PÜÆŒÆSËYÚéÌT°zDÐ{°‡ÑÊ–ýWog¦1SW*—;ÕƒuÄs²Äú\« %x8†+#0ˆÓ DètÜ2È;Ûw4˜Økâ24Á‘”)U3Ѩõ:n+!r?Qýâ° íÂæüªtÏÎï>ýd "•  Øn2‹Ù”7Ϭ×r7 ,¦þQ[÷çS1˜óHkãžZJÞöt–\±£ÆbÛÛ8\íŒç·£½±qµES‰lÞ¥<ÑQØKO ÚP‚›Ð鯼k]`¾c})õýéö*§ ªIQñÜñ¶a§ÜÄŽQï‚.ñ± …½œ…á7W'–,B¹º,–’Ü Ëor£Ók^÷«tj/¿(~h_a¹/¨”Kf ýÝ5ÒÂÜ^ ^×OïhK8úºE»â0}à ~¢`Çqm&Ø×Æ4Å`Æ?Œz¡Îû´DB†×bkן ürÿYË\×(ÜfÏ[†_Õüï…˜ŠöGÃû3ùìmÜÁÔ÷âË›¿nþËï;Nendstream endobj 314 0 obj<>/XObject<<>>>>>>endobj 315 0 obj<>stream x]P=OÃ0Üó+n CÛùj:‚èV’%XãÒ ¤Nm§‚Ïs©ßÓßÝùœ p:DÕÂÌÙ½Ê8>Pî „€:Ûn:¨€29¢ö¯Ú‡ívœëG=íµ7GÜ©Ï,7nù¾‚?™ü§Kl¹ÛÜ–7¬“}]¡Ö"ŸüÉE‹xÔ³»XŒd4ÙÙž¢0ž`VïiÀÅú0ºS€;àËE3Ah¤ X¦5 ¬ïÁž×¤lˆÞ]³‚õ¼«[ð†Œ+&“«£.:Ò:ö›°¾%”œ3Ñ7hj&$Ý$}{VäU@­Ñ¥þéA!yC jï“èR”{*غkÓ÷ y+Óø¨²—ì©vnNendstream endobj 316 0 obj<>/XObject<>>>>>endobj 317 0 obj<>stream x¥WÛŽã6}ï¯(âlµ/ò¥÷e²›d6»` yè¶DÙLdÑCJöøï÷T‘”euò´3@öȺœª:uôåiAsü_ÐvI« §'þ:ÏVòÜß6ëy–/W”ﶴʳÕv³&§©zúBÛU ¬æø/ÙÇ—™Xzþ¼XÓ–~}ú×~ôüiG‹—l>ßѾ¢e¶ÈwëÎ/²ÌïKøÚ“_t{´%}²îª\išÃ‡ýˆ*^_ðÕYº;[æÙr‰«“zºÙŽŽê¢ÉkÝPåì‰Nª¹ÑÙ鋱'ýUεöSúý¿û¢þÎã‘9)w£Âžp´¤Ê::ÿøøà¶XeâÉxjš8ªI£¿¶òA,™Ö\t6~R¨ºW¼:éYƒ?erb+±UtÎé¦%ûö‡.Ú)u¾Ã¥]M{”|3ÀЇ¡Ü¡;ñ¥Úø6£ŸíU_´›"oý¥Ãï¸þ.BìüØ8„ð¦Û+UšªÒ÷ž”§«®ëéÈ#ƒdØuØDkq6ä_êZTkl#ß³xw¹ÎÖ‚Ú熺ÑNÕSºŸ¥B5„Tq4¿$Ó„ÚHê¶k‰ èϺ0ªF•ߺ®hú‚¼árŽ¢ I{>Ü*Óð9E•¾§FûPˆÈ3d0ìMÛIìh{Ý­5Z—!ás «#Ÿh¦ÔBÁBjµ)™*V•¬3( Œø¶{ƒeŒÄÏEį@(¯ -ÑØff-U]S$@çÔ^ú)£ýQãt:ãédGÀUÚ{Àè[Õš.Êõ†žg»Ü¶¡Å€ƒŒ€Ä£öˆL“%U›ö6ÊUaC5Á5yg»¯ÃÌLätÍèu>릔£ñˆrNcJuVèÉYøtþ]×$Dçø1E®®ïÎg+³p‹x 9úd\‚ˆ!ŸÑe›~xÒ•ä5(•*KÇå€IÔ*N×凳³S¢ûÒUe î1pŒm¸Þ*ÿçße˜¨*ua™ÊHqUK×#f½rÙý'rÊ„‘à¦Òå®ðÅ4[„ºïAJqve‚5¹*S8™²#ô5C¨ ÌT6нN„–ùùÝÉë™4©z˜1Ç’ô)˜ÇÑA>jDy ¢“ïÅKF¿a™ºÜ­³e9Éì¼:ˆLÅÖ«‰#ƒdŒnBù^=^ ¢rEî¦×±wªísC¶sTçÛ¤¤y›¢1¡á¹"!Iœ¥æšÈŒžá  ŽÉ|ú÷ñŠÓ…Æ;[x=ãÑ \U4iÆÅNò'Šf¹÷»XîJ4N·CÊ !ºÏÉE‘@m-Þ?#¬¿z¡ð`o«¼õðKØÝvBú½"HÞz)€ Ò¿wµGg»CxÙŒ”+þ‚à@fˆ¾bx© oÈAUìØžÅd´Ö#Íï RØ´äÌt€÷^´¼ƒ†4 F¢÷€mÇá œ8}€Œ€Ø„hŽ_‹Ý!áö~ùÁàÅ;?|èú&ÑÞʉ7©løçOyGËù !§Í6ÏÖ, ájFû%Äë)8KçfÛù úÁžoϿ؋˜Ë“`Ú¬øðOû§_Ÿþ‹£—endstream endobj 318 0 obj<>/XObject<<>>>>>>endobj 319 0 obj<>stream xµWÛnÛF}÷W ’ Q‹–dY²Û FóEUÄzY‘+iSŠ«r—’ #ÿž3³Ë‹e£ RÄ$r/s=sfôÏÙˆ†øÑlLWSʶg¿Îφ´¦Ë»h¾ÂîôfFóó,Y$vç-U±8§­ö›S©¶šT™S³EªZ×[]z—ÒG[asikO~cÊë*¥ß5–š*½6+ØÔçóÏÐ=]¥cèKV¶:¨*Ç^]ò'NU|.9¨µ|_Èz¦ŠBk‚|YôÊq—íâ›ÑVœÈõÊ”«–6j¯;¹vÅÏ|ï5+Rú¤)³u‘‡k‡Êx¯KÚ°'¢,·kŠFÌ#¶‚d“”ƒ¿EqAKq¼vñÖ»]e³pä°1ÙæD¥Wºrllë°³QÅÑüË™rŒè‰ƒ¯®0ë/iËiXëRWª SR¦œ†T¦ ³q/tsjó”—/ï²ÎÏdBƒñuz-‰zûí' Þò{B¾2{£BÆÈ.?ë̇\z­o§¿[å}_¼•Üô²Ýßm@$€d‡`RȬ˜ØK2Ü;z ‰¨´¯+±;¡ŸdãˉDŒ“ ÏvÚ\ö«±‹û'ã7œB I0m8PŽ’[Œ˜7"•0GἿ‘}œË|ƒñXƒÖÞ9Á#J” `©´« OvÅ’zqkd T°Þbc.+ {`„fv»å‚t{» ³Á S´§‰)Á IJ‚‡ äà) jçR¥¡Â!Í™í®èCÜo”oßB_µJw•<Ð#íìö”:žãs?²DTž#€'Q§o¯©´^Âú@GìXð+8ÇÎ+ø„-÷ed¯.F#ú9¡i×él|;¡nnÒ[<1§3L¹·™uÍJ¢Èk–´ˆ›2iîUQkÁÕ •ØÂëCI¶®¨ÔGOú¨$Ûè*Uz–)!—ÄŸf0d:ðÀÉš¡9åL8yëÌ–žµDòÍêªBƒ‹l•Òœ{ÛV+©`ŒUÅ–“©’´r•¦²L;Ϋ2Óð­2jY€‰_T h0ÊAÀŠÏÑÝ17žDcV(ˆ— >„P rY–4iYûPfÖ‹„knoMŽš+Wµ{I´í}UT¨ÄǶ{FçD¢i$.Î/¸©soc²9€é.³; hgÜNgfõ޵28ç|9´ô†Pîýç‚ðÎû^OGiÄ9ÿŒTYä³+jöÌÁ>a6YádtÑ~deGÜÅêN`FÈ\³^Õþ‚ÏÐ’bbvªB{Çð–ŸžŽ4ú"Mê*ˆ—8HÏâÊhz5ÑMB¹LS©~¢:‚ 'ô¢¾k¼#ÂŽlÎ÷ìt]2Åøõü²Šc&r[aVd|i6ÏšCì…u%öt¤ÄûÂIpâªÏKP÷o¼$•ÁO°U;µÖ ÐDñ;ù¸zé¼ñ5÷ò0µ©|Ïd‘·S5æÏ2/˜ÓâjhÐý­}†á@ÔIä‰<ðn¸hÜš#d)oÁí°ètœÃB±£ab¢„8¾´{"_|©—++ó:‚j—˜'À{GŒÈÎp•Á±Øþ-Wg÷_&0ú@‡ÒH1M‹ÿ·]Ï@”ÂôÂéê«V˜ƒ›_Ð=b=°@à.PJË6Æ,ÒØâË»I†ÇÃk4· Mg“tx{Ë=îáž'‰ÍkoAï2ÖšsƒÙP½·»ÇË"‹›Ì¦üë*O¦~ým~öÇÙWáÉòðendstream endobj 320 0 obj<>/XObject<<>>>>>>endobj 321 0 obj<>stream xµW[OãF~çWiA21IHB /«VEÝ´ªi[ƒ=Žgq<©ÇŽ¡hÿ{Ïe_6ÛÒª ™Ø3çòo¾9óûÑÆø7Ë)\, Ú}¿:ÃÎo–0™À*Á·‹å%¬b¬¢@m·…ÝF•6ºLmìBøÅžA­!Ö‰É5¨ìãg•«Žátõù(ؘg“óßÇû©Ø¢VE¬ ¨M™B™j^E3Ç0š\„Stܶ«ïµV&'‘ÚšReæ->:³J jgMÌÆ Ê”Kµk]¨¬Ð*~ñaÄ>“a ÷§!=:¿‰<Îl£é<œs\ïÞþdôŽAý¬6ÛLçýk¹â&ÂtK6´.]J§A䀉eŽdq•?å¶ÎáuªX»/ðÊÏ ]V…/é]dóH•pçt–<ÀñŽiê×A6@Ìû¾ðâ‚+罟Là„ÌЛ–…óðrzE±.Ã+ )>í—êB3u„‘âÀ‡-Nk¨S #«6:/Ž4l•s:a…ÌKl–ÙÚäk0ùÎbBÆr‚,÷|¹Ô£ñ¼E«6YÒÐ8ñ6Rø™™ÛY~h7äk@¤‘¤3íå#à*Žávòá¾óŒ!/N’º¾îÐW4OcÞNè{â¤çõ7[14%AÃËNxUµràªGWš²¢Œ_8£Ä®lÂO[Àà>àz°­&ªûSÞöb¿©.» GÓpº\.§}|¸&=iFUQ °Ôt^_7àæÂ:÷•ol´AS£i8¾ZŽeî<L†°A)ÔyŒÀà¸r•ÊBøÉÖz§‹3ª> 2óÄû®_û~:µ§P†%»è• ¥/U;d¼ES™ÈZ¤œv(Ãû½P!­ÛŒïÁ^j‹GD…µÙé°ôDÖ> 3mtŽç“ËE¿>äTx­KШÝ(á¨üº(lzêœZë3À1 un«#“¼€"ÑUUÖ¡ÐÎ(vo·í†›Ìf³IßáÈ/äD®¦F™ÿTž~@møyÏ&¼b.%æáøëË©_˜&gŠ¡L•;L á5 ÂÝ–ç ¦•Š}Á Õ„ŠÒÕ4‰#?£ÿ£ƒÊ„¾,Ã^ç¨ÔRæ¡9ÉSÌe-W‘™D! ƒ8‚6ÒÆ¤c=;è|ED¸ei«¨eZ ·9ŠúÆ:Ók<šx™<6(º-"‘ˆ§xûjõ±ïì /›ÿD=;ÀÂ^>: H×ú^—Ƀ÷wÚÜÁ¹µ ÀÓêoxùNt¶o^>¥¸ó±Ì†Ú:¤Hí rlЩ½/‡(5žÍ{ìÃÃ)5þ¨Ã&«$ä{šûÓ3"r"B‰xÔàðHáÓ{2~ŽÊNnP¥“ÌDx4oÌ:%‰0N‡pƒ2âM¡´&t­0ÞÒüµ©¨N2½-D½ ??ÑŒ¸!!ô;h(Èuý­µÒtjG{‹$_£ê9“GÄÜxµ­², ua°g¦i®D„±éíJ£L¥6<<¹t\ˆ%Á5U”Bl’ÄD¨¥~:&ƒ-ÛÎÄâC´TlŽDB¶¸/Í3{¶;\®§,*\æh/’wœ½4í;w¿‚]¼Gô¿Ý¹ÿ}ížt¥Èv‡,)uîÌ£ôÑR3räí 5w\t»õoø@M¯ø¶‡~ϼZß=w¬’ŠûM¸.½7óë~ú 3&‘8“@¢JÙŠwiàëË< ¶{ iC šJ¾îšd¾I¹yÌÔ–á£_PV*Ñ‹úP~{ž÷f¾1¿TgÛCéÉ´;naùÝj›üÆ#J æÓE8[.ÛþžÎ0¥2)‚»Í‹`ÙÌ'mäüu(“vP¦ÚQ‡sÇ¿\Yì±-T¾öXcïØ@~uIê^¬ŽÅÙ `¸Îofþz:Ïñr4Ãû:ÞO¯tGúõã*Ê`«ª´xiÏÄŸ7º_Ѥìöåü¥†ÞÎ.tӃŜ~þ¸:úùèO4]«æendstream endobj 322 0 obj<>/XObject<<>>>>>>endobj 323 0 obj<>stream xÅWKoÛF¾ûW `‹e[¶œKÚ¢z(Ò¢Òƒ/+r(mBqîÒ¢Rô¿w¤H1Ž›*Dqwgæ›Ç7³ŸÎ˜Ò7Û\Í!Ýžý¸<›Â.ߦ$°Ìiu~w ËŒ–iðnõÓ/—Î"[ú»joªLþÃ/eî`²Å°qÙ®ÂÜ6ðF_ž'pî±ÈåàåÛ»VúM|;[\Ã$¹‹ü°Ì¢÷6l l¬‡Œ”6XWú zƒ»¢p{[®!5E´¥Â}eCÀŒ[f653z’ý©Ûn± 1×#š<¡ IÔд0ÞÃñ#¸^¿Px÷÷ PŸßÈÆî}“ðSk “ÙM|3@6ŒGaÅv 4̃A„‡ˆ1S­1›nÊìá%A-a…à¶Œ3‹á=‹ãí1ëY5)L®bÑWº~‡©Ím§A#2)ÍY{íÅG>  îÚ? ð¿3)‚Fób¤ŠÍÐS²•e+[Yj¦üËë¢8À§ÚbžŇq\SNøâÛ?#ûÚ¸¹'‘)x5jý6Þùßtˆ³ÙÈÎénõA«ÂcPE ÌFZ»NêÆìvHîš Ÿºò±Î -<•\¾VU'ïîï^}δ¥÷÷e{¤Ï[-Ù¿$¸\ãyÌj±L¨‘œò$fEO•0åX…_/bsÏg‹«N¦óÞÝ’ÿÏUwrAýÞz¹|î \ ìë{h¿š EóYâX²5"£C]•ÄEú~v ƒ2T ëuêäw¤³‹B$[ŸWóT̆\³–ìˆFd !µñ×* N¸L‹Žr4fƒS°ßØt&MÑ{ÔÃLý¦L%S MeͪÀaà… Tžž=’<š¢F/£(¬’dî#–°Á´fj_Fy·µë óe ÑþÈàPVWÜ5ð+ çÀb[>:jÜdbXrÛÙšÒflê$ŠvÎ{ËÈÈc;nÝŠ' šÐ©7•™cj(bk‰0Â@+6f»ca/*zî¨Ì¸ü—å’DaÆ“jÃÀÖE°»‚èÝA­Å¤l¥’L¦´«í-1K4¯øg`Iaä©£ðJß;Úù~ìÛ¶2±|½òÁ†š>2éÛXhý9žPp2©ù7¯4i±ÙUjë_çÛƒ¾ëåý âÉ1cž°Íÿ4ÁP 8ý˜Žâztê˜HñDtLAà’©lè –=ÅJ ÐSpµœ¸„(ÍJdÚ0Õ­ãä¦}Äúëš'3âÿboô$÷=(Ti2ôÑ@„ñ:n×FQôHO†š×ÂñÌÃK.â^†¡9$Ë*2@§F¥Lº±DR<:×ð"×^o—ËG y¹¥ÏnºRÚà׿ùíÝêD¦L¤Î&ÿŽoÉHÃ-M€¦5ø‘§¾NiûŽLÉ+·e{F&¬pmKn94R¹—¸&G“[\“Ô¨ÔÕe`T( ùB1òÓZ;ÆÓ’šýeHÓcë‘ö/üüC°­”#Dìh"6 ±Ìš2LfXXbÉP&V6ƒâ¢?p}ÛmFÊ•äi öŽ2ĉÏ'C2a˜#°/³ Ï8Š rã‘›‚ø§À|LДX•4žbüÆÕ¥ v“3Ý6Rò;ÊUVOv°þ¶Ò²½gA{ækÜ“$³¦6ÓŽQ]Îs¾-mo1mÖ‘Ní‘cŽ‹ò„Ë!¿‘™*­ñ]¯ùΤÉîJò][G.Pýê§ÜVˆNqg“ì  i”üáë)c}$Œ/€Xé€×æQ¥@jjZß¹×\¾½nï‘ÉbÏïèª:‹W|]þ|Ç£À–5µF«³ÿd6½¡{&í·ÓoúÉí—¿ºGñêõíœ/¹Y4Ÿ3䟗g¿Ÿý´Ysêendstream endobj 324 0 obj<>/XObject<<>>>>>>endobj 325 0 obj<>stream x½WMoã6½ûW àbÇò·ÑC‹.`¶AQ-Ðͦ¨˜‰,ºoø¿w†CJ¶â¸ÙC»9¬(ÍǛǙGúïNüK`6„Ñä¦óã²3€{¸¾‘$°Ì õ‡ã1Lç3X¦h»”݋ˇN2cw¦º¸çõN»5?mM©6…Èy-ì}µQ…+i9€ÅÄhÝ‹÷ÿkyÞ®”tݬèÁGE¤utüÞ&@eû,\—^.PEŠîéý,€ïá…|Ñ2döð—÷%?Âï“Ñ]ðNûc*éͤÃ:i£žÉ9<›3ÁûsŽêœçSŽÞN>Å2ãÎ5Oç7p1®qa±g¨¿ ýhg"®¥·{±ØÓãÀCØC2xsó''v}‹EÌùš‹ X<éç¿Dïë›y/l»á¤?ñã°\+¦(­¤ãƽÄÑ‘¹.Rõ~þüû’›OŠV ªR¥à ”ÕªtÚUN~ˆÃ©Úbãx‚)Àaì¢Ú¬”“µJŽ%ìÖŠMÃÀ µ.AOæQ¥}¸1ÔW±Ùæê ´£o8ê¥^åŠpH‘çQh- ÕY¦,N~+ãF¹µI®Í6¢x® (ñIA¹URgšÒ?u fÃS!Уhebê4WUÇò›ß‡?b¹oDÍ‘¤À­‘Ö#AåÊ rÓJHvÇy®hW”µH"½W…²Âa=äøJg›nx¿6zËŒ Ñuk “E·áœ—ñ53Þùé6 ·c4ò~¿8Ãe©ò,hÊaû³Êø1º{=‚µÔo­‘\† Jxñ+«\em-ç5¥eÇ:Ä| w{zt@œH·úÓÉÿ0]<þ¢´ xÙ¿¦^1°mÅ×±.ø@;«4ÐU‰Mm¸ÊDõo’¶!­•|¤“K²€ ;<Ä<‡xV¬EU¢Ö ºÀœ–@úpîV¦ï+{TR|çÑG0}øÕ8ov°(ÌŽœvEÈd#ÁÞˆèÒU"åA¹6UžÒ1Š£¬YrJ…°<¾˜x:ú8£×Ÿ¨¹˜%Ú ÆÔÛ +p'•å/\N‹Á ÕÜ8m;”á"Ï}B'ä´ÉYË·&‹ ‡C·¤ù¼¹!—*ÜfV¸äª§xo÷­ÍØ‚¼yfœ‡˜?„(½ð\Ãwx°?úËÉA m0^fÃïúÉi¿áð€›ÐñŒªÉr}ƒwHþ³ö§s˜ÎæÈÝÔÿ¼]Êz°¬œ±šKî “þbˆ?"fƒ}2Ûçë_Ì“ï¼ñlJ?€ÒîtFy~Zv~ëüX Ä%endstream endobj 326 0 obj<>/XObject<>>>>>endobj 327 0 obj<>stream x¥WmoÛ6þî_qÈRØ&ŲÛI¿¬Ý @»¡˜? h”–(‹)%º$Ç úßwGR²ìÄ+%@BÊ÷þš–œÔ÷UvK¥rŽcXa)Œ’×/¸ƒÄ²†Å°•¬f™í÷é˜ñ•UÀ{LRShù–ënÎ.npnÖ³â™(º5à ¨ÈýgÒ¥JøºËJóÈ=Y)c#t WVβ’0é8ôCÛ¥N6Ò”`3×™R—V«…›ø¨€Øö¹{MnÖD‹«“ÿƒUaìÓjpÊþͦµóiè-µ#ð™)¬utƒg«k~jt#ÀÄ_áýƒZ ªÎY¤Íι+êAOÃÅ@èJéaSâpé÷cx'åA#u¦uˆ8s´¢ÇÉìúçü: ûb4¼ˆ/G)~GIãÉ%}Oø±Á|míÌG\4º•ò«ZmÏ?â"!çétBßnòÁdF×ßç½O½W[endstream endobj 328 0 obj<>/XObject<<>>>>>>endobj 329 0 obj<>stream x•VmoGþž_1¤)¾ØÁqb$ŠÊJ nU‰¤Òúnm/¹Û=n÷âXVþ{ŸÙÝ;_ÎЪ!A·oóúÌ<óíhL#üÓù)=›RZ½žhE'—4Ó|‰ÓéÅ9Í3|ÌÓÁg¥SIÂZY9e´%QIJv•H%·–[ÒRf¤#gh!ÉIë°¡–d4î Í›¶Æ;·¸´î €¸§ó¯0a8~–œBí`YçK•ç°ØúË¥¨œ–•Mèuíhi*’w¢(sI›µÔ$`NQB•v´–ÒµÐ+¼Æ=Ó6Þ e{Z2y+sSâÛÓñ/5uÕ°q-Ó–£)“…ÐYB—éÖÊRYW¥±ì$<ð—ýÒ­Mýîi­-J…gd|¤‚‹•²Á,‚ÝΔxBslÚ­v⎔}ÎO.Ó˜,ÚdBÃÓ³äÌGÏ,¾þ* ÓAp!øRäùË`àK¥­SúVTû΢¬d³Ï¦øï=:|šhü ¾dr)êÜ”)÷@qu¥9„ËeÒ‰_ ¦ð9 …WmÚ÷œh`ÉÔ! ÇXõÂ)ª…«-åÊ:ºb‹ÌÉ¢tÛ«§ ô|ÐYG×Êâ€dE)@->ƒÉ ½jpÞl1Ü{J°ol )ð,BÔ{£ôÒ„ç‚Ô¿¥És³QzEiW‘H’ßjU27ÀÃÞÿÿÌð4|–ÚÂ/¿¢Lx'«p¶ÛÝŠ¼–4¾¿ç6oM™Å×-hÇ;•HøÙ}©äJÞ•´ûûËh8»~rO_¼‚bôx-××ôâT8ÜéÚ̪ËʤA:Mõ§·ywl9&“‹‹}k:dzäb:åö” øMÇþN¦É³3ÔÄÞÓ(®ïÚcÖ÷¥öüÞG²ë{îÒÏ4:tíÇj”ôÿÓó£ îK·åϽÂÇ£‡Ž´àN» Vi‰ÒÓÔ¡(±@[õ|^Ch=@šüÆØÿ€íûˆÚñ^'t€L%QMž"˜0B;CÖ–Ë€kqžæÜ»¹·j^úÕÓc܉tt5jå-ˆ%ÀÎL¦ª¾•t4gj¥\0®ë¬ï¦`Ž®Yh xßÒ„»¥°q¡NÙ4žKs~ag‚I=o£"oy c¿BãÊ·´’x«tY»!ò‚Äì¥Òµ×üCCbÅ?LóޱðãV&ôž/°ZCÌÜ_x4øÀam¼ãà³wø“9ÐtYÂ^Ñc!fZÏßýfØû“…ÝÜn 8ÕŠù •7ÞÖ_6d!½oméq‘bQãà}gd[VèÒ¬XÉ$êm{ÓûŽ…–6¨_ã§Æ‘àe¬°Âdj¹å‰h϶{÷0 Î×ã×!9ïç°c_~ÌÉþ#,[²iN;üÓl!Éá…OY”&¿ F˜,¦ˆ0WõøõÍ~m€‘8 û~ê¼ UÉÔÜ¢D¡ý¨T™ S ú‚Í0.]{…1®¨§,—UHî¿¢|:9ƒÔtÆË·ó£ßþ’q^¾endstream endobj 330 0 obj<>/XObject<<>>>>>>endobj 331 0 obj<>stream xM; …w~ÅIì€- ºjt3Æ„ÁµÒ‡ÕÚj£&þwK}ÄËpï¹|ç.D€÷G@KLb¸™YÂQ"Z:[@Æ¡2±Ñ°YÏZGGc{ ×[×TMùnŸ»ãOµÍ{›–i5ŒìÃÄ$”}E_A±ÃàC04ïáøCž~-Õ÷)|&RA™PùŒíÚº övm»*­=Íäbš'š·çG´jﹿU:ö_Ȩæ^.,Ù©w@áendstream endobj 332 0 obj<>/XObject<>>>>>endobj 333 0 obj<>stream xµW]oÛ6}ϯ¸0 ,Emù3q²§´I³h–¶ó°bëh‰¶ÙH¢JRq ÿ}ç^ʉ­lÙÓR6%ò~œ{î¹ô׃! ðoHÓ)-x9HÆòGn‰ÕñÑ ™ŒÆ49™Òx’Œ§ÇGä4-¾ÒtœDã¾L†ÃäÛG‰Xê_ èÂÒ‡ƒ73øYRÿò„†§É`pB³’áäähŒýÃd ó³ ¾féᵪw¡‚"Ufôº¶PÁ¤°”Ö….¶|9û‚H“C6×ÛÚë&Éhs‡3Kº\©2ÕVšê2ÓÎXUs“›°ü&µ¥7>è2ÝÐ\‡µÖ%e»îdgåìÒ©‚L ãc½á8Wµ×‹:§`i¥î4)Z¨4úÀ£BÝÆZ6©R.]Htõ„f+ tþ{}§ÊéÖ”™Ç¾–ςʨõʤ+9bÊ€Ó>˜rI ëHš+ﻤ“e"~TVÖuñ&Ó>u¦b8»ò Þ¼,tH“ÆÙè(9’ or GÍކ>ÝÌÒ<æ ƒ2¥Î`ÖW:5ˆú1¼Ô×’MòcZœ­ñÀ?nxki×ôùpál±õ nžŒ?¿Dð•Ó© 즮r•b1çªÀZñ[oóšS¤µ «óž^¿¿j¡¹_›E]¦|J1O¤&dç_tbg=h@(|&HïŸç˜¶™b›¯µOè½vm§z¡ê|bJQié;•×1­@*Ïz Ì7aÅ +%½†yK¢xŒÅ›¢Ê7d–¥u:㨱}­6´Ö 3›o¹_+qÖmú•v` …vÁ9W—ÁºKfñx8­ ¨ ç ¯´Þ&ÚßÃà ƒ®ÄôŽßrm¹ùx² õ¬)¹g”)e¿$ýÍ^ØT¾1y*[B¶íÜJ’»ïas°6g²#AC–ëFHç ÞûßåÜ·!;ÝËô4—8ö’mùŒ\IèuŽv,¡Xw:߈­ìä¶G‡ Tz[;ä˜Ú ʊƕܚÒ6í០ú;Szwç3x2ÁbÊÒ$ )ŒâÐ4rŒ4}³Aw!MfœjЭψ¹¦ôØSë…I8åéËz¯=Æ”qØrý9´ü*77Á)grtå»bµ%€†·Ÿg×ïh®ÒÛº§Kó:ˆß¹ò.&ÓŠb^;{‡%ùºª,ôÕh±Õe ¸@-µçì×:Ï!W"µŸ®ßuéãÅeþ{9sf¥óª»Ï.VÑlSªøàê4ÔïnËÔøóË'µÇ˜h$I`h¨+-áéÎ /|ʦºä®+å;÷ÝÊB%dõX0R† IU€¢rj„Âú€UÊñ=Œ>•ÃÆÄ/«AeÁÛÖ¡ªCÐ]{Šÿ#›ë_¦4”1Ã#‡(¤¹_‘wi?7ó~âä›Åó÷ÅÍùÅÕǘ¾_^½{ûk4ˆ«ÆƒŒYÓh@poÆ£üÛ"Hs²î4ÕäÊ11“8óø¾ åò¸. MZˆprŸ%ø-]¨“ð=µU3"˜"X€[æŸT ²Ä^œY®ÉDÃèÎÍ­n¡4:N&'';Pó”0œóGo»c{A!üG̶µŒÛ ºWCR£ïtÏ&ÇÉøhòX]§ÁɆ1Ê ý­’†8¤ûjøêŽþ%.ÛGÙåw~#÷¾'Å`˜³â5`E½Ïs»–DþDg1Ý”é~÷6ƒUGB-6òA^±XEµë|Aí0˜={NT˲.æÚuu¼ 2j5àµlÂì΋:\ê°Æ ;^blƒ¶‹wÇ×K×¾ÔHNôÚG8ügp¾i؇€ö¸94£7CÐñU%W8aÞ5½!Î8Vü †±M endstream endobj 334 0 obj<>/XObject<>>>>>endobj 335 0 obj<>stream x¥VÛnÛF}÷W ü¤#JÔ­OI“¸ ‚¨@ò²"—ÒÆäRá.mFþ½gfIJ¦Ó6@É3·3göÛULSü‹i5£ù’ÒòЧÑ\þ¨Þã)Y®¢ùzNÉzEó$𝖠ª5åWßh5À|ŠIGkßD Fzþ6^ÐëŠ>]ý¾잞ߤǴͺØ6Ãm:¢ð—)¯éúFïh_?Û~…Í$žG3œëh—ÖæèMeéZeùûŠlSîtíÄ$YFóEr¶«µojË`#ºvMIUN*&e3R3±˜ M8˜ïlñüf݇;™-¢…D²=G÷ê4&ÕøCU –„®PĤÝøªTÞ¤ª(Nä+òM{mu3úsûþå¦Ð½µlb8¡1Ÿ„qƒÜIü/n`29TÕ-å웎º(ÊÎ¥Sanõo!‡sÉÏ9¼ £‡'ºDùÁW"ÉPÁéýÁ¤:ÖÕ¼­õ¾ÖÎq¼vþ >IØ\Ž\+´Fè?ÿýq›4¡wÊîµGmžKW.H!ϱ ÚDÓéšÉ5‹âd½˜Ó$YGëÕrÉüyÙYtÓØ”ë­ ”]·Åfrn(^D #LzˆÙ*Z'›@윯UêéU¡œ †)G±PM Ù(Jù,ZŠÂæÆ25:"z*´rž*«©Ô`Sªó½ag¡ö ‡u^ÙTxpQ‰Ö˜+6ê ä¡õ‹Ö€hëö4;êÔä(ÿÖë:W)ŠÿÚÔ¹2ƒ3¸34%@9¦@Ö¤à¿%]×`f HßDûÄh>ûªÆËYÈðÌ‹û8ÉÓ`Ç)3yޱž\ÀåÓ¥ðž$"ô,í !\Ä#JÃçΊÓ~íS9ptª£¶DV•ú{+cƒ@‰~‡3Ðôp«Ot§ŠF©þs(…™è¡‹„žŽÐÏÄ’k¡æP~%£´¨2úÅX2]hl…‡Ûï’Ëãyë$ùeQЭ±™h W£ƒºÓL\S ]2Kô®OÝœåuUŠîô\‹¨¥êþ¢×Ê«rÃ9{)T„ôCè <«Aüå,©î+{ÃÇŠEý1A©T'ÚiŒfmî »Ó€2®ÙMd:ŒÝÓ—#hP[Ã/2M+Ë<ïÖŠõzüÁyŽ¿<‹ûRÛ ³M´¡zuÐ) ·§WUYBœÌÛN󫻯7îänL˜ê÷Ú«‰ Ðéßg…j%PvÅá´«MFE+휂WƲ›®N,þiŘ\a1Б%«Yš‡ÄµRÇc=Ë­Ê0ÀmŒ; Æþ^c>/±e]W’[ïO²ÅŽ:z„¥4ðJÂ/G­>XÄŽš#ëž¼ò4$œa ‡ßx^8ÛÀ¦üÁVþÿd«EŽzÖfÍ—§ld\¾oÏÏøýyl o³è‘¾Íeý¤ˆ œtXÉ l&ì®Ð¤pÄžÆ]„>æ\J³?x¶j¬Ø!ÞäR­l1$÷9{¾¿®jK‰'ŒŒå¨Àþ°ñø†×m½¶;®Ub'Cr®µü2Žú/K2e¶K‚”±çq'ÓýËcÚíkÙ_]ܲ=Õb0›G»¥·ø MeïÞBWäRw y*ÐTü ˜*lŒö3+Â¥!ö“ÛÝßžì±¶Á? DŸübmVËÀ“Ç|HÚ›í÷öé’–+0jÆ7òQwÛâ[UpZ“ÙtÉÀv\Mÿõ.”tžV¹7Û«OWÿ³&¿endstream endobj 336 0 obj<>/XObject<<>>>>>>endobj 337 0 obj<>stream xWÛnÛF}÷W Òa“u¡$ç)5lô% Š h&VÔJ\›•»´lù÷ž™%%ŠNòP 0¤ÝáÌ™™3þ{ÓŸ˜æcš$”¿®.F´£«»”â˜V[Š'Ñx:¥d1§Õ²«4¨Ö÷¿«BÇoV÷³e4[.ø|[h§Ò\YËWóe4M¦þª}dÌçWwKŠgÑ”µ‡ñlMF …ãeÏXËí“qô›*7¹®½ø¢…2‚TÅc–zGNÙÚV5)Ú×Õ®VEaÊåªÜ5j§/ÉV€c m©Ú’5…ÉUM¦ØWµSeªIáb}¯SGi­•3UyIÆ’Ë4›…1vmµRm]ݤ,ÑßViNº´M .SŽTž· -©Z“ÈWÏzCp†ÕšÚŸAGU{S>Vz30xÈtÙZPû}nRA3º†Êéˆîà¸Xt[•'Ã0%ªs¦d TÕ×ÚËîÉKâD†­žˆþíß‹ ƒi³ Òǹ1¥–y?Ov»\;a™xBv¯S³}žfê˜* ëѨ… ž V’“o‡f<‹fBß}È»ø¡¤|Rv˜µ¤$äë1°–ö’ó­jrGºØ»çk–8u .ÍÎÑõõSåÒüúÚ+óŠ9U¢–>f8m‰Ó—¯ô…ÏÇI4],NU÷“Ns£K'Y ÈfU“Kµ„ÊÐeûõyñ–1­¼«ü©ËL{rB±®6Ï| þÞòMED_ùäê®ß‹:‡`0ˆ«[ŽpRŠ.ö{1õ%Ýq¸‹2hFù0(ž´*uɑɇ©ˆ—Ñ"á†ÚÁë[·ÚÝöbßÅ çi_zw&=€ÐlÊsÅç± ;H]C})øªèû/q$FèJ]ê?|w õ%5ûýò0tˆ¡ÿ§ã ÐL RxÌç´íîìédaVÇžéèúŠy‰NóŠ¥Â´ý€S­zïdåÇk |é:—Œ~q³¯ ªFB„ h1¹XFÃ}…©i1ö4FÙ_Æe¬±G‚—‰äö§kÊ”‚¢èO°SWÜÅœÞDtí"2[:hß^ªtlÐW«(9o³Ë}W×GWYŒï@ÊGs'õYùðÿσWÿH Îù˜Ÿëÿô–ã B’ðS³xÁ¥oÕK€¦Œ ÛÄyÖŽÞßš©ék™,B« ì)ñNF7í*ÃpOfÑ|¼œŽÑFÑD¶,ô,?};A¬_I’`ÉÛz+”–P×]úU08N5Þ²JÆïq`cÃÚçš õ ‚©?TeMÃpa•‚“k˜õÆO³ÅB‡£Ù©vü&޲u4ÑÆñ`b¶bÍÚW¥5k“‡qéOÑÎeóÓuDì’~R‚b­óêÀãâ` ÿ€ˆM†ß·‰ÅS¼d`ð ñŽvq8 R©Ýy•ÆPS˜¬[ ÎÄú çoÍ–¾ìž<Ó(Ïv7­ÎoÉŒÑie½»ü0 u“1—vöÛV?*Ù$|c’¾Ôä™ïMp¦ÝãûÄMØæ'ú™M°å0Í¢%¶Žc/üa{ײÌRÒÈʃ] $!,ÚhTØMxÇ’ôó¶ýÚß¾Æ( l†¾Û ÂÓ¾¯œÆ: WãûÆržø7’'¿ŒÙ%®î¦ÇŸe4áÍg>’ Ùo«!­€»6>v¨(¸ŒR ç£% Ýd:}à.{ãAZyGYk>òå ¿#ñŒMñ=¯Ú태vçþy»ºøãâ?‡0¼endstream endobj 338 0 obj<>/XObject<<>>>>>>endobj 339 0 obj<>stream x=ŽÁ‚0DïýŠ9bBK[ …£9jLöà•4Eø[Ew/3™7Ù}2éWÁj¬3¸žm‰I\‘”9”]|šåT{A.zŒC=»æµ¢KJ÷g¸NEª=•üL¼õ:†âÛ4KSËTÚÀØ¥~>’ëÀAó4ŒmÕœÿ(nenl|ØWSëp¨ú»±ñf¸ÖØ,|ZGÖ»'vbo2d8*endstream endobj 340 0 obj<>/XObject<>>>>>endobj 341 0 obj<>stream xWÁnÛ8½ç+Fu€X±lÇvzÛ$M7hÓ´¨]Ô9Ðm«‘D•¤âÅþû¾!)ÙU»=lŠ4‘5œy3ïÍ óõ$¦!þÅ4ÑxJIqÂÃhì¾Hoð4ÄÑl>¦É|F“q4Œa«%­O¾Òlyã!~™Äq4§éÅ(ržÎïâ ºQôáäj8:¿S| ‡sZ¬iÅ“ùÅöq4i‘"Ö"éß•Vn´°Y¹¡O‹$§÷ZáƒÂÐ.³[º>]|ÊA<ŽF8ÔõÍÊÒdª4´ì›:Ù’0´x³<õv!lÌ!MÌ`L§Ã)Ÿ¿’‰¨$‘ç!^¢ŠB”©!4³’ìVÒË—ß”–RÒT"‘g”YÊ Õ¦ÆÉ=•Š*­V¹,È*œòIÈXŸËCÁ­FÂ9É6ƒˆî•±¤ÖH‰ýï”~2Î_Q)mï¢Å¸ìçÙ“¤‡Õ™Ø³N¸ë\³}áÌûç:qÄÀC;e d§Eåidyûâ²~Ö™†¸En¥.ÑßÏÈ‹a8ÕuðEQå¨Q€Æ…rÉøH3cu¶ª9ýȇ~®ŠÆšKK®Ã¸õ]ËrCÌN´×7W÷” +VÂÄØŠ!8þÈŽS,œˆA{8«8xæ(ä‘ì«oª Љ².ÏqN?b;¸ùtÿ–*¡ÔQpõë>JѰê ÕÀ?#:°.\ÚŠh±Åˆù‰À‡‡è#.}Õ¹8ìºNRP> ŠãaìYGCY !÷0S}sA48&Õû $ÄØ Ícm´U©‰èŽ…Ë’Þ ÂáÛÓŠ‹äÛ}•qÛíÑfF% ü‚sw€Ð*i.ýbiõ‹šƒ`°j“¯u…rlâ &h<«ëÄ*¶E'‹<Û8vÒ Š•µØz]×ùAq¿åºHÌ‹Cµx"´€Å¤ôã%¢¿CWc÷ïšþéÂî€mJëü‡“w7|X°}m|œRíÜŒÁæY%èmÞÆ®Õ°!–}m"ÚAzµáußÃb}ê-OÝpÑrƒ‡‚tÜ(]Á€¬Ûy>ï÷ú’éò4¢wÊQÍ()—~_öŒÌ×½N¼ÆçJâ*Så˜ íp1‰ªÂ „Êþô:„ÔP¸_¼Á±Db„ù(¬ÕcÕo•»›N¸¶i KNzö“,=R„Äúƒ>Ôþ¸îØ;‰›É²”øšÒCy“m¯ÝÛ¬~·j:!}Õy•_äØîèB PtðîˆÁ[H2ÓÌ2ß¼3G¸÷ç>ÉN¸m&µÐÉvÏw¢âñªÁJ9l~›Pìnb|y›Lp!k/¼Ù¦O÷û+/h÷8hçß~÷¬ÿÃOîÈnš» uóJÇØMüÑô‚«ÎÆÐw~3šF“ùü४m€Ò«¼¸è³óPì=:Q º§‰¶£êïPÅãQ„ póMûY™Yà€m/¢K\žÚ FhI«½“úØŠyxÃÒw>>ò#L>\ƒçÓiÝØg¡½_*þ¯Êlós|oCŸÃÏè-—îÌÏ5!| ,Æ7õî÷tå Æ‰^8rMaÜ´¨Ï1Ç,ðÐüó!³0þÂx|$6ë¸ã¹B/Iuñ•öÀÿ/™¡<æ#>//ñÇÕ¡š®›½Ñ÷¦ý)¶.ŽòƒÅ‡A~ç·“Ðj#ÐhBÓé,šÇ3šßFZÔX\™È}êÁn0^²ÑŸxY`”'ôޝ;×Zº¹Î¶“YÐÌì‚_-N>œü ©"€Ëendstream endobj 342 0 obj<>/XObject<<>>>>>>endobj 343 0 obj<>stream x…V]oÛ6}ϯ¸Èòà¶š8Žóñ0 MÛ-(Öb˜²nhŠ‚’h›µ$*$Eúßw.)Ûªâm PKy¿Î=çòþà„ŽñwBçS:SZ¼ŽŽiI/ߥtrBñ‚NN£élFó‹sŠ3ìÓÑO/âo#áÇIëÂÓäçð{~’Ú9]Úqx˰Íè6¼èRv‹ðëV²à§cš°C¸-´‘"]…ï = J(ýNO¼à7!ªíf¿ßÚ×Þ#%SDߟ­$ä-÷Âzùî¢ËQLÏ¢3F¼’tèŒJׇä4Ù:±N¹ÚaÕÊ|qHr+U2 ´6F–Ž éV:#›êJR£ÍÚ²!‘ç´VefI/(ÕE!ÊlWŠ=‰H×6¢·N–V¡‚pš®HXŠßi¥ù Í6ðÝ[÷!P˪\ZŽòn´Ìu"ò»ô ŒI.-hdžG—·§(ìïíVˆÙ覔Õ•.©KñãGy]*×FtSZ'EF­®É®tc³•Øk(SqÑ](È_'ßdêç+䕿”Š’t™·>ÎA>*T¡•¢¶©ìEw7Bíè¯|R¤÷µ2H rÛ…GvàÂe’«÷bìc_‰É> ±–¨¶ÁËJ8鿘ðÑÙ»DrÓn ± 8¢˜íqމ¤ í0;4ÒÇþa“âá›Ü±¯ß‰D¿ÜÞ\çÂÚк\åÊè”OŒ(©Už½-iaº 4™Î£ÙÅÅŽ%…§ßÉet1Ÿ3•³ÑÐ?Ûšt¶äBK›Ž¸Gl{âä£Û€IŸ½æ‚øruå÷ÿ)òzÇsÿVvÚ±;CO7h.òç=m'³ytzöÙýú~¾~Р¦G¯ëX‘h€+EQå(»$6Ú4cÄP9Ó‘éÛuÇͦ þgÎòz£²¥tÝÚôlǤ|нÎY-58¯2)¼Ý=î œYP¥­U âØ[Žßƒ¦ÜÅ> ÜФ½y³£+½*ý®nÏ¥®´àY0é‰z g¼‚€±šÞ×Ò3h›ÍÍ›l5î ÅR`™'C# a0a*Ö’•ˆ‘¥K•:ìÕŽ 1—C)“6°q¼I¾1¢ªä3} ªѯÒpQ` ÈLéÚ'Òø…ÓÆÍS ƒim…nôµ‡‰… JtX—ëæ…{…R®Q$R6ÝÃ’Ñ5rræ‡ü9HîF©-å ê!ZCJ†‰Yå,QA’ºNòÚ˜Œ•ak¡™€ð˜,Úeճˀ`íá·m©Ë¶@]òvØf4þÝÀ°ñp£× ôT¡Õû!wXè<× î’Ñ$¦ð»‰Ç¶¼n} £§Ã#¨3'0jÒ\U‰F 3 ]ÃìÍ à…Æž¥Q I!–’jÞu²/l(¢ HÐä•á$Ñ÷¾+ݚܺè"ä¶ÐÔ¸øsCå •b‹#ºº:Úeõõ«[ݽû†‡Ùs¼­CÿøžûŸƒNo5®£íñÙ#vwYÙ¯n1 -–úA໚qe‚dm¯'\£~í‚ µ\9Ô]£‡n û ágN¨Ý® þ}R ƒtÒ„Ï=ÒïiƒÁáçWÇU}å/y§—Ñùéô¿¦[ÀÚã;Œ¸íÛBà­þäœñíö ¸°Â²{Ä[¾°É&Ýb|ñ5-<¡îÝÒÞûœ|ÝÆ£ úÞŸ™ Ü"?ëî¡Óã³èrŠË÷1ò™ñ¼ØO(†Œá^çmO6Û&çÇ—¼éÕVã>°<\ƒÎÌö9;ïÿùœ_߯¿üÌ3·>/XObject<>>>>>endobj 345 0 obj<>stream x¥VMsâ8½ó+úR…bœCÈ.³IÈ Nej—­Za ã‰-{${&üûm  I6©ÚÆj©ûõ{¯õ£g‰ |œ!DyO=šÄÑ |z&qmÜ‘ŽKè`°îýß!» ¿¸–EF¸Ü&z§‹™åÁU_zŸB<'‹ëX1Í„k°‰åŽ<×[ÄÁíÃÏ £þW¶f‚ñˆÉóð;¦£â°,c´A`Hÿ¯?ãš`Q –¯Xô4€;Vç”s°MÓÿ[m¡Õá}x ° ¸%ݘßHv óÕwUÆ'*Y ”Ç», Ë!¶:p’Q)›·“"/ ™ViÁ¡XC((WO?ܦÏ)—Û‡_"§zn‹b]ý¢aÈ¢ /²"Ùê…pƒe´<×¹Ù%ßÖîß\ kDü¦«o‹UÛªÂß  /Ê>Ô§*jQ pf(þCFyRÓ„¬Ë²`Ö3™&\ebXij½Ñˆ¦‡I4p”´Â¸„!Ø!Wˆ”ñ Á“‘HË*åÉ~kIŒ(÷¢ˆ‹ñ­TØMæópqðª L Þ ½þÕ³›NÍÛóöp¦ ëQ@oeÅrÍ£>r„r¸JYR à–n5R'Ÿ”øΫã<Ëˌ刊£I–,J×iÔøÕ*÷×RE—L» ×$;†”(0ïæ‹ñ? Ë‹ Äá®1ôXˆ'¹)JÄtÏAÝYŸ íÀ °³ÃCgÇ"Ú¤J¡L·l_ ÎÙj‹ûþb1CÙ뤖ÕkPoù’ч‘œò åQƕ֩ÔViš‡ ¢Ž<«(êdó|FŽeJ{ºëÑ^²Sž¤œ1¼ ]‡¾Ëþø~1,ÏCúDÑ d=€Ï´¤ˆá‹”u‰ÿ‡"ºùqÝ›‡*匱Ð{×Пܴ?í¼ƒ‚ySÓoWßúÈ11;ȆQf?]B¸aà£ØÓ»Ù7´þì"|êH¿AlŒ K§=S9€k¶5Ú1q˜¾ãóV!qªë€xÎÐw›…ÿÅFýq]‡úx,¡ÂR¤òNTßÕ–Óå¶³'U…CLÏò‡ÇÎ9NÁ=¾Æ)¡½°ÃÛ¿Ô8À‰_.¶zôÔ:`\–YІ«æQ­'8j±Õ·…Ž}ͦÓiÓRÜñ–}gy®{mt.',W¡Ä h–éQx“òx•ÑXz/Џ"p¼|B»Ö˜>WŒ«a­Z§³oX®=Æ®¹ìØoì‡s§z¢Éܶ´þ~:¶ªÎtŸ¼¦H·¹"-‰xàš²QßÈÐÌ0'º«Í4Gl|Ø.¾©ï‰c|©®`ÜÑœÁD0­<µÖõ‡êæ÷}_=NÃÞ—Þ¿Ó=9œendstream endobj 346 0 obj<>endobj 347 0 obj<>endobj 348 0 obj<>1<>0<>]>>>>endobj xref 0 349 0000000000 65535 f 0000000015 00000 n 0000000219 00000 n 0000001540 00000 n 0000094188 00000 n 0000094373 00000 n 0000095282 00000 n 0000095360 00000 n 0000095436 00000 n 0000095517 00000 n 0000095601 00000 n 0000095737 00000 n 0000095796 00000 n 0000101999 00000 n 0000106375 00000 n 0000112880 00000 n 0000125206 00000 n 0000127224 00000 n 0000129967 00000 n 0000132093 00000 n 0000132195 00000 n 0000132297 00000 n 0000132399 00000 n 0000132501 00000 n 0000132603 00000 n 0000132705 00000 n 0000132807 00000 n 0000132909 00000 n 0000133011 00000 n 0000133113 00000 n 0000133215 00000 n 0000133317 00000 n 0000133419 00000 n 0000133521 00000 n 0000133623 00000 n 0000133725 00000 n 0000133827 00000 n 0000133929 00000 n 0000134031 00000 n 0000134133 00000 n 0000134235 00000 n 0000134337 00000 n 0000134439 00000 n 0000134541 00000 n 0000134643 00000 n 0000134745 00000 n 0000134847 00000 n 0000134949 00000 n 0000135051 00000 n 0000135153 00000 n 0000135255 00000 n 0000135357 00000 n 0000135459 00000 n 0000135561 00000 n 0000135663 00000 n 0000135765 00000 n 0000135867 00000 n 0000135969 00000 n 0000136070 00000 n 0000136170 00000 n 0000136270 00000 n 0000136573 00000 n 0000136675 00000 n 0000136777 00000 n 0000136879 00000 n 0000136981 00000 n 0000137083 00000 n 0000137185 00000 n 0000137287 00000 n 0000137389 00000 n 0000137491 00000 n 0000137593 00000 n 0000137695 00000 n 0000137797 00000 n 0000137899 00000 n 0000138006 00000 n 0000138108 00000 n 0000138209 00000 n 0000138311 00000 n 0000138413 00000 n 0000138457 00000 n 0000138557 00000 n 0000138580 00000 n 0000138682 00000 n 0000138783 00000 n 0000138813 00000 n 0000138915 00000 n 0000138938 00000 n 0000139040 00000 n 0000139063 00000 n 0000139165 00000 n 0000139188 00000 n 0000139290 00000 n 0000139313 00000 n 0000139415 00000 n 0000139438 00000 n 0000139540 00000 n 0000139563 00000 n 0000139665 00000 n 0000139688 00000 n 0000139790 00000 n 0000139814 00000 n 0000139848 00000 n 0000139882 00000 n 0000141654 00000 n 0000141697 00000 n 0000141740 00000 n 0000141783 00000 n 0000141826 00000 n 0000141869 00000 n 0000141912 00000 n 0000141955 00000 n 0000141998 00000 n 0000142041 00000 n 0000142084 00000 n 0000142127 00000 n 0000142170 00000 n 0000142213 00000 n 0000142256 00000 n 0000142299 00000 n 0000142342 00000 n 0000142385 00000 n 0000142428 00000 n 0000142471 00000 n 0000142514 00000 n 0000142557 00000 n 0000142600 00000 n 0000142643 00000 n 0000142686 00000 n 0000142729 00000 n 0000142772 00000 n 0000142815 00000 n 0000142858 00000 n 0000142901 00000 n 0000142944 00000 n 0000142987 00000 n 0000143030 00000 n 0000143073 00000 n 0000143116 00000 n 0000143159 00000 n 0000143202 00000 n 0000143245 00000 n 0000143288 00000 n 0000143331 00000 n 0000143374 00000 n 0000143417 00000 n 0000143460 00000 n 0000143503 00000 n 0000143546 00000 n 0000143589 00000 n 0000143632 00000 n 0000143675 00000 n 0000143718 00000 n 0000143761 00000 n 0000143804 00000 n 0000143847 00000 n 0000143890 00000 n 0000143933 00000 n 0000143976 00000 n 0000144019 00000 n 0000144062 00000 n 0000144105 00000 n 0000144148 00000 n 0000144191 00000 n 0000144234 00000 n 0000144277 00000 n 0000144320 00000 n 0000144363 00000 n 0000144406 00000 n 0000144449 00000 n 0000144492 00000 n 0000144535 00000 n 0000144578 00000 n 0000144621 00000 n 0000144664 00000 n 0000144707 00000 n 0000144750 00000 n 0000144793 00000 n 0000144836 00000 n 0000144879 00000 n 0000144922 00000 n 0000144965 00000 n 0000145008 00000 n 0000145051 00000 n 0000145094 00000 n 0000145137 00000 n 0000145180 00000 n 0000145223 00000 n 0000145266 00000 n 0000145309 00000 n 0000145980 00000 n 0000146127 00000 n 0000146347 00000 n 0000146494 00000 n 0000146667 00000 n 0000146880 00000 n 0000149159 00000 n 0000149340 00000 n 0000150213 00000 n 0000150444 00000 n 0000152630 00000 n 0000152806 00000 n 0000153110 00000 n 0000153317 00000 n 0000154192 00000 n 0000154367 00000 n 0000155533 00000 n 0000155708 00000 n 0000156693 00000 n 0000156868 00000 n 0000158116 00000 n 0000158291 00000 n 0000159675 00000 n 0000159841 00000 n 0000161388 00000 n 0000161554 00000 n 0000163019 00000 n 0000163185 00000 n 0000164374 00000 n 0000164586 00000 n 0000166243 00000 n 0000166465 00000 n 0000168293 00000 n 0000168468 00000 n 0000170038 00000 n 0000170213 00000 n 0000171710 00000 n 0000171887 00000 n 0000173717 00000 n 0000173892 00000 n 0000175583 00000 n 0000175758 00000 n 0000177398 00000 n 0000177573 00000 n 0000179029 00000 n 0000179194 00000 n 0000181032 00000 n 0000181207 00000 n 0000183000 00000 n 0000183197 00000 n 0000184456 00000 n 0000184631 00000 n 0000186020 00000 n 0000186195 00000 n 0000188129 00000 n 0000188318 00000 n 0000189934 00000 n 0000190100 00000 n 0000191405 00000 n 0000191580 00000 n 0000192942 00000 n 0000193128 00000 n 0000194845 00000 n 0000195022 00000 n 0000196126 00000 n 0000196301 00000 n 0000197700 00000 n 0000197866 00000 n 0000199065 00000 n 0000199276 00000 n 0000201492 00000 n 0000201676 00000 n 0000203409 00000 n 0000203584 00000 n 0000204516 00000 n 0000204723 00000 n 0000205677 00000 n 0000205875 00000 n 0000206854 00000 n 0000207029 00000 n 0000208265 00000 n 0000208431 00000 n 0000209733 00000 n 0000209931 00000 n 0000211380 00000 n 0000211564 00000 n 0000212910 00000 n 0000213117 00000 n 0000214295 00000 n 0000214484 00000 n 0000216382 00000 n 0000216548 00000 n 0000217584 00000 n 0000217759 00000 n 0000219166 00000 n 0000219332 00000 n 0000220596 00000 n 0000220771 00000 n 0000222062 00000 n 0000222262 00000 n 0000224498 00000 n 0000224663 00000 n 0000226331 00000 n 0000226506 00000 n 0000227572 00000 n 0000227728 00000 n 0000228184 00000 n 0000228416 00000 n 0000230023 00000 n 0000230212 00000 n 0000231638 00000 n 0000231813 00000 n 0000233197 00000 n 0000233372 00000 n 0000234755 00000 n 0000234930 00000 n 0000236447 00000 n 0000236613 00000 n 0000237315 00000 n 0000237522 00000 n 0000239153 00000 n 0000239343 00000 n 0000240907 00000 n 0000241082 00000 n 0000242678 00000 n 0000242844 00000 n 0000243185 00000 n 0000243383 00000 n 0000245365 00000 n 0000245531 00000 n 0000246936 00000 n 0000247102 00000 n 0000248707 00000 n 0000248873 00000 n 0000250391 00000 n 0000250557 00000 n 0000251799 00000 n 0000251997 00000 n 0000253449 00000 n 0000253615 00000 n 0000255208 00000 n 0000255365 00000 n 0000255627 00000 n 0000255825 00000 n 0000257482 00000 n 0000257689 00000 n 0000259111 00000 n 0000259286 00000 n 0000260812 00000 n 0000260978 00000 n 0000261218 00000 n 0000261416 00000 n 0000263073 00000 n 0000263239 00000 n 0000264691 00000 n 0000264888 00000 n 0000266180 00000 n 0000266235 00000 n 0000266320 00000 n trailer <]>> startxref 266545 %%EOF ./xotcl-1.6.8/doc/._xo-daemon.html000644 000765 000024 00000000430 12327771636 017372 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/xo-daemon.html000644 000765 000024 00000005260 12327771636 017163 0ustar00neumannstaff000000 000000 XOTcl - Documentation -- ./apps/utils/xo-daemon

./apps/utils/xo-daemon ./apps/utils/xo-daemon


Package/File Information

No package provided/required

Filename: ./apps/utils/xo-daemon

Description: This script can be used to start/stop/restart xotcl daemons and maintains the process IDs, log files and means for easy restart.

It receives as first parameter the name of the xotcl script to be executed followed by the desired action and optional parameters. The specified action can be

  • start: the specified script is started in the background, an entry to restart is generated in the run-directory as well as the process id of the started script. In addition a logfile is created in the log directory. If the start of the script fails, the error messages are shown.
  • startall: all scripts that were started before via this script, are started
  • stop terminates te specified script.
  • stopall terminates all scripts started via this command
  • restart tries to restart the specified script.
The optional parameters are:
  • -logir specifies the directory for logging. The default is ~/.xotcl/log.
  • -rundir specifies the directory where the information about the running processes is kept. The default is ~/.xotcl/run.
Authors: Gustaf Neumann, Gustaf.Neumann@wu-wien.ac.at
Date: [::xotcl::rcs date {$Date: 2006/02/18 22:17:32 $}]



Back to index page.

./xotcl-1.6.8/doc/._xo-whichPkg.html000644 000765 000024 00000000430 12327771636 017673 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/xo-whichPkg.html000644 000765 000024 00000003027 12327771636 017463 0ustar00neumannstaff000000 000000 XOTcl - Documentation -- ./apps/utils/xo-whichPkg

./apps/utils/xo-whichPkg ./apps/utils/xo-whichPkg


Package/File Information

No package provided/required

Filename: ./apps/utils/xo-whichPkg

Description: A small sample script to show which package is loaded from where when a target package is loaded.

Usage: "xo-whichPkg -pkg PACKAGENAME"

Authors: Fredj Dridi dridi@nestroy.wi-inf.uni-essen.de
Date: [::xotcl::rcs date {$Date: 2006/02/18 22:17:32 $}]



Back to index page.

./xotcl-1.6.8/doc/._xocomm-test.html000644 000765 000024 00000000430 12161600406 017740 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/xocomm-test.html000644 000765 000024 00000002523 12161600406 017530 0ustar00neumannstaff000000 000000 XOTcl - Documentation -- ../library/comm/xocomm.test

../library/comm/xocomm.test ../library/comm/xocomm.test


Package/File Information

Package required: XOTcl
Package required: xotcl::comm::httpAccess
Package required: xotcl::comm::ftp
Package required: xotcl::trace

Filename: ../library/comm/xocomm.test

Description: This is a webclient used as a regression test. When it is started it launches an xotcl-Web server as partner process. It tests currently the basic functionality of:
  • GET and PUT requests
  • Basic Access Control



Back to index page.

./xotcl-1.6.8/doc/._xotcl-doc.css000644 000765 000024 00000000430 12161600406 017201 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/doc/xotcl-doc.css000644 000765 000024 00000001463 12161600406 016773 0ustar00neumannstaff000000 000000 BODY { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: normal; background-color : white; color: black; } tt { font-family: courier, monospace; } A { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: 100; background-color : white; } A em { font-weight: 900; } pre.code { font-size: 90%; font-family: courier, monospace; PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BORDER: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee; MARGIN-BOTTOM: 15px; } pre em { font-family: cursive; color: #888888; } pre tt { font-family: helvetica; font-weight: 900; } pre it { font-style: italic; color: green; } tt em { font-family: cursive; color: #888888; } table { font-size: 80%; } ./xotcl-1.6.8/generic/._aol-xotcl.tcl000644 000765 000024 00000000430 12161600406 020050 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/aol-xotcl.tcl000644 000765 000024 00000004336 12161600406 017644 0ustar00neumannstaff000000 000000 # $Id: aol-xotcl.tcl,v 1.15 2007/08/14 16:38:26 neumann Exp $ # # Load XOTcl library and some related packages. # We expect to find them somewhere in standard # Tcl package search path (the auto_path var) # The simplest location is to put them under # the "lib" directory within the AOLserver tree. # package require XOTcl 1; namespace import ::xotcl::* package require xotcl::serializer ns_log notice "XOTcl version $::xotcl::version$::xotcl::patchlevel loaded" # # Overload procedure defined in bin/init.tcl. # It is now XOTcl-savvy in how it treats some # special namespaces. # proc _ns_savenamespaces {} { set script [_ns_getpackages] set import "" set nslist "" _ns_getnamespaces namespaces foreach n $namespaces { if {[string match "::xotcl*" $n] == 0 && ([catch {::xotcl::Object isobject $n} ret] || $ret == 0)} { lappend nslist $n } } foreach n $nslist { foreach {ns_script ns_import} [_ns_getscript $n] { append script [list namespace eval $n $ns_script] \n if {$ns_import ne ""} { append import [list namespace eval $n $ns_import] \n } } } if {[catch {::Serializer all} objects]} { ns_log notice "XOTcl extension not loaded; will not copy objects\ (error: $objects; $::errorInfo)." set objects "" } ns_ictl save [append script \n \ "namespace import -force ::xotcl::*" \n \ $objects \n $import] # just for debugging purposes if {0} { set f [open [::xotcl::tmpdir]/__aolserver-blueprint.tcl w] puts $f $script close $f } } # # Source XOTcl files from shared/private library # the way AOLserver does for plain Tcl files. # proc _my_sourcefiles {shared private} { set files "" foreach file [lsort [glob -nocomplain -directory $shared *.xotcl]] { if {[file exists [file join $private [file tail $file]]] == 0} { lappend files $file } } foreach file [lsort [glob -nocomplain -directory $private *.xotcl]] { lappend files $file } foreach file $files { _ns_sourcefile $file } } ns_eval { _my_sourcefiles [ns_library shared] [ns_library private] } # EOF $RCSfile: aol-xotcl.tcl,v $ ./xotcl-1.6.8/generic/._aolstub.c000644 000765 000024 00000000430 12161600406 017257 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/aolstub.c000644 000765 000024 00000011645 12161600406 017054 0ustar00neumannstaff000000 000000 /* This file provides the stubs needed for the AOL_SERVER, Please note, that you have to have to apply a small patch to the AOL server as well (available from www.xotcl.org) in order to get it working. Author: Zoran Vasiljevic Archiware Inc. Various updates from Gustaf Neumann */ #ifdef AOL_SERVER #include "xotcl.h" #include NS_EXPORT int Ns_ModuleVersion = 1; #if NS_MAJOR_VERSION>=4 # define AOL4 #endif /* *---------------------------------------------------------------------------- * * NsXotcl_Init -- * * Loads the package for the first time, i.e. in the startup thread. * * Results: * Standard Tcl result * * Side effects: * Package initialized. Tcl commands created. * *---------------------------------------------------------------------------- */ static int NsXotcl_Init (Tcl_Interp *interp, void *context) { static int firsttime = 1; int ret; ret = Xotcl_Init(interp); if (firsttime) { if (ret != TCL_OK) { Ns_Log(Warning, "can't load module %s: %s", (char *)context, Tcl_GetStringResult(interp)); } else { Ns_Log(Notice, "%s module version %s%s", (char*)context, XOTCLVERSION,XOTCLPATCHLEVEL); /* * Import the XOTcl namespace only for the shell after * predefined is through */ Tcl_Import(interp, Tcl_GetGlobalNamespace(interp), "xotcl::*", 0); } firsttime = 0; } return ret; } /* *---------------------------------------------------------------------------- * * NsXotcl_Init1 -- * * Loads the package in each thread-interpreter. * This is needed since XOTcl Class/Object commands are not copied * from the startup thread to the connection (or any other) thread. * during AOLserver initialization and/or thread creation times. * * Why ? * * Simply because these two commands declare a delete callback which is * unsafe to call in any other thread but in the one which created them. * * To understand this, you may need to get yourself acquainted with the * mechanics of the AOLserver, more precisely, with the way Tcl interps * are initialized (dive into nsd/tclinit.c in AOLserver distro). * * So, we made sure (by patching the AOLserver code) that no commands with * delete callbacks declared, are ever copied from the startup thread. * Additionaly, we also made sure that AOLserver properly invokes any * AtCreate callbacks. So, instead of activating those callbacks *after* * running the Tcl-initialization script (which is the standard behaviour) * we activate them *before*. So we may get a chance to configure the * interpreter correctly for any commands within the init script. * * Proper XOTcl usage would be to declare all resources (classes, objects) * at server initialization time and let AOLserver machinery to copy them * (or re-create them, better yet) in each new thread. * Resources created within a thread are automatically garbage-collected * on thread-exit time, so don't create any XOTcl resources there. * Create them in the startup thread and they will automatically be copied * for you. * Look in /modules/tcl/xotcl for a simple example. * * Results: * Standard Tcl result. * * Side effects: * Tcl commands created. * *---------------------------------------------------------------------------- */ static int NsXotcl_Init1 (Tcl_Interp *interp, void *notUsed) { int result; #ifndef AOL4 result = Xotcl_Init(interp); #else result = TCL_OK; #endif /* * Import the XOTcl namespace only for the shell after * predefined is through */ Tcl_Import(interp, Tcl_GetGlobalNamespace(interp), "xotcl::*", 1); return result; } /* *---------------------------------------------------------------------------- * * Ns_ModuleInit -- * * Called by the AOLserver when loading shared object file. * * Results: * Standard AOLserver result * * Side effects: * Many. Depends on the package. * *---------------------------------------------------------------------------- */ int Ns_ModuleInit(char *hServer, char *hModule) { int ret; /*Ns_Log(Notice, "+++ ModuleInit","INIT");*/ ret = Ns_TclInitInterps(hServer, NsXotcl_Init, (void*)hModule); if (ret == TCL_OK) { /* * See discussion for NsXotcl_Init1 procedure. * Note that you need to patch AOLserver for this to work! * The patch basically forbids copying of C-level commands with * declared delete callbacks. It also runs all AtCreate callbacks * BEFORE AOLserver runs the Tcl script for initializing new interps. * These callbacks are then responsible for setting up the stage * for correct (XOTcl) extension startup (including copying any * XOTcl resources (classes, objects) created in the startup thread. */ Ns_TclRegisterAtCreate((Ns_TclInterpInitProc *)NsXotcl_Init1, NULL); } return ret == TCL_OK ? NS_OK : NS_ERROR; } #endif ./xotcl-1.6.8/generic/._mk_predefined.xotcl000755 000765 000024 00000000430 12161600406 021314 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/mk_predefined.xotcl000755 000765 000024 00000002020 12161600406 021074 0ustar00neumannstaff000000 000000 #!./xotclsh # $Id: mk_predefined.xotcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ # A small script file that creates a static array from a tcl- # script for inclusion in c programs -gn set f [open predefined.xotcl] set content [read $f] close $f regsub -all {\\} $content && content regsub -all {"} $content {\"} content ;#" regsub -all "\[ \]+\n" $content \n content ;# remove trailing space regsub -all "\n\[ \t\]+" $content \n content ;# remove leading space regsub -all "\n#\[^\n\]*\n" $content \n content ;# remove comment lines regsub -all "\n#\[^\n\]*\n" $content \n content ;# remove comment lines regsub -all "\n#\[^\n\]*\n" $content \n content ;# remove comment lines regsub -all "\n#\[^\n\]*\n" $content \n content ;# remove comment lines regsub -all "\[\n\]+" $content \n content ;# remove empty lines regsub -all "\n}" $content "}" content ;# newlines btwn braces regsub -all "\n" $content "\\n\"\n\"" content puts "static char cmd\[\] = " puts "\"$content\";" puts "" ./xotcl-1.6.8/generic/._predefined.h000644 000765 000024 00000000430 12161600406 017720 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/predefined.h000644 000765 000024 00000061742 12161600406 017520 0ustar00neumannstaff000000 000000 static char cmd[] = "# $Id: predefined.xotcl,v 1.16 2007/09/05 19:09:22 neumann Exp $\n" "foreach cmd [info command ::xotcl::Object::instcmd::*] {\n" "::xotcl::alias ::xotcl::Object [namespace tail $cmd] $cmd}\n" "foreach cmd {array append eval incr lappend trace subst unset} {\n" "::xotcl::alias ::xotcl::Object $cmd -objscope ::$cmd}\n" "foreach cmd [info command ::xotcl::Class::instcmd::*] {\n" "::xotcl::alias ::xotcl::Class [namespace tail $cmd] $cmd}\n" "unset cmd\n" "::xotcl::Object instproc init args {}\n" "::xotcl::Object create ::xotcl::@\n" "::xotcl::@ proc unknown args {}\n" "proc ::xotcl::myproc {args} {linsert $args 0 [::xotcl::self]}\n" "proc ::xotcl::myvar {var} {::xotcl::my requireNamespace; return [::xotcl::self]::$var}\n" "namespace eval ::xotcl { namespace export @ myproc myvar Attribute}\n" "::xotcl::setrelation ::xotcl::Class::Parameter superclass ::xotcl::Class\n" "::xotcl::Class::Parameter instproc mkParameter {obj name args} {\n" "if {[$obj exists $name]} {\n" "eval [$obj set $name] configure $args} else {\n" "$obj set $name [eval ::xotcl::my new -childof $obj $args]}}\n" "::xotcl::Class::Parameter instproc getParameter {obj name args} {\n" "[$obj set $name]}\n" "::xotcl::Class::Parameter proc Class {param args} {\n" "::xotcl::my set access [lindex $param 0]\n" "::xotcl::my set setter mkParameter\n" "::xotcl::my set getter getParameter\n" "::xotcl::my set extra {[::xotcl::self]}\n" "::xotcl::my set defaultParam [lrange $param 1 end]}\n" "::xotcl::Class::Parameter proc default {val} {\n" "[::xotcl::my set cl] set __defaults([::xotcl::my set name]) $val}\n" "::xotcl::Class::Parameter proc setter x {\n" "::xotcl::my set setter $x}\n" "::xotcl::Class::Parameter proc getter x {\n" "::xotcl::my set getter $x}\n" "::xotcl::Class::Parameter proc access obj {\n" "::xotcl::my set access $obj\n" "::xotcl::my set extra \\[::xotcl::self\\]\n" "foreach v [$obj info vars] {::xotcl::my set $v [$obj set $v]}}\n" "::xotcl::Class::Parameter proc values {param args} {\n" "set cl [::xotcl::my set cl]\n" "set ci [$cl info instinvar]\n" "set valueTest {}\n" "foreach a $args {\n" "::lappend valueTest \"\\[\\$cl set $param\\] == [list $a]\"}\n" "::lappend ci [join $valueTest \" || \"]\n" "$cl instinvar $ci}\n" "::xotcl::Class create ::xotcl::MetaSlot\n" "::xotcl::setrelation ::xotcl::MetaSlot superclass ::xotcl::Class\n" "::xotcl::MetaSlot instproc new args {\n" "set slotobject [self callingobject]::slot\n" "if {![my isobject $slotobject]} {Object create $slotobject; namespace eval $slotobject {namespace import ::xotcl::*; puts stderr IMPORT}}\n" "eval next -childof $slotobject $args}\n" "::xotcl::MetaSlot create ::xotcl::Slot -array set __defaults {\n" "name \"[namespace tail [::xotcl::self]]\"\n" "domain \"[lindex [regexp -inline {^(.*)::slot::[^:]+$} [::xotcl::self]] 1]\"\n" "defaultmethods {get assign}\n" "manager \"[::xotcl::self]\"\n" "multivalued false\n" "per-object false}\n" "foreach p {name domain defaultmethods manager default multivalued type\n" "per-object initcmd valuecmd valuechangedcmd} {\n" "::xotcl::Slot instparametercmd $p}\n" "unset p\n" "::xotcl::alias ::xotcl::Slot get ::xotcl::setinstvar\n" "::xotcl::alias ::xotcl::Slot assign ::xotcl::setinstvar\n" "::xotcl::Slot instproc add {obj prop value {pos 0}} {\n" "if {![my multivalued]} {\n" "error \"Property $prop of [my domain]->$obj ist not multivalued\"}\n" "if {[$obj exists $prop]} {\n" "$obj set $prop [linsert [$obj set $prop] $pos $value]} else {\n" "$obj set $prop [list $value]}}\n" "::xotcl::Slot instproc delete {-nocomplain:switch obj prop value} {\n" "set old [$obj set $prop]\n" "set p [lsearch -glob $old $value]\n" "if {$p>-1} {$obj set $prop [lreplace $old $p $p]} else {\n" "error \"$value is not a $prop of $obj (valid are: $old)\"}}\n" "::xotcl::Slot instproc unknown {method args} {\n" "set methods [list]\n" "foreach m [my info methods] {\n" "if {[::xotcl::Object info methods $m] ne \"\"} continue\n" "if {[string match __* $m]} continue\n" "lappend methods $m}\n" "error \"Method '$method' unknown for slot [self]; valid are: {[lsort $methods]]}\"}\n" "::xotcl::Slot instproc init {} {\n" "my instvar name domain manager\n" "set forwarder [expr {[my per-object] ? \"forward\" : \"instforward\"}]\n" "if {$domain eq \"\"} {\n" "set domain [self callingobject]}\n" "$domain $forwarder $name -default [$manager defaultmethods] $manager %1 %self %proc}\n" "::xotcl::MetaSlot create ::xotcl::InfoSlot -array set __defaults {\n" "multivalued true\n" "elementtype ::xotcl::Class}\n" "::xotcl::InfoSlot instparametercmd elementtype\n" "::xotcl::setrelation ::xotcl::InfoSlot superclass ::xotcl::Slot\n" "::xotcl::InfoSlot instproc get {obj prop} {$obj info $prop}\n" "::xotcl::InfoSlot instproc add {obj prop value {pos 0}} {\n" "if {![my multivalued]} {\n" "error \"Property $prop of [my domain]->$obj ist not multivalued\"}\n" "$obj $prop [linsert [$obj info $prop] $pos $value]}\n" "::xotcl::InfoSlot instproc delete {-nocomplain:switch obj prop value} {\n" "set old [$obj info $prop]\n" "if {[string first * $value] > -1 || [string first \\[ $value] > -1} {\n" "if {[my elementtype] ne \"\" && ![string match ::* $value]} {\n" "set value ::$value}\n" "return [$obj $prop [lsearch -all -not -glob -inline $old $value]]} elseif {[my elementtype] ne \"\"} {\n" "if {[string first :: $value] == -1} {\n" "if {![my isobject $value]} {\n" "error \"$value does not appear to be an object\"}\n" "set value [$value self]}\n" "if {![$value isclass [my elementtype]]} {\n" "error \"$value does not appear to be of type [my elementtype]\"}}\n" "set p [lsearch -exact $old $value]\n" "if {$p > -1} {\n" "$obj $prop [lreplace $old $p $p]} else {\n" "error \"$value is not a $prop of $obj (valid are: $old)\"}}\n" "::xotcl::MetaSlot create ::xotcl::InterceptorSlot\n" "::xotcl::setrelation ::xotcl::InterceptorSlot superclass ::xotcl::InfoSlot\n" "::xotcl::alias ::xotcl::InterceptorSlot set ::xotcl::setrelation ;# for backwards compatibility\n" "::xotcl::alias ::xotcl::InterceptorSlot assign ::xotcl::setrelation\n" "::xotcl::InterceptorSlot instproc add {obj prop value {pos 0}} {\n" "if {![my multivalued]} {\n" "error \"Property $prop of [my domain]->$obj ist not multivalued\"}\n" "$obj $prop [linsert [$obj info $prop -guards] $pos $value]}\n" "namespace eval ::xotcl::Class::slot {}\n" "namespace eval ::xotcl::Object::slot {}\n" "::xotcl::InfoSlot create ::xotcl::Class::slot::superclass\n" "::xotcl::alias ::xotcl::Class::slot::superclass assign ::xotcl::setrelation\n" "::xotcl::InfoSlot create ::xotcl::Object::slot::class\n" "::xotcl::alias ::xotcl::Object::slot::class assign ::xotcl::setrelation\n" "::xotcl::InterceptorSlot create ::xotcl::Object::slot::mixin\n" "::xotcl::InterceptorSlot create ::xotcl::Object::slot::filter -elementtype \"\"\n" "::xotcl::InterceptorSlot create ::xotcl::Class::slot::instmixin\n" "::xotcl::InterceptorSlot create ::xotcl::Class::slot::instfilter -elementtype \"\"\n" "::xotcl::MetaSlot create ::xotcl::Attribute -superclass ::xotcl::Slot\n" "foreach p {default value_check initcmd valuecmd valuechangedcmd} {\n" "::xotcl::Attribute instparametercmd $p}\n" "unset p\n" "::xotcl::Attribute array set __defaults {\n" "value_check once}\n" "::xotcl::Attribute instproc __default_from_cmd {obj cmd var sub op} {\n" "$obj trace remove variable $var $op [list [self] [self proc] $obj $cmd]\n" "$obj set $var [$obj eval $cmd]}\n" "::xotcl::Attribute instproc __value_from_cmd {obj cmd var sub op} {\n" "$obj set $var [$obj eval $cmd]}\n" "::xotcl::Attribute instproc __value_changed_cmd {obj cmd var sub op} {\n" "eval $cmd}\n" "::xotcl::Attribute instproc destroy {} {\n" "next}\n" "::xotcl::Attribute instproc check_single_value {\n" "{-keep_old_value:boolean true}\n" "value predicate type obj var} {\n" "if {![expr $predicate]} {\n" "if {[$obj exists __oldvalue($var)]} {\n" "$obj set $var [$obj set __oldvalue($var)]} else {\n" "$obj unset -nocomplain $var}\n" "error \"$value is not of type $type\"}\n" "if {$keep_old_value} {$obj set __oldvalue($var) $value}}\n" "::xotcl::Attribute instproc check_multiple_values {values predicate type obj var} {\n" "foreach value $values {\n" "my check_single_value -keep_old_value false $value $predicate $type $obj $var}\n" "$obj set __oldvalue($var) $value}\n" "::xotcl::Attribute instproc mk_type_checker {} {\n" "set __initcmd \"\"\n" "if {[my exists type]} {\n" "my instvar type name\n" "if {[::xotcl::Object isclass $type]} {\n" "set predicate [subst -nocommands {[::xotcl::Object isobject \\$value]\n" "&& [\\$value istype $type]}]} elseif {[llength $type]>1} {\n" "set predicate \"\\[$type \\$value\\]\"} else {\n" "set predicate \"\\[string is $type \\$value\\]\"}\n" "my append valuechangedcmd [subst {\n" "my [expr {[my multivalued] ? \"check_multiple_values\" : \"check_single_value\"}] \\[\\$obj set $name\\] \\\n" "{$predicate} [list $type] \\$obj $name}]\n" "append __initcmd [subst -nocommands {\n" "if {[my exists $name]} {my set __oldvalue($name) [my set $name]}\\n}]}\n" "return $__initcmd}\n" "::xotcl::Attribute instproc init {} {\n" "my instvar domain name\n" "next ;# do first ordinary slot initialization\n" "$domain unset -nocomplain __defaults($name)\n" "set __initcmd \"\"\n" "if {[my exists default]} {\n" "if {[my per-object] && ![$domain exists $name]} {\n" "$domain set $name [my default]} elseif {![my per-object]} {\n" "$domain set __defaults($name) [my default]}} elseif [my exists initcmd] {\n" "append __initcmd \"my trace add variable [list $name] read \\\n" "\\[list [self] __default_from_cmd \\[self\\] [list [my initcmd]]\\]\\n\"} elseif [my exists valuecmd] {\n" "append __initcmd \"my trace add variable [list $name] read \\\n" "\\[list [self] __value_from_cmd \\[self\\] [list [my valuecmd]]\\]\"}\n" "append __initcmd [my mk_type_checker]\n" "if {[my exists valuechangedcmd]} {\n" "append __initcmd \"my trace add variable [list $name] write \\\n" "\\[list [self] __value_changed_cmd \\[self\\] [list [my valuechangedcmd]]\\]\"}\n" "if {$__initcmd ne \"\"} {\n" "if {[my per-object]} {\n" "$domain eval $__initcmd} else {\n" "$domain set __initcmds($name) $__initcmd}}}\n" "::xotcl::Class create ::xotcl::Slot::Nocheck \\\n" "-instproc check_single_value args {;} -instproc check_multiple_values args {;} \\\n" "-instproc mk_type_checker args {return \"\"}\n" "::xotcl::Class create ::xotcl::Slot::Optimizer \\\n" "-instproc proc args {::xotcl::next; ::xotcl::my optimize} \\\n" "-instproc forward args {::xotcl::next; ::xotcl::my optimize} \\\n" "-instproc init args {::xotcl::next; ::xotcl::my optimize} \\\n" "-instproc optimize {} {\n" "if {[::xotcl::my multivalued]} return\n" "if {[::xotcl::my defaultmethods] ne {get assign}} return\n" "if {[::xotcl::my procsearch assign] ne \"::xotcl::Slot instcmd assign\"} return\n" "if {[::xotcl::my procsearch get] ne \"::xotcl::Slot instcmd get\"} return\n" "set forwarder [expr {[::xotcl::my per-object] ? \"parametercmd\":\"instparametercmd\"}]\n" "[::xotcl::my domain] $forwarder [::xotcl::my name]}\n" "::xotcl::Slot instmixin add ::xotcl::Slot::Optimizer\n" "::xotcl::Class create ::xotcl::ScopedNew -superclass ::xotcl::Class \\\n" "-array set __defaults {withclass ::xotcl::Object}\n" "::xotcl::ScopedNew instparametercmd withclass\n" "::xotcl::ScopedNew instparametercmd inobject\n" "::xotcl::ScopedNew instproc init {} {\n" "::xotcl::my instproc new {-childof args} {\n" "[::xotcl::self class] instvar {inobject object} withclass\n" "if {![::xotcl::my isobject $object]} {\n" "$withclass create $object}\n" "eval ::xotcl::next -childof $object $args}}\n" "::xotcl::Object instproc contains {\n" "{-withnew:boolean true}\n" "-object\n" "{-class ::xotcl::Object}\n" "cmds} {\n" "if {![info exists object]} {set object [::xotcl::self]}\n" "if {![::xotcl::my isobject $object]} {\n" "$class create $object\n" "$object requireNamespace}\n" "if {$withnew} {\n" "set m [::xotcl::ScopedNew new \\\n" "-inobject $object -withclass $class -volatile]\n" "::xotcl::Class instmixin add $m end\n" "namespace eval $object $cmds\n" "::xotcl::Class instmixin delete $m} else {\n" "namespace eval $object $cmds}}\n" "::xotcl::Class instforward slots %self contains \\\n" "-object {%::xotcl::my subst [::xotcl::self]::slot}\n" "::xotcl::Class instproc parameter arglist {\n" "if {![::xotcl::my isobject [self]::slot]} {::xotcl::Object create [self]::slot}\n" "foreach arg $arglist {\n" "set l [llength $arg]\n" "set name [lindex $arg 0]\n" "if {$l == 1} {\n" "::xotcl::Attribute create [::xotcl::self]::slot::$name} elseif {$l == 2} {\n" "::xotcl::Attribute create [::xotcl::self]::slot::$name [list -default [lindex $arg 1]]} elseif {$l == 3 && [lindex $arg 1] eq \"-default\"} {\n" "::xotcl::Attribute create [::xotcl::self]::slot::$name [list -default [lindex $arg 2]]} else {\n" "set paramstring [string range $arg [expr {[string length $name]+1}] end]\n" "if {[string match {[$\\[]*} $paramstring]} {\n" "::xotcl::Attribute create [::xotcl::self]::slot::$name [list -default $paramstring]\n" "continue}\n" "set po ::xotcl::Class::Parameter\n" "puts stderr \"deprecated parameter usage '$arg'; use '-slots {Attribute ...}' instead\"\n" "set cl [self]\n" "$po set name $name\n" "$po set cl [self]\n" "::eval $po configure [lrange $arg 1 end]\n" "if {[$po exists extra] || [$po exists setter] ||\n" "[$po exists getter] || [$po exists access]} {\n" "$po instvar extra setter getter access defaultParam\n" "if {![info exists extra]} {set extra \"\"}\n" "if {![info exists defaultParam]} {set defaultParam \"\"}\n" "if {![info exists setter]} {set setter set}\n" "if {![info exists getter]} {set getter set}\n" "if {![info exists access]} {set access ::xotcl::my}\n" "$cl instproc $name args \"\n" "if {\\[llength \\$args] == 0} {\n" "return \\[$access $getter $extra $name\\]} else {\n" "return \\[eval $access $setter $extra $name \\$args $defaultParam \\]}\"\n" "foreach instvar {extra defaultParam setter getter access} {\n" "$po unset -nocomplain $instvar}} else {\n" "::xotcl::my instparametercmd $name}}}\n" "[self]::slot set __parameter $arglist}\n" "::xotcl::Object instproc self {} {::xotcl::self}\n" "::xotcl::Object instproc defaultmethod {} {\n" "return [::xotcl::self]}\n" "::xotcl::Object instproc hasclass cl {\n" "if {[::xotcl::my ismixin $cl]} {return 1}\n" "::xotcl::my istype $cl}\n" "::xotcl::Class instproc allinstances {} {\n" "return [::xotcl::my info instances -closure]}\n" "::xotcl::Object proc unsetExitHandler {} {\n" "::xotcl::Object proc __exitHandler {} {\n" ";}}\n" "::xotcl::Object unsetExitHandler\n" "::xotcl::Object proc setExitHandler {newbody} {\n" "::xotcl::Object proc __exitHandler {} $newbody}\n" "::xotcl::Object proc getExitHandler {} {\n" "::xotcl::Object info body __exitHandler}\n" "::xotcl::Object instproc abstract {methtype methname arglist} {\n" "if {$methtype ne \"proc\" && $methtype ne \"instproc\" && $methtype ne \"method\"} {\n" "error \"invalid method type '$methtype', \\\n" "must be either 'proc', 'instproc' or 'method'.\"}\n" "::xotcl::my $methtype $methname $arglist \"\n" "if {!\\[::xotcl::self isnextcall\\]} {\n" "error \\\"Abstract method $methname $arglist called\\\"} else {::xotcl::next}\n" "\"}\n" "::xotcl::Class create ::xotcl::Object::CopyHandler -parameter {\n" "{targetList \"\"}\n" "{dest \"\"}\n" "objLength}\n" "::xotcl::Object::CopyHandler instproc makeTargetList t {\n" "::xotcl::my lappend targetList $t\n" "if {[::xotcl::my isobject $t]} {\n" "if {[$t info hasNamespace]} {\n" "set children [$t info children]} else {\n" "return}}\n" "foreach c [namespace children $t] {\n" "if {![::xotcl::my isobject $c]} {\n" "lappend children [namespace children $t]}}\n" "foreach c $children {\n" "::xotcl::my makeTargetList $c}}\n" "::xotcl::Object::CopyHandler instproc copyNSVarsAndCmds {orig dest} {\n" "::xotcl::namespace_copyvars $orig $dest\n" "::xotcl::namespace_copycmds $orig $dest}\n" "::xotcl::Object::CopyHandler instproc getDest origin {\n" "set tail [string range $origin [::xotcl::my set objLength] end]\n" "return ::[string trimleft [::xotcl::my set dest]$tail :]}\n" "::xotcl::Object::CopyHandler instproc copyTargets {} {\n" "foreach origin [::xotcl::my set targetList] {\n" "set dest [::xotcl::my getDest $origin]\n" "if {[::xotcl::my isobject $origin]} {\n" "if {[::xotcl::my isclass $origin]} {\n" "set cl [[$origin info class] create $dest -noinit]\n" "set obj $cl\n" "$cl superclass [$origin info superclass]\n" "$cl parameterclass [$origin info parameterclass]\n" "$cl instinvar [$origin info instinvar]\n" "$cl instfilter [$origin info instfilter -guards]\n" "$cl instmixin [$origin info instmixin]\n" "my copyNSVarsAndCmds ::xotcl::classes$origin ::xotcl::classes$dest} else {\n" "set obj [[$origin info class] create $dest -noinit]}\n" "$obj invar [$origin info invar]\n" "$obj check [$origin info check]\n" "$obj mixin [$origin info mixin]\n" "$obj filter [$origin info filter -guards]\n" "if {[$origin info hasNamespace]} {\n" "$obj requireNamespace}} else {\n" "namespace eval $dest {}}\n" "::xotcl::my copyNSVarsAndCmds $origin $dest\n" "foreach i [$origin info forward] {\n" "eval [concat $dest forward $i [$origin info forward -definition $i]]}\n" "if {[::xotcl::my isclass $origin]} {\n" "foreach i [$origin info instforward] {\n" "eval [concat $dest instforward $i [$origin info instforward -definition $i]]}}\n" "set traces [list]\n" "foreach var [$origin info vars] {\n" "set cmds [$origin trace info variable $var]\n" "if {$cmds ne \"\"} {\n" "foreach cmd $cmds {\n" "foreach {op def} $cmd break\n" "set domain [lindex $def 0]\n" "if {$domain eq $origin} {\n" "set def [concat $dest [lrange $def 1 end]]}\n" "if {[my isobject $domain] && [$domain istype ::xotcl::Slot]} {\n" "continue}\n" "$dest trace add variable $var $op $def}}}}\n" "set origin [lindex [::xotcl::my set targetList] 0]\n" "if {[::xotcl::my isclass $origin]} {\n" "foreach oldslot [$origin info slots] {\n" "set newslot ${cl}::slot::[namespace tail $oldslot]\n" "if {[$oldslot domain] eq $origin} {$newslot domain $cl}\n" "if {[$oldslot manager] eq $oldslot} {$newslot manager $newslot}}}}\n" "::xotcl::Object::CopyHandler instproc copy {obj dest} {\n" "::xotcl::my set objLength [string length $obj]\n" "::xotcl::my set dest $dest\n" "::xotcl::my makeTargetList $obj\n" "::xotcl::my copyTargets}\n" "::xotcl::Object instproc copy newName {\n" "if {[string compare [string trimleft $newName :] [string trimleft [::xotcl::self] :]]} {\n" "[[::xotcl::self class]::CopyHandler new -volatile] copy [::xotcl::self] $newName}}\n" "::xotcl::Object instproc move newName {\n" "if {[string trimleft $newName :] ne [string trimleft [::xotcl::self] :]} {\n" "if {$newName ne \"\"} {\n" "::xotcl::my copy $newName}\n" "if {[::xotcl::my isclass [::xotcl::self]] && $newName ne \"\"} {\n" "foreach subclass [::xotcl::my info subclass] {\n" "set scl [$subclass info superclass]\n" "if {[set index [lsearch -exact $scl [::xotcl::self]]] != -1} {\n" "set scl [lreplace $scl $index $index $newName]\n" "$subclass superclass $scl}} }\n" "::xotcl::my destroy}}\n" "::xotcl::Object create ::xotcl::config\n" "::xotcl::config proc load {obj file} {\n" "source $file\n" "foreach i [array names ::auto_index [list $obj *proc *]] {\n" "set type [lindex $i 1]\n" "set meth [lindex $i 2]\n" "if {[$obj info ${type}s $meth] == {}} {\n" "$obj $type $meth auto $::auto_index($i)}}}\n" "::xotcl::config proc mkindex {meta dir args} {\n" "set sp {[ ]+}\n" "set st {^[ ]*}\n" "set wd {([^ ;]+)}\n" "foreach creator $meta {\n" "::lappend cp $st$creator${sp}create$sp$wd\n" "::lappend ap $st$creator$sp$wd}\n" "foreach method {proc instproc} {\n" "::lappend mp $st$wd${sp}($method)$sp$wd}\n" "foreach cl [concat ::xotcl::Class [::xotcl::Class info heritage]] {\n" "eval ::lappend meths [$cl info instcommands]}\n" "set old [pwd]\n" "cd $dir\n" "::append idx \"# Tcl autoload index file, version 2.0\\n\"\n" "::append idx \"# xotcl additions generated with \"\n" "::append idx \"\\\"::xotcl::config::mkindex [list $meta] [list $dir] $args\\\"\\n\"\n" "set oc 0\n" "set mc 0\n" "foreach file [eval glob -nocomplain -- $args] {\n" "if {[catch {set f [open $file]} msg]} then {\n" "catch {close $f}\n" "cd $old\n" "error $msg}\n" "while {[gets $f line] >= 0} {\n" "foreach c $cp {\n" "if {[regexp $c $line x obj]==1 &&\n" "[string index $obj 0]!={$}} then {\n" "::incr oc\n" "::append idx \"set auto_index($obj) \"\n" "::append idx \"\\\"::xotcl::config::load $obj \\$dir/$file\\\"\\n\"}}\n" "foreach a $ap {\n" "if {[regexp $a $line x obj]==1 &&\n" "[string index $obj 0]!={$} &&\n" "[lsearch -exact $meths $obj]==-1} {\n" "::incr oc\n" "::append idx \"set auto_index($obj) \"\n" "::append idx \"\\\"::xotcl::config::load $obj \\$dir/$file\\\"\\n\"}}\n" "foreach m $mp {\n" "if {[regexp $m $line x obj ty pr]==1 &&\n" "[string index $obj 0]!={$} &&\n" "[string index $pr 0]!={$}} then {\n" "::incr mc\n" "::append idx \"set \\{auto_index($obj \"\n" "::append idx \"$ty $pr)\\} \\\"source \\$dir/$file\\\"\\n\"}}}\n" "close $f}\n" "set t [open tclIndex a+]\n" "puts $t $idx nonewline\n" "close $t\n" "cd $old\n" "return \"$oc objects, $mc methods\"}\n" "::xotcl::Object instproc extractConfigureArg {al name {cutTheArg 0}} {\n" "set value \"\"\n" "upvar $al argList\n" "set largs [llength $argList]\n" "for {set i 0} {$i < $largs} {incr i} {\n" "if {[lindex $argList $i] == $name && $i + 1 < $largs} {\n" "set startIndex $i\n" "set endIndex [expr {$i + 1}]\n" "while {$endIndex < $largs &&\n" "[string first - [lindex $argList $endIndex]] != 0} {\n" "lappend value [lindex $argList $endIndex]\n" "incr endIndex}}}\n" "if {[info exists startIndex] && $cutTheArg != 0} {\n" "set argList [lreplace $argList $startIndex [expr {$endIndex - 1}]]}\n" "return $value}\n" "::xotcl::Object create ::xotcl::rcs\n" "::xotcl::rcs proc date string {\n" "lreplace [lreplace $string 0 0] end end}\n" "::xotcl::rcs proc version string {\n" "lindex $string 2}\n" "if {![info exists ::env(HOME)]} {set ::env(HOME) /root}\n" "set ::xotcl::confdir ~/.xotcl\n" "set ::xotcl::logdir $::xotcl::confdir/log\n" "::xotcl::Class proc __unknown name {}\n" "::xotcl::Class instproc uses list {\n" "foreach package $list {\n" "::xotcl::package import -into [self] $package\n" "puts stderr \"*** using ${package}::* in [self]\"}}\n" "::xotcl::Class create ::xotcl::package -superclass ::xotcl::Class -parameter {\n" "provide\n" "{version 1.0}\n" "{autoexport {}}\n" "{export {}}}\n" "::xotcl::package proc create {name args} {\n" "set nq [namespace qualifiers $name]\n" "if {$nq ne \"\" && ![namespace exists $nq]} {Object create $nq}\n" "next}\n" "::xotcl::package proc extend {name args} {\n" "my require $name\n" "eval $name configure $args}\n" "::xotcl::package instproc contains script {\n" "if {[my exists provide]} {\n" "package provide [my provide] [my version]} else {\n" "package provide [self] [my version]}\n" "namespace eval [self] {namespace import ::xotcl::*}\n" "namespace eval [self] $script\n" "foreach e [my export] {\n" "set nq [namespace qualifiers $e]\n" "if {$nq ne \"\"} {\n" "namespace eval [self]::$nq [list namespace export [namespace tail $e]]} else {\n" "namespace eval [self] [list namespace export $e]}}\n" "foreach e [my autoexport] {\n" "namespace eval :: [list namespace import [self]::$e]}}\n" "::xotcl::package configure \\\n" "-set component . \\\n" "-set verbose 0 \\\n" "-set packagecmd ::package\n" "::xotcl::package proc unknown args {\n" "eval [my set packagecmd] $args}\n" "::xotcl::package proc verbose value {\n" "my set verbose $value}\n" "::xotcl::package proc present args {\n" "if {$::tcl_version<8.3} {\n" "my instvar loaded\n" "switch -exact -- [lindex $args 0] {\n" "-exact {set pkg [lindex $args 1]}\n" "default {set pkg [lindex $args 0]}}\n" "if {[info exists loaded($pkg)]} {\n" "return $loaded($pkg)} else {\n" "error \"not found\"}} else {\n" "eval [my set packagecmd] present $args}}\n" "::xotcl::package proc import {{-into ::} pkg} {\n" "my require $pkg\n" "namespace eval $into [subst -nocommands {\n" "namespace import ${pkg}::*}]\n" "foreach e [$pkg export] {\n" "set nq [namespace qualifiers $e]\n" "if {$nq ne \"\"} {\n" "namespace eval $into$nq [list namespace import ${pkg}::$e]}}}\n" "::xotcl::package proc require args {\n" "::xotcl::my instvar component verbose uses loaded\n" "set prevComponent $component\n" "if {[catch {set v [eval package present $args]} msg]} {\n" "switch -exact -- [lindex $args 0] {\n" "-exact {set pkg [lindex $args 1]}\n" "default {set pkg [lindex $args 0]}}\n" "set component $pkg\n" "lappend uses($prevComponent) $component\n" "set v [uplevel \\#1 [my set packagecmd] require $args]\n" "if {$v ne \"\" && $verbose} {\n" "set path [lindex [::package ifneeded $pkg $v] 1]\n" "puts \"... $pkg $v loaded from '$path'\"\n" "set loaded($pkg) $v ;# loaded stuff needed for Tcl 8.0}}\n" "set component $prevComponent\n" "return $v}\n" "::xotcl::Object instproc method {name arguments body} {\n" "my proc name $arguments $body }\n" "::xotcl::Class instproc method {-per-object:switch name arguments body} {\n" "if {${per-object}} {\n" "my proc $name $arguments $body} else {\n" "my instproc $name $arguments $body}}\n" "proc ::xotcl::tmpdir {} {\n" "foreach e [list TMPDIR TEMP TMP] {\n" "if {[info exists ::env($e)] \\\n" "&& [file isdirectory $::env($e)] \\\n" "&& [file writable $::env($e)]} {\n" "return $::env($e)}}\n" "if {$::tcl_platform(platform) eq \"windows\"} {\n" "foreach d [list \"C:\\\\TEMP\" \"C:\\\\TMP\" \"\\\\TEMP\" \"\\\\TMP\"] {\n" "if {[file isdirectory $d] && [file writable $d]} {\n" "return $d}}}\n" "return /tmp}\n" ""; ./xotcl-1.6.8/generic/._predefined.xotcl000644 000765 000024 00000000430 12161600406 020622 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/predefined.xotcl000644 000765 000024 00000072204 12161600406 020415 0ustar00neumannstaff000000 000000 # $Id: predefined.xotcl,v 1.16 2007/09/05 19:09:22 neumann Exp $ # provide the standard command set for ::xotcl::Object foreach cmd [info command ::xotcl::Object::instcmd::*] { ::xotcl::alias ::xotcl::Object [namespace tail $cmd] $cmd } # provide some Tcl-commands as methods for Objects foreach cmd {array append eval incr lappend trace subst unset} { ::xotcl::alias ::xotcl::Object $cmd -objscope ::$cmd } # provide the standard command set for ::xotcl::Class foreach cmd [info command ::xotcl::Class::instcmd::*] { ::xotcl::alias ::xotcl::Class [namespace tail $cmd] $cmd } unset cmd # init must exist on Object. per default it is empty. ::xotcl::Object instproc init args {} # documentation stub object -> just ignore # all documentations if xoDoc is not loaded ::xotcl::Object create ::xotcl::@ ::xotcl::@ proc unknown args {} proc ::xotcl::myproc {args} {linsert $args 0 [::xotcl::self]} proc ::xotcl::myvar {var} {::xotcl::my requireNamespace; return [::xotcl::self]::$var} namespace eval ::xotcl { namespace export @ myproc myvar Attribute} ######################## # Parameter definitions ######################## ::xotcl::setrelation ::xotcl::Class::Parameter superclass ::xotcl::Class ::xotcl::Class::Parameter instproc mkParameter {obj name args} { #puts "[::xotcl::self proc] $obj $name <$args>" if {[$obj exists $name]} { eval [$obj set $name] configure $args } else { $obj set $name [eval ::xotcl::my new -childof $obj $args] } } ::xotcl::Class::Parameter instproc getParameter {obj name args} { #puts "[::xotcl::self proc] $obj $name <$args>" [$obj set $name] } ::xotcl::Class::Parameter proc Class {param args} { #puts "*** [::xotcl::self] parameter: [::xotcl::self proc] '$param' <$args>" ::xotcl::my set access [lindex $param 0] ::xotcl::my set setter mkParameter ::xotcl::my set getter getParameter ::xotcl::my set extra {[::xotcl::self]} ::xotcl::my set defaultParam [lrange $param 1 end] } ::xotcl::Class::Parameter proc default {val} { [::xotcl::my set cl] set __defaults([::xotcl::my set name]) $val } ::xotcl::Class::Parameter proc setter x { ::xotcl::my set setter $x } ::xotcl::Class::Parameter proc getter x { ::xotcl::my set getter $x } ::xotcl::Class::Parameter proc access obj { ::xotcl::my set access $obj ::xotcl::my set extra \[::xotcl::self\] foreach v [$obj info vars] {::xotcl::my set $v [$obj set $v]} } ::xotcl::Class::Parameter proc values {param args} { set cl [::xotcl::my set cl] set ci [$cl info instinvar] set valueTest {} foreach a $args { ::lappend valueTest "\[\$cl set $param\] == [list $a]" } ::lappend ci [join $valueTest " || "] $cl instinvar $ci } ################## # Slot definitions ################## # bootstrap code; we cannot use -parameter yet ::xotcl::Class create ::xotcl::MetaSlot ::xotcl::setrelation ::xotcl::MetaSlot superclass ::xotcl::Class ::xotcl::MetaSlot instproc new args { set slotobject [self callingobject]::slot if {![my isobject $slotobject]} {Object create $slotobject; namespace eval $slotobject {namespace import ::xotcl::*; puts stderr IMPORT}} #namespace eval [self]::slot $cmds #puts "metaslot $args // [namespace current] // [self callingobject]" eval next -childof $slotobject $args } ::xotcl::MetaSlot create ::xotcl::Slot -array set __defaults { name "[namespace tail [::xotcl::self]]" domain "[lindex [regexp -inline {^(.*)::slot::[^:]+$} [::xotcl::self]] 1]" defaultmethods {get assign} manager "[::xotcl::self]" multivalued false per-object false } foreach p {name domain defaultmethods manager default multivalued type per-object initcmd valuecmd valuechangedcmd} { ::xotcl::Slot instparametercmd $p } unset p ::xotcl::alias ::xotcl::Slot get ::xotcl::setinstvar ::xotcl::alias ::xotcl::Slot assign ::xotcl::setinstvar ::xotcl::Slot instproc add {obj prop value {pos 0}} { if {![my multivalued]} { error "Property $prop of [my domain]->$obj ist not multivalued" } if {[$obj exists $prop]} { $obj set $prop [linsert [$obj set $prop] $pos $value] } else { $obj set $prop [list $value] } } ::xotcl::Slot instproc delete {-nocomplain:switch obj prop value} { set old [$obj set $prop] set p [lsearch -glob $old $value] if {$p>-1} {$obj set $prop [lreplace $old $p $p]} else { error "$value is not a $prop of $obj (valid are: $old)" } } ::xotcl::Slot instproc unknown {method args} { set methods [list] foreach m [my info methods] { if {[::xotcl::Object info methods $m] ne ""} continue if {[string match __* $m]} continue lappend methods $m } error "Method '$method' unknown for slot [self]; valid are: {[lsort $methods]]}" } ::xotcl::Slot instproc init {} { my instvar name domain manager set forwarder [expr {[my per-object] ? "forward" : "instforward"}] #puts "domain=$domain /[self callingobject]/[my info parent]" if {$domain eq ""} { set domain [self callingobject] } $domain $forwarder $name -default [$manager defaultmethods] $manager %1 %self %proc } # # InfoSlot # ::xotcl::MetaSlot create ::xotcl::InfoSlot -array set __defaults { multivalued true elementtype ::xotcl::Class } ::xotcl::InfoSlot instparametercmd elementtype ::xotcl::setrelation ::xotcl::InfoSlot superclass ::xotcl::Slot ::xotcl::InfoSlot instproc get {obj prop} {$obj info $prop} ::xotcl::InfoSlot instproc add {obj prop value {pos 0}} { if {![my multivalued]} { error "Property $prop of [my domain]->$obj ist not multivalued" } $obj $prop [linsert [$obj info $prop] $pos $value] } ::xotcl::InfoSlot instproc delete {-nocomplain:switch obj prop value} { set old [$obj info $prop] if {[string first * $value] > -1 || [string first \[ $value] > -1} { # string contains meta characters if {[my elementtype] ne "" && ![string match ::* $value]} { # prefix string with ::, since all object names have leading :: set value ::$value } return [$obj $prop [lsearch -all -not -glob -inline $old $value]] } elseif {[my elementtype] ne ""} { if {[string first :: $value] == -1} { if {![my isobject $value]} { error "$value does not appear to be an object" } set value [$value self] } if {![$value isclass [my elementtype]]} { error "$value does not appear to be of type [my elementtype]" } } set p [lsearch -exact $old $value] if {$p > -1} { $obj $prop [lreplace $old $p $p] } else { error "$value is not a $prop of $obj (valid are: $old)" } } # # InterceptorSlot # ::xotcl::MetaSlot create ::xotcl::InterceptorSlot ::xotcl::setrelation ::xotcl::InterceptorSlot superclass ::xotcl::InfoSlot ::xotcl::alias ::xotcl::InterceptorSlot set ::xotcl::setrelation ;# for backwards compatibility ::xotcl::alias ::xotcl::InterceptorSlot assign ::xotcl::setrelation ::xotcl::InterceptorSlot instproc add {obj prop value {pos 0}} { if {![my multivalued]} { error "Property $prop of [my domain]->$obj ist not multivalued" } $obj $prop [linsert [$obj info $prop -guards] $pos $value] } ###################### # system slots ###################### namespace eval ::xotcl::Class::slot {} namespace eval ::xotcl::Object::slot {} ::xotcl::InfoSlot create ::xotcl::Class::slot::superclass ::xotcl::alias ::xotcl::Class::slot::superclass assign ::xotcl::setrelation ::xotcl::InfoSlot create ::xotcl::Object::slot::class ::xotcl::alias ::xotcl::Object::slot::class assign ::xotcl::setrelation ::xotcl::InterceptorSlot create ::xotcl::Object::slot::mixin ::xotcl::InterceptorSlot create ::xotcl::Object::slot::filter -elementtype "" ::xotcl::InterceptorSlot create ::xotcl::Class::slot::instmixin ::xotcl::InterceptorSlot create ::xotcl::Class::slot::instfilter -elementtype "" # # Attribute # ::xotcl::MetaSlot create ::xotcl::Attribute -superclass ::xotcl::Slot foreach p {default value_check initcmd valuecmd valuechangedcmd} { ::xotcl::Attribute instparametercmd $p } unset p ::xotcl::Attribute array set __defaults { value_check once } ::xotcl::Attribute instproc __default_from_cmd {obj cmd var sub op} { #puts "GETVAR [self proc] obj=$obj cmd=$cmd, var=$var, op=$op" $obj trace remove variable $var $op [list [self] [self proc] $obj $cmd] $obj set $var [$obj eval $cmd] } ::xotcl::Attribute instproc __value_from_cmd {obj cmd var sub op} { #puts "GETVAR [self proc] obj=$obj cmd=$cmd, var=$var, op=$op" $obj set $var [$obj eval $cmd] } ::xotcl::Attribute instproc __value_changed_cmd {obj cmd var sub op} { #puts stderr "**************************" #puts "valuechanged obj=$obj cmd=$cmd, var=$var, op=$op, ... #$obj exists $var -> [$obj set $var]" eval $cmd } ::xotcl::Attribute instproc destroy {} { #puts stderr "++++ [my domain] unset __defaults([my name]) [my default]" #[my domain] unset -nocomplain __defaults([my name]) next } ::xotcl::Attribute instproc check_single_value { {-keep_old_value:boolean true} value predicate type obj var } { #puts "+++ checking $value with $predicate ==> [expr $predicate]" if {![expr $predicate]} { if {[$obj exists __oldvalue($var)]} { $obj set $var [$obj set __oldvalue($var)] } else { $obj unset -nocomplain $var } error "$value is not of type $type" } if {$keep_old_value} {$obj set __oldvalue($var) $value} } ::xotcl::Attribute instproc check_multiple_values {values predicate type obj var} { foreach value $values { my check_single_value -keep_old_value false $value $predicate $type $obj $var } $obj set __oldvalue($var) $value } ::xotcl::Attribute instproc mk_type_checker {} { set __initcmd "" if {[my exists type]} { my instvar type name if {[::xotcl::Object isclass $type]} { set predicate [subst -nocommands {[::xotcl::Object isobject \$value] && [\$value istype $type]}] } elseif {[llength $type]>1} { set predicate "\[$type \$value\]" } else { set predicate "\[string is $type \$value\]" } my append valuechangedcmd [subst { my [expr {[my multivalued] ? "check_multiple_values" : "check_single_value"}] \[\$obj set $name\] \ {$predicate} [list $type] \$obj $name }] append __initcmd [subst -nocommands { if {[my exists $name]} {my set __oldvalue($name) [my set $name]}\n }] } return $__initcmd } ::xotcl::Attribute instproc init {} { my instvar domain name next ;# do first ordinary slot initialization # there might be already default values registered on the class $domain unset -nocomplain __defaults($name) set __initcmd "" if {[my exists default]} { if {[my per-object] && ![$domain exists $name]} { $domain set $name [my default] } elseif {![my per-object]} { $domain set __defaults($name) [my default] } } elseif [my exists initcmd] { append __initcmd "my trace add variable [list $name] read \ \[list [self] __default_from_cmd \[self\] [list [my initcmd]]\]\n" } elseif [my exists valuecmd] { append __initcmd "my trace add variable [list $name] read \ \[list [self] __value_from_cmd \[self\] [list [my valuecmd]]\]" } append __initcmd [my mk_type_checker] if {[my exists valuechangedcmd]} { append __initcmd "my trace add variable [list $name] write \ \[list [self] __value_changed_cmd \[self\] [list [my valuechangedcmd]]\]" } if {$__initcmd ne ""} { if {[my per-object]} { $domain eval $__initcmd } else { $domain set __initcmds($name) $__initcmd } #puts stderr "$domain set __initcmds($name) $__initcmd" } } # mixin class for decativating all checks ::xotcl::Class create ::xotcl::Slot::Nocheck \ -instproc check_single_value args {;} -instproc check_multiple_values args {;} \ -instproc mk_type_checker args {return ""} ::xotcl::Class create ::xotcl::Slot::Optimizer \ -instproc proc args {::xotcl::next; ::xotcl::my optimize} \ -instproc forward args {::xotcl::next; ::xotcl::my optimize} \ -instproc init args {::xotcl::next; ::xotcl::my optimize} \ -instproc optimize {} { if {[::xotcl::my multivalued]} return if {[::xotcl::my defaultmethods] ne {get assign}} return if {[::xotcl::my procsearch assign] ne "::xotcl::Slot instcmd assign"} return if {[::xotcl::my procsearch get] ne "::xotcl::Slot instcmd get"} return set forwarder [expr {[::xotcl::my per-object] ? "parametercmd":"instparametercmd"}] #puts stderr "**** optimizing [::xotcl::my domain] $forwarder [::xotcl::my name]" [::xotcl::my domain] $forwarder [::xotcl::my name] } # register the optimizer per default ::xotcl::Slot instmixin add ::xotcl::Slot::Optimizer # # Create a mixin class to overload method "new", such it does not allocate # new objects in ::xotcl::*, but in the specified object (without # syntactic overhead). # ::xotcl::Class create ::xotcl::ScopedNew -superclass ::xotcl::Class \ -array set __defaults {withclass ::xotcl::Object} ::xotcl::ScopedNew instparametercmd withclass ::xotcl::ScopedNew instparametercmd inobject ::xotcl::ScopedNew instproc init {} { ::xotcl::my instproc new {-childof args} { [::xotcl::self class] instvar {inobject object} withclass if {![::xotcl::my isobject $object]} { $withclass create $object } eval ::xotcl::next -childof $object $args } } # # change the namespace to the specified object and create # objects there. This is a friendly notation for creating # nested object structures. Optionally, creating new objects # in the specified scope can be turned off. # ::xotcl::Object instproc contains { {-withnew:boolean true} -object {-class ::xotcl::Object} cmds} { if {![info exists object]} {set object [::xotcl::self]} if {![::xotcl::my isobject $object]} { $class create $object $object requireNamespace #namespace eval $object {namespace import ::xotcl::*} } if {$withnew} { set m [::xotcl::ScopedNew new \ -inobject $object -withclass $class -volatile] ::xotcl::Class instmixin add $m end namespace eval $object $cmds ::xotcl::Class instmixin delete $m } else { namespace eval $object $cmds } } ::xotcl::Class instforward slots %self contains \ -object {%::xotcl::my subst [::xotcl::self]::slot} # # utilities # ::xotcl::Class instproc parameter arglist { if {![::xotcl::my isobject [self]::slot]} {::xotcl::Object create [self]::slot} foreach arg $arglist { #puts "arg=$arg" set l [llength $arg] set name [lindex $arg 0] if {$l == 1} { ::xotcl::Attribute create [::xotcl::self]::slot::$name } elseif {$l == 2} { #puts stderr "parameter $name has default '[lindex $arg 1]'" ::xotcl::Attribute create [::xotcl::self]::slot::$name [list -default [lindex $arg 1]] } elseif {$l == 3 && [lindex $arg 1] eq "-default"} { ::xotcl::Attribute create [::xotcl::self]::slot::$name [list -default [lindex $arg 2]] } else { set paramstring [string range $arg [expr {[string length $name]+1}] end] #puts stderr "remaining arg = '$paramstring'" if {[string match {[$\[]*} $paramstring]} { #puts stderr "match, $cl set __defaults($name) $paramstring" ::xotcl::Attribute create [::xotcl::self]::slot::$name [list -default $paramstring] continue } set po ::xotcl::Class::Parameter puts stderr "deprecated parameter usage '$arg'; use '-slots {Attribute ...}' instead" set cl [self] $po set name $name $po set cl [self] ::eval $po configure [lrange $arg 1 end] if {[$po exists extra] || [$po exists setter] || [$po exists getter] || [$po exists access]} { $po instvar extra setter getter access defaultParam if {![info exists extra]} {set extra ""} if {![info exists defaultParam]} {set defaultParam ""} if {![info exists setter]} {set setter set} if {![info exists getter]} {set getter set} if {![info exists access]} {set access ::xotcl::my} $cl instproc $name args " if {\[llength \$args] == 0} { return \[$access $getter $extra $name\] } else { return \[eval $access $setter $extra $name \$args $defaultParam \] }" foreach instvar {extra defaultParam setter getter access} { $po unset -nocomplain $instvar } } else { ::xotcl::my instparametercmd $name } } } [self]::slot set __parameter $arglist } # # utilities # ::xotcl::Object instproc self {} {::xotcl::self} ::xotcl::Object instproc defaultmethod {} { #if {"::" ne [::xotcl::my info parent] } { # [::xotcl::my info parent] __next #} return [::xotcl::self] } # support for XOTcl specifics ::xotcl::Object instproc hasclass cl { if {[::xotcl::my ismixin $cl]} {return 1} ::xotcl::my istype $cl } ::xotcl::Class instproc allinstances {} { # TODO: mark it deprecated return [::xotcl::my info instances -closure] } # Exit Handler ::xotcl::Object proc unsetExitHandler {} { ::xotcl::Object proc __exitHandler {} { # clients should append exit handlers to this proc body ; } } # pre-defined as empty method ::xotcl::Object unsetExitHandler ::xotcl::Object proc setExitHandler {newbody} { ::xotcl::Object proc __exitHandler {} $newbody } ::xotcl::Object proc getExitHandler {} { ::xotcl::Object info body __exitHandler } ::xotcl::Object instproc abstract {methtype methname arglist} { if {$methtype ne "proc" && $methtype ne "instproc" && $methtype ne "method"} { error "invalid method type '$methtype', \ must be either 'proc', 'instproc' or 'method'." } ::xotcl::my $methtype $methname $arglist " if {!\[::xotcl::self isnextcall\]} { error \"Abstract method $methname $arglist called\" } else {::xotcl::next} " } # # copy/move implementation # ::xotcl::Class create ::xotcl::Object::CopyHandler -parameter { {targetList ""} {dest ""} objLength } # targets are all namspaces and objs part-of the copied obj ::xotcl::Object::CopyHandler instproc makeTargetList t { ::xotcl::my lappend targetList $t # if it is an object without namespace, it is a leaf if {[::xotcl::my isobject $t]} { if {[$t info hasNamespace]} { # make target list from all children set children [$t info children] } else { # ok, no namespace -> no more children return } } # now append all namespaces that are in the obj, but that # are not objects foreach c [namespace children $t] { if {![::xotcl::my isobject $c]} { lappend children [namespace children $t] } } # a namespace or an obj with namespace may have children # itself foreach c $children { ::xotcl::my makeTargetList $c } } ::xotcl::Object::CopyHandler instproc copyNSVarsAndCmds {orig dest} { #puts stderr "copyNSVarsAndCmds $orig $dest" ::xotcl::namespace_copyvars $orig $dest ::xotcl::namespace_copycmds $orig $dest } # construct destination obj name from old qualified ns name ::xotcl::Object::CopyHandler instproc getDest origin { set tail [string range $origin [::xotcl::my set objLength] end] return ::[string trimleft [::xotcl::my set dest]$tail :] } ::xotcl::Object::CopyHandler instproc copyTargets {} { #puts stderr "copy targetList = [::xotcl::my set targetList]" foreach origin [::xotcl::my set targetList] { set dest [::xotcl::my getDest $origin] if {[::xotcl::my isobject $origin]} { # copy class information if {[::xotcl::my isclass $origin]} { set cl [[$origin info class] create $dest -noinit] # class object set obj $cl $cl superclass [$origin info superclass] $cl parameterclass [$origin info parameterclass] $cl instinvar [$origin info instinvar] $cl instfilter [$origin info instfilter -guards] $cl instmixin [$origin info instmixin] my copyNSVarsAndCmds ::xotcl::classes$origin ::xotcl::classes$dest #$cl parameter [$origin info parameter] } else { # create obj set obj [[$origin info class] create $dest -noinit] } # copy object -> may be a class obj $obj invar [$origin info invar] $obj check [$origin info check] $obj mixin [$origin info mixin] $obj filter [$origin info filter -guards] # set md [$origin info metadata] # $obj metadata add $md # foreach m $md { $obj metadata $m [$origin metadata $m] } if {[$origin info hasNamespace]} { $obj requireNamespace } } else { namespace eval $dest {} } ::xotcl::my copyNSVarsAndCmds $origin $dest foreach i [$origin info forward] { eval [concat $dest forward $i [$origin info forward -definition $i]] } if {[::xotcl::my isclass $origin]} { foreach i [$origin info instforward] { eval [concat $dest instforward $i [$origin info instforward -definition $i]] } } set traces [list] foreach var [$origin info vars] { set cmds [$origin trace info variable $var] if {$cmds ne ""} { foreach cmd $cmds { foreach {op def} $cmd break #$origin trace remove variable $var $op $def set domain [lindex $def 0] if {$domain eq $origin} { set def [concat $dest [lrange $def 1 end]] } if {[my isobject $domain] && [$domain istype ::xotcl::Slot]} { # slot traces are handled already by the slot mechanism continue } $dest trace add variable $var $op $def } } } } # alter 'domain' and 'manager' in slot objects set origin [lindex [::xotcl::my set targetList] 0] if {[::xotcl::my isclass $origin]} { foreach oldslot [$origin info slots] { set newslot ${cl}::slot::[namespace tail $oldslot] if {[$oldslot domain] eq $origin} {$newslot domain $cl} if {[$oldslot manager] eq $oldslot} {$newslot manager $newslot} } } } ::xotcl::Object::CopyHandler instproc copy {obj dest} { #puts stderr "[::xotcl::self] copy <$obj> <$dest>" ::xotcl::my set objLength [string length $obj] ::xotcl::my set dest $dest ::xotcl::my makeTargetList $obj ::xotcl::my copyTargets } #Class create ::xotcl::NoInit #::xotcl::NoInit instproc init args {;} ::xotcl::Object instproc copy newName { if {[string compare [string trimleft $newName :] [string trimleft [::xotcl::self] :]]} { [[::xotcl::self class]::CopyHandler new -volatile] copy [::xotcl::self] $newName } } ::xotcl::Object instproc move newName { if {[string trimleft $newName :] ne [string trimleft [::xotcl::self] :]} { if {$newName ne ""} { ::xotcl::my copy $newName } ### let all subclasses get the copied class as superclass if {[::xotcl::my isclass [::xotcl::self]] && $newName ne ""} { foreach subclass [::xotcl::my info subclass] { set scl [$subclass info superclass] if {[set index [lsearch -exact $scl [::xotcl::self]]] != -1} { set scl [lreplace $scl $index $index $newName] $subclass superclass $scl } } } ::xotcl::my destroy } } ::xotcl::Object create ::xotcl::config ::xotcl::config proc load {obj file} { source $file foreach i [array names ::auto_index [list $obj *proc *]] { set type [lindex $i 1] set meth [lindex $i 2] if {[$obj info ${type}s $meth] == {}} { $obj $type $meth auto $::auto_index($i) } } } ::xotcl::config proc mkindex {meta dir args} { set sp {[ ]+} set st {^[ ]*} set wd {([^ ;]+)} foreach creator $meta { ::lappend cp $st$creator${sp}create$sp$wd ::lappend ap $st$creator$sp$wd } foreach method {proc instproc} { ::lappend mp $st$wd${sp}($method)$sp$wd } foreach cl [concat ::xotcl::Class [::xotcl::Class info heritage]] { eval ::lappend meths [$cl info instcommands] } set old [pwd] cd $dir ::append idx "# Tcl autoload index file, version 2.0\n" ::append idx "# xotcl additions generated with " ::append idx "\"::xotcl::config::mkindex [list $meta] [list $dir] $args\"\n" set oc 0 set mc 0 foreach file [eval glob -nocomplain -- $args] { if {[catch {set f [open $file]} msg]} then { catch {close $f} cd $old error $msg } while {[gets $f line] >= 0} { foreach c $cp { if {[regexp $c $line x obj]==1 && [string index $obj 0]!={$}} then { ::incr oc ::append idx "set auto_index($obj) " ::append idx "\"::xotcl::config::load $obj \$dir/$file\"\n" } } foreach a $ap { if {[regexp $a $line x obj]==1 && [string index $obj 0]!={$} && [lsearch -exact $meths $obj]==-1} { ::incr oc ::append idx "set auto_index($obj) " ::append idx "\"::xotcl::config::load $obj \$dir/$file\"\n" } } foreach m $mp { if {[regexp $m $line x obj ty pr]==1 && [string index $obj 0]!={$} && [string index $pr 0]!={$}} then { ::incr mc ::append idx "set \{auto_index($obj " ::append idx "$ty $pr)\} \"source \$dir/$file\"\n" } } } close $f } set t [open tclIndex a+] puts $t $idx nonewline close $t cd $old return "$oc objects, $mc methods" } # # if cutTheArg not 0, it cut from upvar argsList # ::xotcl::Object instproc extractConfigureArg {al name {cutTheArg 0}} { set value "" upvar $al argList set largs [llength $argList] for {set i 0} {$i < $largs} {incr i} { if {[lindex $argList $i] == $name && $i + 1 < $largs} { set startIndex $i set endIndex [expr {$i + 1}] while {$endIndex < $largs && [string first - [lindex $argList $endIndex]] != 0} { lappend value [lindex $argList $endIndex] incr endIndex } } } if {[info exists startIndex] && $cutTheArg != 0} { set argList [lreplace $argList $startIndex [expr {$endIndex - 1}]] } return $value } ::xotcl::Object create ::xotcl::rcs ::xotcl::rcs proc date string { lreplace [lreplace $string 0 0] end end } ::xotcl::rcs proc version string { lindex $string 2 } # if HOME is not set, and ~ is resolved, Tcl chokes on that if {![info exists ::env(HOME)]} {set ::env(HOME) /root} set ::xotcl::confdir ~/.xotcl set ::xotcl::logdir $::xotcl::confdir/log ::xotcl::Class proc __unknown name { #unknown $name } # # package support # ::xotcl::Class instproc uses list { foreach package $list { ::xotcl::package import -into [self] $package puts stderr "*** using ${package}::* in [self]" } } ::xotcl::Class create ::xotcl::package -superclass ::xotcl::Class -parameter { provide {version 1.0} {autoexport {}} {export {}} } ::xotcl::package proc create {name args} { set nq [namespace qualifiers $name] if {$nq ne "" && ![namespace exists $nq]} {Object create $nq} next } ::xotcl::package proc extend {name args} { my require $name eval $name configure $args } ::xotcl::package instproc contains script { if {[my exists provide]} { package provide [my provide] [my version] } else { package provide [self] [my version] } namespace eval [self] {namespace import ::xotcl::*} namespace eval [self] $script foreach e [my export] { set nq [namespace qualifiers $e] if {$nq ne ""} { namespace eval [self]::$nq [list namespace export [namespace tail $e]] } else { namespace eval [self] [list namespace export $e] } } foreach e [my autoexport] { namespace eval :: [list namespace import [self]::$e] } } ::xotcl::package configure \ -set component . \ -set verbose 0 \ -set packagecmd ::package ::xotcl::package proc unknown args { #puts stderr "unknown: package $args" eval [my set packagecmd] $args } ::xotcl::package proc verbose value { my set verbose $value } ::xotcl::package proc present args { if {$::tcl_version<8.3} { my instvar loaded switch -exact -- [lindex $args 0] { -exact {set pkg [lindex $args 1]} default {set pkg [lindex $args 0]} } if {[info exists loaded($pkg)]} { return $loaded($pkg) } else { error "not found" } } else { eval [my set packagecmd] present $args } } ::xotcl::package proc import {{-into ::} pkg} { my require $pkg namespace eval $into [subst -nocommands { #puts stderr "*** package import ${pkg}::* into [namespace current]" namespace import ${pkg}::* }] # import subclasses if any foreach e [$pkg export] { set nq [namespace qualifiers $e] if {$nq ne ""} { namespace eval $into$nq [list namespace import ${pkg}::$e] } } } ::xotcl::package proc require args { #puts "XOTCL package require $args, current=[namespace current]" ::xotcl::my instvar component verbose uses loaded set prevComponent $component if {[catch {set v [eval package present $args]} msg]} { #puts stderr "we have to load $msg" switch -exact -- [lindex $args 0] { -exact {set pkg [lindex $args 1]} default {set pkg [lindex $args 0]} } set component $pkg lappend uses($prevComponent) $component set v [uplevel \#1 [my set packagecmd] require $args] if {$v ne "" && $verbose} { set path [lindex [::package ifneeded $pkg $v] 1] puts "... $pkg $v loaded from '$path'" set loaded($pkg) $v ;# loaded stuff needed for Tcl 8.0 } } set component $prevComponent return $v } ::xotcl::Object instproc method {name arguments body} { my proc name $arguments $body } ::xotcl::Class instproc method {-per-object:switch name arguments body} { if {${per-object}} { my proc $name $arguments $body } else { my instproc $name $arguments $body } } # setup a temp directory proc ::xotcl::tmpdir {} { foreach e [list TMPDIR TEMP TMP] { if {[info exists ::env($e)] \ && [file isdirectory $::env($e)] \ && [file writable $::env($e)]} { return $::env($e) } } if {$::tcl_platform(platform) eq "windows"} { foreach d [list "C:\\TEMP" "C:\\TMP" "\\TEMP" "\\TMP"] { if {[file isdirectory $d] && [file writable $d]} { return $d } } } return /tmp } ./xotcl-1.6.8/generic/._xotcl.c000644 000765 000024 00000000430 12326777674 016770 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotcl.c000644 000765 000024 00001477700 12326777674 016576 0ustar00neumannstaff000000 000000 /* * XOTcl - Extended Object Tcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * Copyright (C) 2007-2008 Martin Matuska (b) * * (a) Vienna University of Economics and Business Administration * Institute. of Information Systems and New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstrasse 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." * */ #define XOTCL_C 1 #include "xotclInt.h" #include "xotclAccessInt.h" #ifdef KEEP_TCL_CMD_TYPE /*# include "tclCompile.h"*/ #endif #ifdef COMPILE_XOTCL_STUBS extern XotclStubs xotclStubs; #endif #ifdef XOTCL_MEM_COUNT int xotclMemCountInterpCounter = 0; #endif /* * Tcl_Obj Types for XOTcl Objects */ #ifdef USE_TCL_STUBS # define XOTcl_ExprObjCmd(cd, interp, objc, objv) \ XOTclCallCommand(interp, XOTE_EXPR, objc, objv) # define XOTcl_SubstObjCmd(cd, interp, objc, objv) \ XOTclCallCommand(interp, XOTE_SUBST, objc, objv) #else # define XOTcl_ExprObjCmd(cd, interp, objc, objv) \ Tcl_ExprObjCmd(cd, interp, objc, objv) # define XOTcl_SubstObjCmd(cd, interp, objc, objv) \ Tcl_SubstObjCmd(cd, interp, objc, objv) #endif static int SetXOTclObjectFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr); static void UpdateStringOfXOTclObject(Tcl_Obj *objPtr); static void FreeXOTclObjectInternalRep(Tcl_Obj *objPtr); static void DupXOTclObjectInternalRep(Tcl_Obj *src, Tcl_Obj *cpy); static Tcl_Obj*NameInNamespaceObj(Tcl_Interp *interp, char *name, Tcl_Namespace *ns); static Tcl_Namespace *callingNameSpace(Tcl_Interp *interp); XOTCLINLINE static Tcl_Command NSFindCommand(Tcl_Interp *interp, char *name, Tcl_Namespace *ns); #ifdef EXPERIMENTAL_CMD_RESOLVER static int NSisXOTclNamespace(Tcl_Namespace *nsPtr); #endif XOTCLINLINE static void GuardAdd(Tcl_Interp *interp, XOTclCmdList *filterCL, Tcl_Obj *guard); static int GuardCheck(Tcl_Interp *interp, ClientData guards); static int GuardCall(XOTclObject *obj, XOTclClass *cl, Tcl_Command cmd, Tcl_Interp *interp, ClientData clientData, int push); static void GuardDel(XOTclCmdList *filterCL); static int IsMetaClass(Tcl_Interp *interp, XOTclClass *cl); static int hasMixin(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cl); static int isSubType(XOTclClass *subcl, XOTclClass *cl); static Tcl_ObjType XOTclObjectType = { "XOTclObject", FreeXOTclObjectInternalRep, DupXOTclObjectInternalRep, UpdateStringOfXOTclObject, SetXOTclObjectFromAny }; typedef enum { CALLING_LEVEL, ACTIVE_LEVEL } CallStackLevel; typedef struct callFrameContext { int framesSaved; Tcl_CallFrame *framePtr; Tcl_CallFrame *varFramePtr; } callFrameContext; typedef struct tclCmdClientData { XOTclObject *obj; Tcl_Obj *cmdName; } tclCmdClientData; typedef struct forwardCmdClientData { XOTclObject *obj; Tcl_Obj *cmdName; Tcl_ObjCmdProc *objProc; int passthrough; int needobjmap; int verbose; ClientData cd; int nr_args; Tcl_Obj *args; int objscope; Tcl_Obj *prefix; int nr_subcommands; Tcl_Obj *subcommands; } forwardCmdClientData; typedef struct aliasCmdClientData { XOTclObject *obj; Tcl_Obj *cmdName; Tcl_ObjCmdProc *objProc; ClientData cd; } aliasCmdClientData; XOTCLINLINE static int DoDispatch(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int flags); static int XOTclNextMethod(XOTclObject *obj, Tcl_Interp *interp, XOTclClass *givenCl, char *givenMethod, int objc, Tcl_Obj *CONST objv[], int useCSObjs); static int XOTclForwardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); static int XOTclObjscopedMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); static int XOTclSetterMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); static int callDestroyMethod(ClientData cd, Tcl_Interp *interp, XOTclObject *obj, int flags); static int XOTclObjConvertObject(Tcl_Interp *interp, register Tcl_Obj *objPtr, XOTclObject **obj); static XOTclObject *XOTclpGetObject(Tcl_Interp *interp, char *name); static XOTclClass *XOTclpGetClass(Tcl_Interp *interp, char *name); static XOTclCallStackContent *CallStackGetFrame(Tcl_Interp *interp); #if !defined(NDEBUG) static void checkAllInstances(Tcl_Interp *interp, XOTclClass *startCl, int lvl); #endif #if defined(PRE85) # define XOTcl_FindHashEntry(tablePtr, key) Tcl_FindHashEntry(tablePtr, key) #else # define XOTcl_FindHashEntry(tablePtr, key) Tcl_CreateHashEntry(tablePtr, key, NULL) #endif #ifdef PRE81 /* for backward compatibility only */ static int Tcl_EvalObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int flags) { int i, result; Tcl_DString ds, *dsp = &ds; assert(flags == 0); DSTRING_INIT(dsp); for (i = 0; i < objc; i++) { Tcl_DStringAppendElement(dsp, ObjStr(objv[i])); } result = Tcl_Eval(interp, Tcl_DStringValue(dsp)); DSTRING_FREE(dsp); return result; } static int Tcl_EvalEx(Tcl_Interp *interp, char *cmd, int len, int flags) { return Tcl_Eval(interp, cmd); } static int Tcl_SubstObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *ov[20]; int i; assert(objc<19); for (i=0; ifield)) #endif #endif #if defined(PRE85) && FORWARD_COMPATIBLE /* * Define the types missing for the forward compatible mode */ typedef Var * (Tcl_VarHashCreateVarFunction) _ANSI_ARGS_( (TclVarHashTable *tablePtr, Tcl_Obj *key, int *newPtr) ); typedef void (Tcl_InitVarHashTableFunction) _ANSI_ARGS_( (TclVarHashTable *tablePtr, Namespace *nsPtr) ); typedef void (Tcl_CleanupVarFunction) _ANSI_ARGS_ ( (Var * varPtr, Var *arrayPtr) ); typedef Var * (Tcl_DeleteVarFunction) _ANSI_ARGS_ ( (Interp *iPtr, TclVarHashTable *tablePtr) ); typedef Var * (lookupVarFromTableFunction) _ANSI_ARGS_ ( (TclVarHashTable *varTable, CONST char *simpleName, XOTclObject *obj) ); typedef struct TclVarHashTable85 { Tcl_HashTable table; struct Namespace *nsPtr; } TclVarHashTable85; typedef struct Var85 { int flags; union { Tcl_Obj *objPtr; TclVarHashTable85 *tablePtr; struct Var85 *linkPtr; } value; } Var85; typedef struct VarInHash { Var85 var; int refCount; Tcl_HashEntry entry; } VarInHash; typedef struct Tcl_CallFrame85 { Tcl_Namespace *nsPtr; int dummy1; int dummy2; char *dummy3; char *dummy4; char *dummy5; int dummy6; char *dummy7; char *dummy8; int dummy9; char *dummy10; char *dummy11; char *dummy12; } Tcl_CallFrame85; typedef struct CallFrame85 { Namespace *nsPtr; int isProcCallFrame; int objc; Tcl_Obj *CONST *objv; struct CallFrame *callerPtr; struct CallFrame *callerVarPtr; int level; Proc *procPtr; TclVarHashTable *varTablePtr; int numCompiledLocals; Var85 *compiledLocals; ClientData clientData; void *localCachePtr; } CallFrame85; /* * These are global variables, but thread-safe, since they * are only set during initialzation and they are never changed, * and the variables are single words. */ static int forwardCompatibleMode; static Tcl_VarHashCreateVarFunction *tclVarHashCreateVar; static Tcl_InitVarHashTableFunction *tclInitVarHashTable; static Tcl_CleanupVarFunction *tclCleanupVar; static lookupVarFromTableFunction *lookupVarFromTable; static int varRefCountOffset; static int varHashTableSize; # define VarHashRefCount(varPtr) \ (*((int *) (((char *)(varPtr))+varRefCountOffset))) # define VarHashGetValue(hPtr) \ (forwardCompatibleMode ? \ (Var *) ((char *)hPtr - TclOffset(VarInHash, entry)) : \ (Var *) Tcl_GetHashValue(hPtr) \ ) #define VarHashGetKey(varPtr) \ (((VarInHash *)(varPtr))->entry.key.objPtr) #define VAR_TRACED_READ85 0x10 /* TCL_TRACE_READS */ #define VAR_TRACED_WRITE85 0x20 /* TCL_TRACE_WRITES */ #define VAR_TRACED_UNSET85 0x40 /* TCL_TRACE_UNSETS */ #define VAR_TRACED_ARRAY85 0x800 /* TCL_TRACE_ARRAY */ #define VAR_TRACE_ACTIVE85 0x2000 #define VAR_SEARCH_ACTIVE85 0x4000 #define VAR_ALL_TRACES85 \ (VAR_TRACED_READ85|VAR_TRACED_WRITE85|VAR_TRACED_ARRAY85|VAR_TRACED_UNSET85) #define VAR_ARRAY85 0x1 #define VAR_LINK85 0x2 #define varFlags(varPtr) \ (forwardCompatibleMode ? \ ((Var85 *)varPtr)->flags : \ (varPtr)->flags \ ) #undef TclIsVarScalar #define TclIsVarScalar(varPtr) \ (forwardCompatibleMode ? \ !(((Var85 *)varPtr)->flags & (VAR_ARRAY85|VAR_LINK85)) : \ ((varPtr)->flags & VAR_SCALAR) \ ) #undef TclIsVarArray #define TclIsVarArray(varPtr) \ (forwardCompatibleMode ? \ (((Var85 *)varPtr)->flags & VAR_ARRAY85) : \ ((varPtr)->flags & VAR_ARRAY) \ ) #define TclIsVarNamespaceVar(varPtr) \ (forwardCompatibleMode ? \ (((Var85 *)varPtr)->flags & VAR_NAMESPACE_VAR) : \ ((varPtr)->flags & VAR_NAMESPACE_VAR) \ ) #define TclIsVarTraced(varPtr) \ (forwardCompatibleMode ? \ (((Var85 *)varPtr)->flags & VAR_ALL_TRACES85) : \ (varPtr->tracePtr != NULL) \ ) #undef TclIsVarLink #define TclIsVarLink(varPtr) \ (forwardCompatibleMode ? \ (((Var85 *)varPtr)->flags & VAR_LINK85) : \ (varPtr->flags & VAR_LINK) \ ) #undef TclIsVarUndefined #define TclIsVarUndefined(varPtr) \ (forwardCompatibleMode ? \ (((Var85 *)varPtr)->value.objPtr == NULL) : \ (varPtr->flags & VAR_UNDEFINED) \ ) #undef TclSetVarLink #define TclSetVarLink(varPtr) \ if (forwardCompatibleMode) \ ((Var85 *)varPtr)->flags = (((Var85 *)varPtr)->flags & ~VAR_ARRAY85) | VAR_LINK85; \ else \ (varPtr)->flags = ((varPtr)->flags & ~(VAR_SCALAR|VAR_ARRAY)) | VAR_LINK #undef TclClearVarUndefined #define TclClearVarUndefined(varPtr) \ if (!forwardCompatibleMode) \ (varPtr)->flags &= ~VAR_UNDEFINED #undef Tcl_CallFrame_compiledLocals #define Tcl_CallFrame_compiledLocals(cf) \ (forwardCompatibleMode ? \ (Var *)(((CallFrame85 *)cf)->compiledLocals) : \ (((CallFrame*)cf)->compiledLocals) \ ) #define getNthVar(varPtr, i) \ (forwardCompatibleMode ? \ (Var *)(((Var85 *)varPtr)+(i)) : \ (((Var *)varPtr)+(i)) \ ) #define valueOfVar(type, varPtr, field) \ (forwardCompatibleMode ? \ (type *)(((Var85 *)varPtr)->value.field) : \ (type *)(((Var *)varPtr)->value.field) \ ) #endif #if !FORWARD_COMPATIBLE # define getNthVar(varPtr, i) (((Var *)varPtr)+(i)) #endif #define TclIsCompiledLocalArgument(compiledLocalPtr) \ ((compiledLocalPtr)->flags & VAR_ARGUMENT) #define TclIsCompiledLocalTemporary(compiledLocalPtr) \ ((compiledLocalPtr)->flags & VAR_TEMPORARY) #if defined(PRE85) && !FORWARD_COMPATIBLE # define VarHashGetValue(hPtr) (Var *)Tcl_GetHashValue(hPtr) # define VarHashRefCount(varPtr) (varPtr)->refCount # define TclIsVarTraced(varPtr) (varPtr->tracePtr != NULL) # define TclIsVarNamespaceVar(varPtr) ((varPtr)->flags & VAR_NAMESPACE_VAR) # define varHashTableSize sizeof(TclVarHashTable) # define valueOfVar(type, varPtr, field) (type *)(varPtr)->value.field #endif #if defined(PRE85) /* * We need NewVar from tclVar.c ... but its not exported */ static Var *NewVar84() { register Var *varPtr; varPtr = (Var *) ckalloc(sizeof(Var)); varPtr->value.objPtr = NULL; varPtr->name = NULL; varPtr->nsPtr = NULL; varPtr->hPtr = NULL; varPtr->refCount = 0; varPtr->tracePtr = NULL; varPtr->searchPtr = NULL; varPtr->flags = (VAR_SCALAR | VAR_UNDEFINED | VAR_IN_HASHTABLE); return varPtr; } static Var * VarHashCreateVar84(TclVarHashTable *tablePtr, Tcl_Obj *key, int *newPtr) { char *newName = ObjStr(key); Tcl_HashEntry *hPtr = Tcl_CreateHashEntry(tablePtr, newName, newPtr); Var *varPtr; if (newPtr && *newPtr) { varPtr = NewVar84(); Tcl_SetHashValue(hPtr, varPtr); varPtr->hPtr = hPtr; varPtr->nsPtr = NULL; /* a local variable */ } else { varPtr = (Var *) Tcl_GetHashValue(hPtr); } return varPtr; } static void InitVarHashTable84(TclVarHashTable *tablePtr, Namespace *nsPtr) { /* fprintf(stderr,"InitVarHashTable84\n"); */ Tcl_InitHashTable((tablePtr), TCL_STRING_KEYS); } static void TclCleanupVar84(Var * varPtr, Var *arrayPtr) { if (TclIsVarUndefined(varPtr) && (varPtr->refCount == 0) && (varPtr->tracePtr == NULL) && (varPtr->flags & VAR_IN_HASHTABLE)) { if (varPtr->hPtr) { Tcl_DeleteHashEntry(varPtr->hPtr); } ckfree((char *) varPtr); } if (arrayPtr) { if (TclIsVarUndefined(arrayPtr) && (arrayPtr->refCount == 0) && (arrayPtr->tracePtr == NULL) && (arrayPtr->flags & VAR_IN_HASHTABLE)) { if (arrayPtr->hPtr) { Tcl_DeleteHashEntry(arrayPtr->hPtr); } ckfree((char *) arrayPtr); } } } static Var * LookupVarFromTable84(TclVarHashTable *varTable, CONST char *simpleName, XOTclObject *obj) { Var *varPtr = NULL; Tcl_HashEntry *entryPtr; if (varTable) { entryPtr = XOTcl_FindHashEntry(varTable, simpleName); if (entryPtr) { varPtr = VarHashGetValue(entryPtr); } } return varPtr; } #endif #if defined(PRE85) # if FORWARD_COMPATIBLE # define VarHashCreateVar (*tclVarHashCreateVar) # define InitVarHashTable (*tclInitVarHashTable) # define CleanupVar (*tclCleanupVar) # define LookupVarFromTable (*lookupVarFromTable) # define TclCallFrame Tcl_CallFrame85 # else # define VarHashCreateVar VarHashCreateVar84 # define InitVarHashTable InitVarHashTable84 # define CleanupVar TclCleanupVar84 # define LookupVarFromTable LookupVarFromTable84 # define TclCallFrame Tcl_CallFrame # endif #else # define VarHashCreateVar VarHashCreateVar85 # define InitVarHashTable TclInitVarHashTable # define CleanupVar TclCleanupVar # define LookupVarFromTable LookupVarFromTable85 # define TclCallFrame Tcl_CallFrame #endif #if defined(PRE85) /* * for backward compatibility */ #define VarHashTable(t) t #define TclVarHashTable Tcl_HashTable static Var * XOTclObjLookupVar(Tcl_Interp *interp, Tcl_Obj *part1Ptr, CONST char *part2, int flags, const char *msg, int createPart1, int createPart2, Var **arrayPtrPtr) { return TclLookupVar(interp, ObjStr(part1Ptr), part2, flags, msg, createPart1, createPart2, arrayPtrPtr); } #define ObjFindNamespace(interp, objPtr) \ Tcl_FindNamespace((interp), ObjStr(objPtr), NULL, 0); #else /* * definitions for tcl 8.5 */ #define VarHashGetValue(hPtr) \ ((Var *) ((char *)hPtr - TclOffset(VarInHash, entry))) #define VarHashGetKey(varPtr) \ (((VarInHash *)(varPtr))->entry.key.objPtr) #define VarHashTable(varTable) \ &(varTable)->table #define XOTclObjLookupVar TclObjLookupVar #define varHashTableSize sizeof(TclVarHashTable) #define valueOfVar(type, varPtr, field) (type *)(varPtr)->value.field XOTCLINLINE static Tcl_Namespace * ObjFindNamespace(Tcl_Interp *interp, Tcl_Obj *objPtr) { Tcl_Namespace *nsPtr; if (TclGetNamespaceFromObj(interp, objPtr, &nsPtr) == TCL_OK) { return nsPtr; } else { return NULL; } } #endif #if !defined(PRE85) || FORWARD_COMPATIBLE static XOTCLINLINE Var * VarHashCreateVar85(TclVarHashTable *tablePtr, Tcl_Obj *key, int *newPtr) { Var *varPtr = NULL; Tcl_HashEntry *hPtr; hPtr = Tcl_CreateHashEntry((Tcl_HashTable *) tablePtr, (char *) key, newPtr); if (hPtr) { varPtr = VarHashGetValue(hPtr); } return varPtr; } static XOTCLINLINE Var * LookupVarFromTable85(TclVarHashTable *tablePtr, CONST char *simpleName, XOTclObject *obj) { Var *varPtr = NULL; if (tablePtr) { Tcl_Obj *keyPtr = Tcl_NewStringObj(simpleName, -1); Tcl_IncrRefCount(keyPtr); varPtr = VarHashCreateVar85(tablePtr, keyPtr, NULL); Tcl_DecrRefCount(keyPtr); } return varPtr; } #endif /* * call an XOTcl method */ static int callMethod(ClientData cd, Tcl_Interp *interp, Tcl_Obj *method, int objc, Tcl_Obj *CONST objv[], int flags) { XOTclObject *obj = (XOTclObject*) cd; int result; ALLOC_ON_STACK(Tcl_Obj*, objc, tov); tov[0] = obj->cmdName; tov[1] = method; if (objc>2) memcpy(tov+2, objv, sizeof(Tcl_Obj *)*(objc-2)); /*fprintf(stderr, "%%%% callMethod cmdname=%s, method=%s, objc=%d\n", ObjStr(tov[0]), ObjStr(tov[1]), objc);*/ result = DoDispatch(cd, interp, objc, tov, flags); /*fprintf(stderr, " callMethod returns %d\n", result);*/ FREE_ON_STACK(Tcl_Obj *,tov); return result; } int XOTclCallMethodWithArgs(ClientData cd, Tcl_Interp *interp, Tcl_Obj *method, Tcl_Obj *arg, int givenobjc, Tcl_Obj *CONST objv[], int flags) { XOTclObject *obj = (XOTclObject*) cd; int objc = givenobjc + 2; int result; ALLOC_ON_STACK(Tcl_Obj*, objc, tov); assert(objc>1); tov[0] = obj->cmdName; tov[1] = method; if (objc>2) { tov[2] = arg; } if (objc>3) memcpy(tov+3, objv, sizeof(Tcl_Obj *)*(objc-3)); result = DoDispatch(cd, interp, objc, tov, flags); FREE_ON_STACK(Tcl_Obj *, tov); return result; } /* * realize self, class, proc through the [self] command */ XOTCLINLINE static CONST84 char * GetSelfProc(Tcl_Interp *interp) { /*return Tcl_GetCommandName(interp, RUNTIME_STATE(interp)->cs.top->cmdPtr);*/ return Tcl_GetCommandName(interp, CallStackGetFrame(interp)->cmdPtr); } XOTCLINLINE static XOTclClass* GetSelfClass(Tcl_Interp *interp) { /*return RUNTIME_STATE(interp)->cs.top->cl;*/ return CallStackGetFrame(interp)->cl; } XOTCLINLINE static XOTclObject* GetSelfObj(Tcl_Interp *interp) { return CallStackGetFrame(interp)->self; } /* extern callable GetSelfObj */ XOTcl_Object* XOTclGetSelfObj(Tcl_Interp *interp) { return (XOTcl_Object*)GetSelfObj(interp); } XOTCLINLINE static Tcl_Command GetSelfProcCmdPtr(Tcl_Interp *interp) { /*return RUNTIME_STATE(interp)->cs.top->cmdPtr;*/ return CallStackGetFrame(interp)->cmdPtr; } /* * prints a msg to the screen that oldCmd is deprecated * optinal: give a new cmd */ extern void XOTclDeprecatedMsg(char *oldCmd, char *newCmd) { fprintf(stderr, "**\n**\n** The command/method <%s> is deprecated.\n", oldCmd); if (newCmd) fprintf(stderr, "** Use <%s> instead.\n", newCmd); fprintf(stderr, "**\n"); } static int XOTcl_DeprecatedCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *new; if (objc == 2) new = 0; else if (objc == 3) new = ObjStr(objv[2]); else return XOTclObjErrArgCnt(interp, NULL, "deprecated oldcmd ?newcmd?"); XOTclDeprecatedMsg(ObjStr(objv[1]), new); return TCL_OK; } #ifdef DISPATCH_TRACE static void printObjv(int objc, Tcl_Obj *CONST objv[]) { int i, j; if (objc <= 3) j = objc; else j = 3; for (i=0;i 3) fprintf(stderr," ..."); fprintf(stderr," (objc=%d)", objc); } static void printCall(Tcl_Interp *interp, char *string, int objc, Tcl_Obj *CONST objv[]) { fprintf(stderr, " (%d) >%s: ", Tcl_Interp_numLevels(interp), string); printObjv(objc, objv); fprintf(stderr, "\n"); } static void printExit(Tcl_Interp *interp, char *string, int objc, Tcl_Obj *CONST objv[], int result) { fprintf(stderr, " (%d) <%s: ", Tcl_Interp_numLevels(interp), string); /*printObjv(objc, objv);*/ fprintf(stderr, " result=%d\n", result); } #endif /* * XOTclObject Reference Accounting */ #if defined(XOTCLOBJ_TRACE) # define XOTclObjectRefCountIncr(obj) \ obj->refCount++; \ fprintf(stderr, "RefCountIncr %p count=%d %s\n", obj, obj->refCount, obj->cmdName?ObjStr(obj->cmdName):"no name"); \ MEM_COUNT_ALLOC("XOTclObject RefCount", obj) # define XOTclObjectRefCountDecr(obj) \ obj->refCount--; \ fprintf(stderr, "RefCountDecr %p count=%d\n", obj, obj->refCount); \ MEM_COUNT_FREE("XOTclObject RefCount", obj) #else # define XOTclObjectRefCountIncr(obj) \ obj->refCount++; \ MEM_COUNT_ALLOC("XOTclObject RefCount", obj) # define XOTclObjectRefCountDecr(obj) \ obj->refCount--; \ MEM_COUNT_FREE("XOTclObject RefCount", obj) #endif #if defined(XOTCLOBJ_TRACE) void objTrace(char *string, XOTclObject *obj) { if (obj) fprintf(stderr,"--- %s tcl %p %s (%d %p) xotcl %p (%d) %s \n", string, obj->cmdName, obj->cmdName->typePtr ? obj->cmdName->typePtr->name : "NULL", obj->cmdName->refCount, obj->cmdName->internalRep.twoPtrValue.ptr1, obj, obj->refCount, ObjStr(obj->cmdName)); else fprintf(stderr,"--- No object: %s\n", string); } #else # define objTrace(a, b) #endif /* search for tail of name */ static CONST char * NSTail(CONST char *string) { register char *p = (char *)string+strlen(string); while (p > string) { if (*p == ':' && *(p-1) == ':') return p+1; p--; } return string; } XOTCLINLINE static int isClassName(char *string) { return (strncmp((string), "::xotcl::classes", 16) == 0); } /* removes preceding ::xotcl::classes from a string */ XOTCLINLINE static char * NSCutXOTclClasses(char *string) { assert(strncmp((string), "::xotcl::classes", 16) == 0); return string+16; } XOTCLINLINE static char * NSCmdFullName(Tcl_Command cmd) { Tcl_Namespace *nsPtr = Tcl_Command_nsPtr(cmd); return nsPtr ? nsPtr->fullName : ""; } static void XOTclCleanupObject(XOTclObject *obj) { XOTclObjectRefCountDecr(obj); #if REFCOUNT_TRACE fprintf(stderr,"###CLNO %p refcount = %d\n", obj, obj->refCount); #endif if (obj->refCount <= 0) { assert(obj->refCount == 0); assert(obj->flags & XOTCL_DESTROYED); #if REFCOUNT_TRACE fprintf(stderr,"###CLNO %p flags %x rc %d destr %d dc %d\n", obj, obj->flags, (obj->flags & XOTCL_REFCOUNTED) != 0, (obj->flags & XOTCL_DESTROYED) != 0, (obj->flags & XOTCL_DESTROY_CALLED) != 0 ); #endif MEM_COUNT_FREE("XOTclObject/XOTclClass", obj); #if defined(XOTCLOBJ_TRACE) || defined(REFCOUNT_TRACE) fprintf(stderr, "CKFREE Object %p refcount=%d\n", obj, obj->refCount); #endif #if !defined(NDEBUG) memset(obj, 0, sizeof(XOTclObject)); #endif /* fprintf(stderr,"CKFREE obj %p\n", obj);*/ ckfree((char *) obj); } } /* * Tcl_Obj functions for objects */ static void RegisterObjTypes() { Tcl_RegisterObjType(&XOTclObjectType); } static void FreeXOTclObjectInternalRep(register Tcl_Obj *objPtr) { XOTclObject *obj = (XOTclObject*) objPtr->internalRep.otherValuePtr; /* fprintf(stderr,"FIP objPtr %p obj %p obj->cmd %p '%s', bytes='%s'\n", objPtr, obj, obj->cmdName, ObjStr(obj->cmdName), objPtr->bytes); */ #if defined(XOTCLOBJ_TRACE) if (obj) fprintf(stderr,"FIP --- tcl %p (%d)\n", objPtr, objPtr->refCount); #endif #if !defined(REFCOUNTED) if (obj) { XOTclCleanupObject(obj); } #else if (obj) { #if REFCOUNT_TRACE fprintf(stderr, "FIP in %p\n", obj->teardown); fprintf(stderr, "FIP call is destroy %d\n", RUNTIME_STATE(obj->teardown)->callIsDestroy); fprintf(stderr,"FIP %p flags %x rc %d destr %d dc %d refcount = %d\n", obj, obj->flags, (obj->flags & XOTCL_REFCOUNTED) != 0, (obj->flags & XOTCL_DESTROYED) != 0, (obj->flags & XOTCL_DESTROY_CALLED) != 0, obj->refCount ); #endif if (obj->flags & XOTCL_REFCOUNTED && !(obj->flags & XOTCL_DESTROY_CALLED)) { Tcl_Interp *interp = obj->teardown; INCR_REF_COUNT(obj->cmdName); callDestroyMethod((ClientData)obj, interp, obj, 0); /* the call to cleanup is the counterpart of the INCR_REF_COUNT(obj->cmdName) above */ XOTclCleanupObject(obj); } else { fprintf(stderr, "BEFORE CLEANUPOBJ %x\n", (obj->flags & XOTCL_REFCOUNTED)); XOTclCleanupObject(obj); fprintf(stderr, "AFTER CLEANUPOBJ\n"); } } #endif objPtr->internalRep.otherValuePtr = NULL; objPtr->typePtr = NULL; } static void DupXOTclObjectInternalRep(Tcl_Obj *src, Tcl_Obj *cpy) { XOTclObject *obj = (XOTclObject*)src->internalRep.otherValuePtr; #if defined(XOTCLOBJ_TRACE) if (obj) fprintf(stderr,"DIP --- tcl %p (%d)\n", src, src->refCount); #endif XOTclObjectRefCountIncr(obj); cpy->internalRep.otherValuePtr = src->internalRep.otherValuePtr; cpy->typePtr = src->typePtr; } static int SetXOTclObjectFromAny(Tcl_Interp *interp, register Tcl_Obj *objPtr) { Tcl_ObjType *oldTypePtr = (Tcl_ObjType *)objPtr->typePtr; char *string = ObjStr(objPtr); XOTclObject *obj; int result = TCL_OK; #ifdef XOTCLOBJ_TRACE fprintf(stderr,"SetXOTclObjectFromAny %p '%s' %p\n", objPtr, string, objPtr->typePtr); if (oldTypePtr) fprintf(stderr," convert %s to XOTclObject\n", oldTypePtr->name); #endif if (!isAbsolutePath(string)) { char *nsString; Tcl_Obj *tmpName = NameInNamespaceObj(interp, string, callingNameSpace(interp)); nsString = ObjStr(tmpName); INCR_REF_COUNT(tmpName); obj = XOTclpGetObject(interp, nsString); DECR_REF_COUNT(tmpName); if (!obj) { /* retry with global namespace */ tmpName = Tcl_NewStringObj("::", 2); Tcl_AppendToObj(tmpName, string,-1); INCR_REF_COUNT(tmpName); obj = XOTclpGetObject(interp, ObjStr(tmpName)); DECR_REF_COUNT(tmpName); } } else { obj = XOTclpGetObject(interp, string); } #if 0 obj = XOTclpGetObject(interp, string); #endif if (obj) { if (oldTypePtr && oldTypePtr->freeIntRepProc) { #ifdef XOTCLOBJ_TRACE fprintf(stderr," freeing type=%p, type=%s\n", objPtr->typePtr, objPtr->typePtr ? objPtr->typePtr->name : ""); #endif oldTypePtr->freeIntRepProc(objPtr); } XOTclObjectRefCountIncr(obj); #if defined(XOTCLOBJ_TRACE) fprintf(stderr, "SetXOTclObjectFromAny tcl %p (%d) xotcl %p (%d)\n", objPtr, objPtr->refCount, obj, obj->refCount); #endif objPtr->internalRep.otherValuePtr = (XOTclObject*) obj; objPtr->typePtr = &XOTclObjectType; } else result = TCL_ERROR; return result; } static void UpdateStringOfXOTclObject(register Tcl_Obj *objPtr) { XOTclObject *obj = (XOTclObject *)objPtr->internalRep.otherValuePtr; #ifdef XOTCLOBJ_TRACE fprintf(stderr,"UpdateStringOfXOTclObject %p refCount %d\n", objPtr, objPtr->refCount); fprintf(stderr," teardown %p id %p destroyCalled %d\n", obj->teardown, obj->id, (obj->flags & XOTCL_DESTROY_CALLED)); #endif /* Here we use GetCommandName, because it doesnt need Interp*, but Tcl_GetCommandFullName(interp, obj->id, ObjName); does*/ if (obj && !(obj->flags & XOTCL_DESTROY_CALLED)) { Tcl_DString ds, *dsp = &ds; unsigned l; char *nsFullName = NSCmdFullName(obj->id); DSTRING_INIT(dsp); if (!(*nsFullName==':' && *(nsFullName+1)==':' && *(nsFullName+2)=='\0')) { Tcl_DStringAppend(dsp, nsFullName, -1); } Tcl_DStringAppend(dsp, "::", 2); Tcl_DStringAppend(dsp, Tcl_GetCommandName(NULL, obj->id), -1); l = (unsigned) Tcl_DStringLength(dsp)+1; objPtr->bytes = (char *) ckalloc(l); memcpy(objPtr->bytes, Tcl_DStringValue(dsp), l); objPtr->length = Tcl_DStringLength(dsp); DSTRING_FREE(dsp); } else if (obj) { fprintf(stderr,"try to read string of deleted command\n"); FreeXOTclObjectInternalRep(objPtr); objPtr->bytes = NULL; objPtr->length = 0; } else { objPtr->bytes = NULL; objPtr->length = 0; } /* fprintf(stderr, "+++UpdateStringOfXOTclObject bytes='%s', length=%d\n", objPtr->bytes, objPtr->length); */ } #ifdef NOTUSED static Tcl_Obj * NewXOTclObjectObj(register XOTclObject *obj) { register Tcl_Obj *objPtr; XOTclNewObj(objPtr); objPtr->bytes = NULL; objPtr->internalRep.otherValuePtr = obj; objPtr->typePtr = &XOTclObjectType; #ifdef XOTCLOBJ_TRACE fprintf(stderr,"NewXOTclObjectObj %p\n", objPtr); #endif return objPtr; } #endif static Tcl_Obj * NewXOTclObjectObjName(register XOTclObject *obj, char *name, unsigned l) { register Tcl_Obj *objPtr; XOTclNewObj(objPtr); objPtr->length = l; objPtr->bytes = ckalloc(l+1); memcpy(objPtr->bytes, name, l); *(objPtr->bytes+l) = 0; objPtr->internalRep.otherValuePtr = obj; objPtr->typePtr = &XOTclObjectType; #ifdef XOTCLOBJ_TRACE fprintf(stderr,"NewXOTclObjectObjName tcl %p (%d) xotcl %p (%d) %s\n", objPtr, objPtr->refCount, obj, obj->refCount, objPtr->bytes); #endif XOTclObjectRefCountIncr(obj); return objPtr; } #ifdef KEEP_TCL_CMD_TYPE XOTCLINLINE static CONST86 Tcl_ObjType * GetCmdNameType(Tcl_ObjType CONST86 *cmdType) { static Tcl_ObjType CONST86 *tclCmdNameType = NULL; if (tclCmdNameType == NULL) { # if defined(PRE82) if (cmdType && cmdType != &XOTclObjectType && !strcmp(cmdType->name,"cmdName")) { tclCmdNameType = cmdType; } # else static XOTclMutex initMutex = 0; XOTclMutexLock(&initMutex); if (tclCmdNameType == NULL) tclCmdNameType = Tcl_GetObjType("cmdName"); XOTclMutexUnlock(&initMutex); # endif } return tclCmdNameType; } #endif #if NOTUSED static int XOTclObjGetObject(Tcl_Interp *interp, register Tcl_Obj *objPtr, XOTclObject **obj) { int result; register Tcl_ObjType CONST86 *cmdType = objPtr->typePtr; XOTclObject *o; if (cmdType == &XOTclObjectType) { o = (XOTclObject*) objPtr->internalRep.otherValuePtr; if (!(o->flags & XOTCL_DESTROYED)) { *obj = o; return TCL_OK; } } if (cmdType == GetCmdNameType(cmdType)) { Tcl_Command cmd = Tcl_GetCommandFromObj(interp, objPtr); /*fprintf(stderr,"obj is of type tclCmd\n");*/ if (cmd) { o = XOTclGetObjectFromCmdPtr(cmd); if (o) { *obj = o; return TCL_OK; } } } o = XOTclpGetObject(interp, ObjStr(objPtr)); if (o) { *obj = o; return TCL_OK; } return TCL_ERROR; } #endif static int XOTclObjConvertObject(Tcl_Interp *interp, Tcl_Obj *objPtr, XOTclObject **obj) { int result; register Tcl_ObjType CONST86 *cmdType = objPtr->typePtr; /* * Only really share the "::x" Tcl_Objs but not "x" because we so not have * references upon object kills and then will get dangling * internalRep references to killed XOTclObjects */ if (cmdType == &XOTclObjectType) { /*fprintf(stderr,"obj is of type XOTclObjectType\n");*/ if (obj) { XOTclObject *o = (XOTclObject*) objPtr->internalRep.otherValuePtr; #ifdef XOTCLOBJ_TRACE int refetch = 0; #endif if (o->flags & XOTCL_DESTROYED) { /* fprintf(stderr,"????? calling free by hand\n"); */ FreeXOTclObjectInternalRep(objPtr); #ifdef XOTCLOBJ_TRACE refetch = 1; #endif result = SetXOTclObjectFromAny(interp, objPtr); if (result == TCL_OK) { o = (XOTclObject*) objPtr->internalRep.otherValuePtr; assert(o && !(o->flags & XOTCL_DESTROYED)); } } else { result = TCL_OK; } *obj = o; #ifdef XOTCLOBJ_TRACE if (result == TCL_OK) fprintf(stderr,"XOTclObjConvertObject tcl %p (%d) xotcl %p (%d) r=%d %s\n", objPtr, objPtr->refCount, o, o->refCount, refetch, objPtr->bytes); else fprintf(stderr,"XOTclObjConvertObject tcl %p (%d) **** rc=%d r=%d %s\n", objPtr, objPtr->refCount, result, refetch, objPtr->bytes); #endif } else { result = TCL_OK; } #ifdef KEEP_TCL_CMD_TYPE } else if (cmdType == GetCmdNameType(cmdType)) { Tcl_Command cmd = Tcl_GetCommandFromObj(interp, objPtr); /*fprintf(stderr,"obj %s is of type tclCmd, cmd=%p\n", ObjStr(objPtr), cmd);*/ if (cmd) { XOTclObject *o = XOTclGetObjectFromCmdPtr(cmd); /* fprintf(stderr,"Got Object from '%s' %p\n", objPtr->bytes, o); fprintf(stderr,"cmd->objProc %p == %p, proc=%p\n", Tcl_Command_objProc(cmd), XOTclObjDispatch, Tcl_Command_proc(cmd) ); */ if (o) { if (obj) *obj = o; result = TCL_OK; } else { goto convert_to_xotcl_object; } } else goto convert_to_xotcl_object; #endif } else { #ifdef KEEP_TCL_CMD_TYPE convert_to_xotcl_object: #endif result = SetXOTclObjectFromAny(interp, objPtr); if (result == TCL_OK && obj) { *obj = (XOTclObject*) objPtr->internalRep.otherValuePtr; } } return result; } #ifndef NAMESPACEINSTPROCS static Tcl_Namespace * GetCallerVarFrame(Tcl_Interp *interp, Tcl_CallFrame *varFramePtr) { Tcl_Namespace *nsPtr = NULL; if (varFramePtr) { Tcl_CallFrame *callerVarPtr = Tcl_CallFrame_callerVarPtr(varFramePtr); if (callerVarPtr) { nsPtr = (Tcl_Namespace *)callerVarPtr->nsPtr; } } if (nsPtr == NULL) nsPtr = Tcl_Interp_globalNsPtr(interp); return nsPtr; } #endif static Tcl_Obj* NameInNamespaceObj(Tcl_Interp *interp, char *name, Tcl_Namespace *ns) { Tcl_Obj *objName; int len; char *p; /*fprintf(stderr,"NameInNamespaceObj %s (%p) ", name, ns);*/ if (!ns) ns = Tcl_GetCurrentNamespace(interp); objName = Tcl_NewStringObj(ns->fullName,-1); len = Tcl_GetCharLength(objName); p = ObjStr(objName); if (len == 2 && p[0] == ':' && p[1] == ':') { } else { Tcl_AppendToObj(objName,"::", 2); } Tcl_AppendToObj(objName, name, -1); /*fprintf(stderr,"returns %s\n", ObjStr(objName));*/ return objName; } static int GetXOTclClassFromObj(Tcl_Interp *interp, register Tcl_Obj *objPtr, XOTclClass **cl, int retry) { XOTclObject *obj; XOTclClass *cls = NULL; int result = TCL_OK; char *objName = ObjStr(objPtr); /* fprintf(stderr, "GetXOTclClassFromObj %s retry %d\n", objName, retry);*/ if (retry) { /* we refer to an existing object; use command resolver */ if (!isAbsolutePath(objName)) { Tcl_Command cmd = NSFindCommand(interp, objName, callingNameSpace(interp)); /*fprintf(stderr, "GetXOTclClassFromObj %s cmd = %p cl=%p retry=%d\n", objName, cmd, cmd ? XOTclGetClassFromCmdPtr(cmd) : NULL, retry);*/ if (cmd) { cls = XOTclGetClassFromCmdPtr(cmd); if (cl) *cl = cls; } } } if (!cls) { result = XOTclObjConvertObject(interp, objPtr, &obj); if (result == TCL_OK) { cls = XOTclObjectToClass(obj); if (cls) { if (cl) *cl = cls; } else { /* we have an object, but no class */ result = TCL_ERROR; } } } if (!cls && retry) { Tcl_Obj *ov[3]; ov[0] = RUNTIME_STATE(interp)->theClass->object.cmdName; ov[1] = XOTclGlobalObjects[XOTE___UNKNOWN]; if (isAbsolutePath(objName)) { ov[2] = objPtr; } else { ov[2] = NameInNamespaceObj(interp, objName, callingNameSpace(interp)); } INCR_REF_COUNT(ov[2]); /*fprintf(stderr,"+++ calling %s __unknown for %s, objPtr=%s\n", ObjStr(ov[0]), ObjStr(ov[2]), ObjStr(objPtr)); */ result = Tcl_EvalObjv(interp, 3, ov, 0); if (result == TCL_OK) { result = GetXOTclClassFromObj(interp, objPtr, cl, 0); } DECR_REF_COUNT(ov[2]); } /*fprintf(stderr, "GetXOTclClassFromObj %s returns %d cls = %p *cl = %p\n", objName, result, cls, cl?*cl:NULL);*/ return result; } extern void XOTclFreeClasses(XOTclClasses *sl) { XOTclClasses *n; for (; sl; sl = n) { n = sl->next; FREE(XOTclClasses, sl); } } /* reverse class list, caller is responsible for freeing data */ static XOTclClasses* XOTclReverseClasses(XOTclClasses *sl) { XOTclClasses *first = NULL; for (; sl; sl = sl->next) { XOTclClasses *element = NEW(XOTclClasses); element->cl = sl->cl; element->clientData = sl->clientData; element->next = first; first = element; } return first; } extern XOTclClasses** XOTclAddClass(XOTclClasses **cList, XOTclClass *cl, ClientData cd) { XOTclClasses *l = *cList, *element = NEW(XOTclClasses); element->cl = cl; element->clientData = cd; element->next = NULL; if (l) { while (l->next) l = l->next; l->next = element; } else *cList = element; return &(element->next); } /* * precedence ordering functions */ enum colors { WHITE, GRAY, BLACK }; static XOTclClasses *Super(XOTclClass *cl) { return cl->super; } static XOTclClasses *Sub(XOTclClass *cl) { return cl->sub; } static int TopoSort(XOTclClass *cl, XOTclClass *base, XOTclClasses* (*next)(XOTclClass*)) { /*XOTclClasses *sl = (*next)(cl);*/ XOTclClasses *sl = next == Super ? cl->super : cl->sub; XOTclClasses *pl; /* * careful to reset the color of unreported classes to * white in case we unwind with error, and on final exit * reset color of reported classes to white */ cl->color = GRAY; for (; sl; sl = sl->next) { XOTclClass *sc = sl->cl; if (sc->color == GRAY) { cl->color = WHITE; return 0; } if (sc->color == WHITE && !TopoSort(sc, base, next)) { cl->color = WHITE; if (cl == base) { register XOTclClasses *pc; for (pc = cl->order; pc; pc = pc->next) { pc->cl->color = WHITE; } } return 0; } } cl->color = BLACK; pl = NEW(XOTclClasses); pl->cl = cl; pl->next = base->order; base->order = pl; if (cl == base) { register XOTclClasses *pc; for (pc = cl->order; pc; pc = pc->next) { pc->cl->color = WHITE; } } return 1; } static XOTclClasses* TopoOrder(XOTclClass *cl, XOTclClasses* (*next)(XOTclClass*)) { if (TopoSort(cl, cl, next)) return cl->order; XOTclFreeClasses(cl->order); return cl->order = NULL; } static XOTclClasses* ComputeOrder(XOTclClass *cl, XOTclClasses *order, XOTclClasses* (*direction)(XOTclClass*)) { if (order) return order; return cl->order = TopoOrder(cl, direction); } extern XOTclClasses* XOTclComputePrecedence(XOTclClass *cl) { return ComputeOrder(cl, cl->order, Super); } extern XOTclClasses* XOTclComputeDependents(XOTclClass *cl) { return ComputeOrder(cl, cl->order, Sub); } static void FlushPrecedencesOnSubclasses(XOTclClass *cl) { XOTclClasses *pc; XOTclFreeClasses(cl->order); cl->order = NULL; pc = ComputeOrder(cl, cl->order, Sub); /* * ordering doesn't matter here - we're just using toposort * to find all lower classes so we can flush their caches */ if (pc) pc = pc->next; for (; pc; pc = pc->next) { XOTclFreeClasses(pc->cl->order); pc->cl->order = NULL; } XOTclFreeClasses(cl->order); cl->order = NULL; } static void AddInstance(XOTclObject *obj, XOTclClass *cl) { obj->cl = cl; if (cl) { int nw; (void) Tcl_CreateHashEntry(&cl->instances, (char *)obj, &nw); } } static int RemoveInstance(XOTclObject *obj, XOTclClass *cl) { if (cl) { Tcl_HashEntry *hPtr = XOTcl_FindHashEntry(&cl->instances, (char *)obj); if (hPtr) { Tcl_DeleteHashEntry(hPtr); return 1; } } return 0; } /* * superclass/subclass list maintenance */ static void AS(XOTclClass *cl, XOTclClass *s, XOTclClasses **sl) { register XOTclClasses *l = *sl; while (l && l->cl != s) l = l->next; if (!l) { XOTclClasses *sc = NEW(XOTclClasses); sc->cl = s; sc->next = *sl; *sl = sc; } } static void AddSuper(XOTclClass *cl, XOTclClass *super) { if (cl && super) { /* * keep corresponding sub in step with super */ AS(cl, super, &cl->super); AS(super, cl, &super->sub); } } static int RemoveSuper1(XOTclClass *cl, XOTclClass *s, XOTclClasses **sl) { XOTclClasses *l = *sl; if (!l) return 0; if (l->cl == s) { *sl = l->next; FREE(XOTclClasses, l); return 1; } while (l->next && l->next->cl != s) l = l->next; if (l->next) { XOTclClasses *n = l->next->next; FREE(XOTclClasses, l->next); l->next = n; return 1; } return 0; } static int RemoveSuper(XOTclClass *cl, XOTclClass *super) { /* * keep corresponding sub in step with super */ int sp = RemoveSuper1(cl, super, &cl->super); int sb = RemoveSuper1(super, cl, &super->sub); return sp && sb; } /* * internal type checking */ extern XOTcl_Class* XOTclIsClass(Tcl_Interp *interp, ClientData cd) { if (cd && XOTclObjectIsClass((XOTclObject *)cd)) return (XOTcl_Class*) cd; return 0; } /* * methods lookup */ XOTCLINLINE static Tcl_Command FindMethod(char *methodName, Tcl_Namespace *nsPtr) { register Tcl_HashEntry *entryPtr; if ((entryPtr = XOTcl_FindHashEntry(Tcl_Namespace_cmdTable(nsPtr), methodName))) { return (Tcl_Command) Tcl_GetHashValue(entryPtr); } /*fprintf(stderr, "find %s in %p returns %p\n", methodName, cmdTable, cmd);*/ return NULL; } static XOTclClass* SearchPLMethod(XOTclClasses *pl, char *methodName, Tcl_Command *cmd) { /* Search the precedence list (class hierarchy) */ #if 0 Tcl_HashEntry *entryPtr; for (; pl; pl = pl->next) { if ((entryPtr = XOTcl_FindHashEntry(Tcl_Namespace_cmdTable(pl->cl->nsPtr), methodName))) { *cmd = (Tcl_Command) Tcl_GetHashValue(entryPtr); return pl->cl; } } #else for (; pl; pl = pl->next) { if ((*cmd = FindMethod(methodName, pl->cl->nsPtr))) { return pl->cl; } } #endif return NULL; } static XOTclClass* SearchCMethod(XOTclClass *cl, char *nm, Tcl_Command *cmd) { assert(cl); return SearchPLMethod(ComputeOrder(cl, cl->order, Super), nm, cmd); } static int callDestroyMethod(ClientData cd, Tcl_Interp *interp, XOTclObject *obj, int flags) { int result; /* don't call destroy after exit handler started physical destruction */ if (RUNTIME_STATE(interp)->exitHandlerDestroyRound == XOTCL_EXITHANDLER_ON_PHYSICAL_DESTROY) return TCL_OK; /* fprintf(stderr," obj %p flags %.4x %d\n", obj, obj->flags, RUNTIME_STATE(interp)->callDestroy);*/ /* we don't call destroy, if we're in the exit handler during destruction of Object and Class */ if (!RUNTIME_STATE(interp)->callDestroy) { obj->flags |= XOTCL_DESTROY_CALLED; /* return TCL_ERROR so that clients know we haven't deleted the associated command yet */ return TCL_ERROR; } /*fprintf(stderr, "+++ calldestroy flags=%d\n", flags);*/ if (obj->flags & XOTCL_DESTROY_CALLED) return TCL_OK; #if !defined(NDEBUG) {char *cmdName = ObjStr(obj->cmdName); assert(cmdName); /*fprintf(stderr,"findCommand %s -> %p obj->id %p\n", cmdName, Tcl_FindCommand(interp, cmdName, NULL, 0), obj->id);*/ /*assert(Tcl_FindCommand(interp, cmdName, NULL, 0) != NULL);*/ /*fprintf(stderr,"callDestroyMethod: %p command to be destroyed '%s' does not exist\n", obj, cmdName);*/ } #endif #ifdef OBJDELETION_TRACE fprintf(stderr, " command found\n"); PRINTOBJ("callDestroy", obj); #endif result = callMethod(cd, interp, XOTclGlobalObjects[XOTE_DESTROY], 2, 0, flags); if (result != TCL_OK) { static char cmd[] = "puts stderr \"[self]: Error in instproc destroy\n\ $::errorCode $::errorInfo\""; Tcl_EvalEx(interp, cmd, -1, 0); if (++RUNTIME_STATE(interp)->errorCount > 20) Tcl_Panic("too many destroy errors occured. Endless loop?", NULL); } else { if (RUNTIME_STATE(interp)->errorCount > 0) RUNTIME_STATE(interp)->errorCount--; } #ifdef OBJDELETION_TRACE fprintf(stderr, "callDestroyMethod for %p exit\n", obj); #endif return result; } /* * conditional memory allocations of optional storage */ extern XOTclObjectOpt * XOTclRequireObjectOpt(XOTclObject *obj) { if (!obj->opt) { obj->opt = NEW(XOTclObjectOpt); memset(obj->opt, 0, sizeof(XOTclObjectOpt)); } return obj->opt; } extern XOTclClassOpt* XOTclRequireClassOpt(XOTclClass *cl) { assert(cl); if (!cl->opt) { cl->opt = NEW(XOTclClassOpt); memset(cl->opt, 0, sizeof(XOTclClassOpt)); if (cl->object.flags & XOTCL_IS_CLASS) { cl->opt->id = cl->object.id; /* probably a temporary solution */ } } return cl->opt; } static Tcl_Namespace* NSGetFreshNamespace(Tcl_Interp *interp, ClientData cd, char *name); static void makeObjNamespace(Tcl_Interp *interp, XOTclObject *obj) { #ifdef NAMESPACE_TRACE fprintf(stderr, "+++ Make Namespace for %s\n", ObjStr(obj->cmdName)); #endif if (!obj->nsPtr) { Tcl_Namespace *nsPtr; char *cmdName = ObjStr(obj->cmdName); obj->nsPtr = NSGetFreshNamespace(interp, (ClientData)obj, cmdName); if (!obj->nsPtr) Tcl_Panic("makeObjNamespace: Unable to make namespace", NULL); nsPtr = obj->nsPtr; /* * Copy all obj variables to the newly created namespace */ if (obj->varTable) { Tcl_HashSearch search; Tcl_HashEntry *hPtr; TclVarHashTable *varTable = Tcl_Namespace_varTable(nsPtr); Tcl_HashTable *varHashTable = VarHashTable(varTable); Tcl_HashTable *objHashTable = VarHashTable(obj->varTable); *varHashTable = *objHashTable; /* copy the table */ if (objHashTable->buckets == objHashTable->staticBuckets) { varHashTable->buckets = varHashTable->staticBuckets; } for (hPtr = Tcl_FirstHashEntry(varHashTable, &search); hPtr; hPtr = Tcl_NextHashEntry(&search)) { #if defined(PRE85) Var *varPtr; # if FORWARD_COMPATIBLE if (!forwardCompatibleMode) { varPtr = (Var *) Tcl_GetHashValue(hPtr); varPtr->nsPtr = (Namespace *)nsPtr; } # else varPtr = (Var *) Tcl_GetHashValue(hPtr); varPtr->nsPtr = (Namespace *)nsPtr; # endif #endif hPtr->tablePtr = varHashTable; } ckfree((char *) obj->varTable); obj->varTable = NULL; } } } /* typedef int (Tcl_ResolveVarProc) _ANSI_ARGS_(( * Tcl_Interp *interp, CONST char * name, Tcl_Namespace *context, * int flags, Tcl_Var *rPtr)); */ int varResolver(Tcl_Interp *interp, CONST char *name, Tcl_Namespace *ns, int flags, Tcl_Var *varPtr) { int new; Tcl_CallFrame *varFramePtr; /* Case 1: The variable is to be resolved in global scope, proceed in * resolver chain (i.e. return TCL_CONTINUE) * * Note: For now, I am not aware of this case to become effective, * it is a mere safeguard measure. * * TODO: Can it be omitted safely? */ if (flags & TCL_GLOBAL_ONLY) { /*fprintf(stderr, "global-scoped var detected '%s' in NS '%s'\n", name, \ varFramePtr->nsPtr->fullName);*/ return TCL_CONTINUE; } /* Case 2: The variable appears as to be proc-local, so proceed in * resolver chain (i.e. return TCL_CONTINUE) * * Note 1: This happens to be a rare occurrence, e.g. for nested * object structures which are shadowed by nested Tcl namespaces. * * TODO: Cannot reproduce the issue found with xotcl::package->require() * * Note 2: It would be possible to resolve the proc-local variable * directly (by digging into compiled and non-compiled locals etc.), * however, it would cause further code redundance. */ varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); /* fprintf(stderr,"varFramePtr=%p, isProcCallFrame=%d %p\n",varFramePtr, varFramePtr != NULL ? Tcl_CallFrame_isProcCallFrame(varFramePtr): 0, varFramePtr != NULL ? Tcl_CallFrame_procPtr(varFramePtr): 0 ); */ if (varFramePtr && Tcl_CallFrame_isProcCallFrame(varFramePtr)) { /*fprintf(stderr, "proc-scoped var detected '%s' in NS '%s'\n", name, varFramePtr->nsPtr->fullName);*/ return TCL_CONTINUE; } /* * Check for absolutely/relatively qualified variable names, i.e. * make sure that the variable name does not contain any namespace qualifiers. * Proceed with a TCL_CONTINUE, otherwise. */ if ((*name == ':' && *(name+1) == ':') || NSTail(name) != name) { return TCL_CONTINUE; } /* Case 3: Does the variable exist in the per-object namespace? */ *varPtr = (Tcl_Var)LookupVarFromTable(Tcl_Namespace_varTable(ns),name,NULL); if(*varPtr == NULL) { /* We failed to find the variable so far, therefore we create it * here in the namespace. Note that the cases (1), (2) and (3) * TCL_CONTINUE care for variable creation if necessary. */ Var *newVar; Tcl_Obj *key = Tcl_NewStringObj(name, -1); INCR_REF_COUNT(key); newVar = VarHashCreateVar(Tcl_Namespace_varTable(ns), key, &new); DECR_REF_COUNT(key); #if defined(PRE85) # if FORWARD_COMPATIBLE if (!forwardCompatibleMode) { newVar->nsPtr = (Namespace *)ns; } # else newVar->nsPtr = (Namespace *)ns; # endif #endif *varPtr = (Tcl_Var)newVar; } return *varPtr ? TCL_OK : TCL_ERROR; } static void requireObjNamespace(Tcl_Interp *interp, XOTclObject *obj) { if (!obj->nsPtr) makeObjNamespace(interp, obj); /* This puts a per-object namespace resolver into position upon * acquiring the namespace. Works for object-scoped commands/procs * and object-only ones (set, unset, ...) */ Tcl_SetNamespaceResolvers(obj->nsPtr, (Tcl_ResolveCmdProc*)NULL, varResolver, (Tcl_ResolveCompiledVarProc*)NULL); } extern void XOTclRequireObjNamespace(Tcl_Interp *interp, XOTcl_Object *obj) { requireObjNamespace(interp,(XOTclObject*) obj); } /* * Namespace related commands */ static int NSDeleteCmd(Tcl_Interp *interp, Tcl_Namespace *ns, char *name) { /* a simple deletion would delete a global command with the same name, if the command is not existing, so we use the CmdToken */ Tcl_Command token; assert(ns); if ((token = FindMethod(name, ns))) { return Tcl_DeleteCommandFromToken(interp, token); } return -1; } static void CallStackDestroyObject(Tcl_Interp *interp, XOTclObject *obj); static void PrimitiveCDestroy(ClientData cd); static void PrimitiveODestroy(ClientData cd); static void tclDeletesObject(ClientData clientData) { XOTclObject *object = (XOTclObject*)clientData; /*fprintf(stderr, "tclDeletesObject %p\n",object);*/ object->flags |= XOTCL_TCL_DELETE; PrimitiveODestroy(clientData); } static void tclDeletesClass(ClientData clientData) { XOTclObject *object = (XOTclObject*)clientData; /*fprintf(stderr, "tclDeletesClass %p\n",object);*/ object->flags |= XOTCL_TCL_DELETE; PrimitiveCDestroy(clientData); } static void NSDeleteChildren(Tcl_Interp *interp, Tcl_Namespace *ns) { Tcl_HashTable *cmdTable = Tcl_Namespace_cmdTable(ns); Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; #ifdef OBJDELETION_TRACE fprintf(stderr, "NSDeleteChildren %s\n", ns->fullName); #endif Tcl_ForgetImport(interp, ns, "*"); /* don't destroy namespace imported objects */ for (hPtr = Tcl_FirstHashEntry(cmdTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { Tcl_Command cmd; int expected; /* * If a destroy of one element of the hash table triggers the * destroy of another item, Tcl_NextHashEntry() can lead to a * valid looking hPtr, when the next entry was already * deleted. This seem to occur only, when there are more than 12 * hash entries in the table (multiple buckets). However, the * valid looking hPtr might return garbage (looks like * uninitialized memory). Most probably Tcl_NextHashEntry() should * return 0; */ if (cmdTable->numEntries < 1) { break; } expected = cmdTable->numEntries; cmd = (Tcl_Command)Tcl_GetHashValue(hPtr); if (!Tcl_Command_cmdEpoch(cmd)) { char *oname = Tcl_GetHashKey(cmdTable, hPtr); Tcl_DString name; XOTclObject *obj; /* fprintf(stderr, " ... child %s\n", oname); */ ALLOC_NAME_NS(&name, ns->fullName, oname); obj = XOTclpGetObject(interp, Tcl_DStringValue(&name)); if (obj) { /* fprintf(stderr, " ... obj= %s\n", ObjStr(obj->cmdName));*/ /* in the exit handler physical destroy --> directly call destroy */ if (RUNTIME_STATE(interp)->exitHandlerDestroyRound == XOTCL_EXITHANDLER_ON_PHYSICAL_DESTROY) { if (XOTclObjectIsClass(obj)) { PrimitiveCDestroy((ClientData) obj); } else { PrimitiveODestroy((ClientData) obj); } expected --; } else { if (obj->teardown && obj->id && !(obj->flags & XOTCL_DESTROY_CALLED)) { if (callDestroyMethod((ClientData)obj, interp, obj, 0) != TCL_OK) { /* destroy method failed, but we have to remove the command anyway. */ obj->flags |= XOTCL_DESTROY_CALLED; if (obj->teardown) { CallStackDestroyObject(interp, obj); } /*(void*) Tcl_DeleteCommandFromToken(interp, oid);*/ } expected --; } } } DSTRING_FREE(&name); } /* * If the hash table numEntries differs from expected, a deletion * of one entry must have triggered other deletions. So we refetch * the hSrch structure. */ if (cmdTable->numEntries != expected) { hPtr = Tcl_FirstHashEntry(cmdTable, &hSrch); } } } /* * ensure that a variable exists on object varTable or nsPtr->varTable, * if necessary create it. Return Var * if successful, otherwise 0 */ static Var * NSRequireVariableOnObj(Tcl_Interp *interp, XOTclObject *obj, char *name, int flgs) { XOTcl_FrameDecls; Var *varPtr, *arrayPtr; XOTcl_PushFrame(interp, obj); varPtr = TclLookupVar(interp, name, 0, flgs, "obj vwait", /*createPart1*/ 1, /*createPart2*/ 0, &arrayPtr); XOTcl_PopFrame(interp, obj); return varPtr; } static int XOTcl_DeleteCommandFromToken(Tcl_Interp *interp, Tcl_Command cmd) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc = cs->top; for (; csc > cs->content; csc--) { if (csc->cmdPtr == cmd) { csc->cmdPtr = NULL; } } return Tcl_DeleteCommandFromToken(interp, cmd); } /* * delete all vars & procs in a namespace */ static void NSCleanupNamespace(Tcl_Interp *interp, Tcl_Namespace *ns) { TclVarHashTable *varTable = Tcl_Namespace_varTable(ns); Tcl_HashTable *cmdTable = Tcl_Namespace_cmdTable(ns); Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; Tcl_Command cmd; /* * Delete all variables and initialize var table again * (deleteVars frees the vartable) */ TclDeleteVars((Interp *)interp, varTable); InitVarHashTable(varTable, (Namespace *)ns); /* * Delete all user-defined procs in the namespace */ for (hPtr = Tcl_FirstHashEntry(cmdTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { cmd = (Tcl_Command) Tcl_GetHashValue(hPtr); /* objects should not be deleted here to preseve children deletion order*/ if (!XOTclGetObjectFromCmdPtr(cmd)) { /*fprintf(stderr,"NSCleanupNamespace deleting %s %p\n", Tcl_Command_nsPtr(cmd)->fullName, cmd);*/ XOTcl_DeleteCommandFromToken(interp, cmd); } } } static void NSNamespaceDeleteProc(ClientData clientData) { /* dummy for ns identification by pointer comparison */ XOTclObject *obj = (XOTclObject*) clientData; /*fprintf(stderr,"namespacedeleteproc obj=%p\n", clientData);*/ if (obj) { obj->flags |= XOTCL_NS_DESTROYED; obj->nsPtr = NULL; } } #ifdef EXPERIMENTAL_CMD_RESOLVER static int NSisXOTclNamespace(Tcl_Namespace *nsPtr) { return nsPtr->deleteProc == NSNamespaceDeleteProc; } #endif void XOTcl_DeleteNamespace(Tcl_Interp *interp, Tcl_Namespace *nsPtr) { int activationCount = 0; Tcl_CallFrame *f = (Tcl_CallFrame *)Tcl_Interp_framePtr(interp); /* fprintf(stderr, " ... correcting ActivationCount for %s was %d ", nsPtr->fullName, nsp->activationCount); */ while (f) { if (f->nsPtr == nsPtr) activationCount++; f = Tcl_CallFrame_callerPtr(f); } Tcl_Namespace_activationCount(nsPtr) = activationCount; /* fprintf(stderr, "to %d. \n", nsp->activationCount); */ MEM_COUNT_FREE("TclNamespace", nsPtr); if (Tcl_Namespace_deleteProc(nsPtr)) { /*fprintf(stderr,"calling deteteNamespace\n");*/ Tcl_DeleteNamespace(nsPtr); } } static Tcl_Namespace* NSGetFreshNamespace(Tcl_Interp *interp, ClientData cd, char *name) { Tcl_Namespace *ns = Tcl_FindNamespace(interp, name, NULL, 0); if (ns) { if (ns->deleteProc || ns->clientData) { Tcl_Panic("Namespace '%s' exists already with delProc %p and clientData %p; Can only convert a plain Tcl namespace into an XOTcl namespace", name, ns->deleteProc, ns->clientData); } ns->clientData = cd; ns->deleteProc = (Tcl_NamespaceDeleteProc *)NSNamespaceDeleteProc; } else { ns = Tcl_CreateNamespace(interp, name, cd, (Tcl_NamespaceDeleteProc *)NSNamespaceDeleteProc); } MEM_COUNT_ALLOC("TclNamespace", ns); return ns; } /* * check colons for illegal object/class names */ XOTCLINLINE static int NSCheckColons(char *name, unsigned l) { register char *n = name; if (*n == '\0') return 0; /* empty name */ if (l == 0) l=strlen(name); if (*(n+l-1) == ':') return 0; /* name ends with : */ if (*n == ':' && *(n+1) != ':') return 0; /* name begins with single : */ for (; *n != '\0'; n++) { if (*n == ':' && *(n+1) == ':' && *(n+2) == ':') return 0; /* more than 2 colons in series in a name */ } return 1; } /* * check for parent namespace existance (used before commands are created) */ XOTCLINLINE static int NSCheckForParent(Tcl_Interp *interp, char *name, unsigned l) { register char *n = name+l; int result = 1; /*search for last '::'*/ while ((*n != ':' || *(n-1) != ':') && n-1 > name) {n--; } if (*n == ':' && n > name && *(n-1) == ':') {n--;} if ((n-name)>0) { Tcl_DString parentNSName, *dsp = &parentNSName; char *parentName; DSTRING_INIT(dsp); Tcl_DStringAppend(dsp, name, (n-name)); parentName = Tcl_DStringValue(dsp); if (Tcl_FindNamespace(interp, parentName, (Tcl_Namespace *) NULL, TCL_GLOBAL_ONLY) == NULL) { XOTclObject *parentObj = (XOTclObject*) XOTclpGetObject(interp, parentName); if (parentObj) { /* this is for classes */ requireObjNamespace(interp, parentObj); } else { /* call unknown and try again */ Tcl_Obj *ov[3]; int rc; ov[0] = RUNTIME_STATE(interp)->theClass->object.cmdName; ov[1] = XOTclGlobalObjects[XOTE___UNKNOWN]; ov[2] = Tcl_NewStringObj(parentName,-1); INCR_REF_COUNT(ov[2]); /*fprintf(stderr,"+++ parent... calling __unknown for %s\n", ObjStr(ov[2]));*/ rc = Tcl_EvalObjv(interp, 3, ov, 0); if (rc == TCL_OK) { XOTclObject *parentObj = (XOTclObject*) XOTclpGetObject(interp, parentName); if (parentObj) { requireObjNamespace(interp, parentObj); } result = (Tcl_FindNamespace(interp, parentName, (Tcl_Namespace *) NULL, TCL_GLOBAL_ONLY) != NULL); } else { result = 0; } DECR_REF_COUNT(ov[2]); } } else { XOTclObject *parentObj = (XOTclObject*) XOTclpGetObject(interp, parentName); if (parentObj) { requireObjNamespace(interp, parentObj); } } DSTRING_FREE(dsp); } return result; } /* * Find the "real" command belonging eg. to an XOTcl class or object. * Do not return cmds produced by Tcl_Import, but the "real" cmd * to which they point. */ XOTCLINLINE static Tcl_Command NSFindCommand(Tcl_Interp *interp, char *name, Tcl_Namespace *ns) { Tcl_Command cmd; if ((cmd = Tcl_FindCommand(interp, name, ns, 0))) { Tcl_Command importedCmd; if ((importedCmd = TclGetOriginalCommand(cmd))) cmd = importedCmd; } return cmd; } /* * C interface routines for manipulating objects and classes */ extern XOTcl_Object* XOTclGetObject(Tcl_Interp *interp, char *name) { return (XOTcl_Object*) XOTclpGetObject(interp, name); } /* * Find an object using a char *name */ static XOTclObject* XOTclpGetObject(Tcl_Interp *interp, char *name) { register Tcl_Command cmd; assert(name); cmd = NSFindCommand(interp, name, NULL); /*if (cmd) { fprintf(stderr,"+++ XOTclGetObject from %s -> objProc=%p, dispatch=%p\n", name, Tcl_Command_objProc(cmd), XOTclObjDispatch); }*/ if (cmd && Tcl_Command_objProc(cmd) == XOTclObjDispatch) { return (XOTclObject*)Tcl_Command_objClientData(cmd); } return 0; } /* * Find a class using a char *name */ extern XOTcl_Class* XOTclGetClass(Tcl_Interp *interp, char *name) { return (XOTcl_Class*)XOTclpGetClass(interp, name); } static XOTclClass* XOTclpGetClass(Tcl_Interp *interp, char *name) { XOTclObject *obj = XOTclpGetObject(interp, name); return (obj && XOTclObjectIsClass(obj)) ? (XOTclClass*)obj : NULL; } void XOTclAddPMethod(Tcl_Interp *interp, XOTcl_Object *obji, CONST char *nm, Tcl_ObjCmdProc *proc, ClientData cd, Tcl_CmdDeleteProc *dp) { XOTclObject *obj = (XOTclObject*) obji; Tcl_DString newCmd, *cptr = &newCmd; requireObjNamespace(interp, obj); ALLOC_NAME_NS(cptr, obj->nsPtr->fullName, nm); Tcl_CreateObjCommand(interp, Tcl_DStringValue(cptr), proc, cd, dp); DSTRING_FREE(cptr); } void XOTclAddIMethod(Tcl_Interp *interp, XOTcl_Class *cli, CONST char *nm, Tcl_ObjCmdProc *proc, ClientData cd, Tcl_CmdDeleteProc *dp) { XOTclClass *cl = (XOTclClass*) cli; Tcl_DString newCmd, *cptr = &newCmd; ALLOC_NAME_NS(cptr, cl->nsPtr->fullName, nm); Tcl_CreateObjCommand(interp, Tcl_DStringValue(cptr), proc, cd, dp); DSTRING_FREE(cptr); } /* * Generic Tcl_Obj List */ static void TclObjListFreeList(XOTclTclObjList *list) { while (list) { XOTclTclObjList *del = list; list = list->next; DECR_REF_COUNT(del->content); FREE(XOTclTclObjList, del); } } static Tcl_Obj* TclObjListNewElement(XOTclTclObjList **list, Tcl_Obj *ov) { XOTclTclObjList *elt = NEW(XOTclTclObjList); INCR_REF_COUNT(ov); elt->content = ov; elt->next = *list; *list = elt; return ov; } /* * Autonaming */ static Tcl_Obj* AutonameIncr(Tcl_Interp *interp, Tcl_Obj *name, XOTclObject *obj, int instanceOpt, int resetOpt) { int valueLength; Tcl_Obj *valueObject, *result = NULL; #ifdef PRE83 int flgs = 0; #else int flgs = TCL_LEAVE_ERR_MSG; #endif XOTcl_FrameDecls; XOTcl_PushFrame(interp, obj); if (obj->nsPtr) flgs |= TCL_NAMESPACE_ONLY; valueObject = Tcl_ObjGetVar2(interp, XOTclGlobalObjects[XOTE_AUTONAMES], name, flgs); if (valueObject) { long autoname_counter; /* should probably do an overflow check here */ Tcl_GetLongFromObj(interp, valueObject,&autoname_counter); autoname_counter++; if (Tcl_IsShared(valueObject)) { valueObject = Tcl_DuplicateObj(valueObject); } Tcl_SetLongObj(valueObject, autoname_counter); Tcl_ObjSetVar2(interp, XOTclGlobalObjects[XOTE_AUTONAMES], name, valueObject, flgs); } if (resetOpt) { if (valueObject) { /* we have an entry */ Tcl_UnsetVar2(interp, XOTclGlobalStrings[XOTE_AUTONAMES], ObjStr(name), flgs); } result = XOTclGlobalObjects[XOTE_EMPTY]; INCR_REF_COUNT(result); } else { int mustCopy = 1, format = 0; char *c; if (valueObject == NULL) { valueObject = Tcl_ObjSetVar2(interp, XOTclGlobalObjects[XOTE_AUTONAMES], name, XOTclGlobalObjects[XOTE_ONE], flgs); } if (instanceOpt) { char firstChar, *nextChars; nextChars = ObjStr(name); firstChar = *(nextChars ++); if (isupper((int)firstChar)) { char buffer[1]; buffer[0] = tolower((int)firstChar); result = Tcl_NewStringObj(buffer, 1); INCR_REF_COUNT(result); Tcl_AppendToObj(result, nextChars, -1); mustCopy = 0; } } if (mustCopy) { result = Tcl_DuplicateObj(name); INCR_REF_COUNT(result); /* fprintf(stderr,"*** copy %p %s = %p\n", name, ObjStr(name), result); */ } /* if we find a % in the autoname -> We use Tcl_FormatObjCmd to let the autoname string be formated, like Tcl "format" command, with the value. E.g.: autoname a%06d --> a000000, a000001, a000002, ... */ for (c = ObjStr(result); *c != '\0'; c++) { if (*c == '%') { if (*(c+1) != '%') { format = 1; break; } else { /* when we find a %% we format and then append autoname, e.g. autoname a%% --> a%1, a%2, ... */ c++; } } } if (format) { Tcl_Obj *savedResult; ALLOC_ON_STACK(Tcl_Obj*, 3, ov); savedResult = Tcl_GetObjResult(interp); INCR_REF_COUNT(savedResult); ov[0] = XOTclGlobalObjects[XOTE_FORMAT]; ov[1] = result; ov[2] = valueObject; if (Tcl_EvalObjv(interp, 3, ov, 0) != TCL_OK) { XOTcl_PopFrame(interp, obj); DECR_REF_COUNT(savedResult); FREE_ON_STACK(Tcl_Obj *, ov); return 0; } DECR_REF_COUNT(result); result = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); INCR_REF_COUNT(result); Tcl_SetObjResult(interp, savedResult); DECR_REF_COUNT(savedResult); FREE_ON_STACK(Tcl_Obj *, ov); } else { char *valueString = Tcl_GetStringFromObj(valueObject,&valueLength); Tcl_AppendToObj(result, valueString, valueLength); /*fprintf(stderr,"+++ append to obj done\n");*/ } } XOTcl_PopFrame(interp, obj); assert((resetOpt && result->refCount>=1) || (result->refCount == 1)); return result; } /* * XOTcl CallStack */ XOTclCallStackContent * XOTclCallStackFindLastInvocation(Tcl_Interp *interp, int offset) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; register XOTclCallStackContent *csc = cs->top; int topLevel = csc->currentFramePtr ? Tcl_CallFrame_level(csc->currentFramePtr) : 0; int deeper = offset; /* skip through toplevel inactive filters, do this offset times */ for (csc=cs->top; csc > cs->content; csc--) { /* fprintf(stderr, "csc %p callType = %x, frameType = %x, offset=%d\n", csc,csc->callType,csc->frameType,offset); */ if ((csc->callType & XOTCL_CSC_CALL_IS_NEXT) || (csc->frameType & XOTCL_CSC_TYPE_INACTIVE)) continue; if (offset) offset--; else { /* fprintf(stderr, "csc %p offset ok, deeper=%d\n",csc,deeper); */ if (!deeper || cs->top->callType & XOTCL_CSC_CALL_IS_GUARD) { return csc; } if (csc->currentFramePtr && Tcl_CallFrame_level(csc->currentFramePtr) < topLevel) { return csc; } } } /* for some reasons, we could not find invocation (topLevel, destroy) */ /* fprintf(stderr, "csc %p could not find invocation\n",csc);*/ return NULL; } static XOTclCallStackContent * CallStackFindActiveFilter(Tcl_Interp *interp) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; register XOTclCallStackContent *csc; /* search for first active frame and set tcl frame pointers */ for (csc=cs->top; csc > cs->content; csc --) { if (csc->frameType == XOTCL_CSC_TYPE_ACTIVE_FILTER) return csc; } /* for some reasons, we could not find invocation (topLevel, destroy) */ return NULL; } XOTclCallStackContent * XOTclCallStackFindActiveFrame(Tcl_Interp *interp, int offset) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; register XOTclCallStackContent *csc; /* search for first active frame and set tcl frame pointers */ for (csc=cs->top-offset; csc > cs->content; csc --) { if (!(csc->frameType & XOTCL_CSC_TYPE_INACTIVE)) { /* we found the highest active frame */ return csc; } } /* we could not find an active frame; called from toplevel? */ return NULL; } static void CallStackUseActiveFrames(Tcl_Interp *interp, callFrameContext *ctx) { XOTclCallStackContent *active, *top = RUNTIME_STATE(interp)->cs.top; Tcl_CallFrame *inFramePtr = (Tcl_CallFrame *) Tcl_Interp_varFramePtr(interp); active = XOTclCallStackFindActiveFrame(interp, 0); /*fprintf(stderr,"active %p, varFrame(interp) %p, topVarFrame %p, active->curr %p\n", active, inFramePtr, top->currentFramePtr, active? active->currentFramePtr : NULL);*/ if (active == top || inFramePtr == NULL || Tcl_CallFrame_level(inFramePtr) == 0) { /* top frame is a active frame, or we could not find a calling frame, call frame pointers are fine */ ctx->framesSaved = 0; } else if (active == NULL) { Tcl_CallFrame *cf = inFramePtr; /*fprintf(stderr,"active == NULL\n"); */ /* find a proc frame, which is not equal the top level cmd */ /* XOTclStackDump(interp);*/ for (; cf && Tcl_CallFrame_level(cf); cf = Tcl_CallFrame_callerPtr(cf)) { if (Tcl_CallFrame_isProcCallFrame(cf) && cf != top->currentFramePtr) break; } ctx->varFramePtr = inFramePtr; Tcl_Interp_varFramePtr(interp) = (CallFrame *) cf; ctx->framesSaved = 1; } else { Tcl_CallFrame *framePtr; /*fprintf(stderr,"active == deeper active=%p frame %p, active+1 %p frame %p\n", active, active->currentFramePtr, active+1, (active+1)->currentFramePtr);*/ /* search returned a deeper pointer, use stored tcl frame pointers; If Tcl is mixed with XOTcl it is needed to use instead of active->currentFrame the callerPtr of the last inactive frame unless the last inactive is NULL */ if ((framePtr = (active+1)->currentFramePtr)) framePtr = Tcl_CallFrame_callerPtr(framePtr); else framePtr = active->currentFramePtr; ctx->varFramePtr = inFramePtr; Tcl_Interp_varFramePtr(interp) = (CallFrame *) framePtr; ctx->framesSaved = 1; } } static void CallStackRestoreSavedFrames(Tcl_Interp *interp, callFrameContext *ctx) { if (ctx->framesSaved) { Tcl_Interp_varFramePtr(interp) = (CallFrame *)ctx->varFramePtr; /*RUNTIME_STATE(interp)->varFramePtr = ctx->varFramePtr;*/ } } XOTCLINLINE static int CallStackPush(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cl, Tcl_Command cmd, int objc, Tcl_Obj *CONST objv[], int frameType) { XOTclCallStack *cs; register XOTclCallStackContent *csc; cs = &RUNTIME_STATE(interp)->cs; if (cs->top >= &cs->content[MAX_NESTING_DEPTH-1]) { Tcl_SetResult(interp, "too many nested calls to Tcl_EvalObj (infinite loop?)", TCL_STATIC); return TCL_ERROR; } /*fprintf(stderr, "CallStackPush sets self\n");*/ csc = ++cs->top; csc->self = obj; csc->cl = cl; csc->cmdPtr = cmd; csc->destroyedCmd = NULL; csc->frameType = frameType; csc->callType = 0; csc->currentFramePtr = NULL; /* this will be set by InitProcNSCmd */ if (frameType == XOTCL_CSC_TYPE_ACTIVE_FILTER) csc->filterStackEntry = obj->filterStack; else csc->filterStackEntry = NULL; /*fprintf(stderr, "PUSH obj %s, self=%p cmd=%p (%s) id=%p (%s) frame=%p\n", ObjStr(obj->cmdName), obj, cmd, (char *) Tcl_GetCommandName(interp, cmd), obj->id, Tcl_GetCommandName(interp, obj->id), csc);*/ MEM_COUNT_ALLOC("CallStack", NULL); return TCL_OK; } XOTCLINLINE static void CallStackDoDestroy(Tcl_Interp *interp, XOTclObject *obj) { Tcl_Command oid; PRINTOBJ("CallStackDoDestroy", obj); oid = obj->id; obj->id = NULL; if (obj->teardown && oid) { Tcl_DeleteCommandFromToken(interp, oid); } } static void CallStackDestroyObject(Tcl_Interp *interp, XOTclObject *obj) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc; int countSelfs = 0; Tcl_Command oid = obj->id; for (csc = &cs->content[1]; csc <= cs->top; csc++) { if (csc->self == obj) { csc->destroyedCmd = oid; csc->callType |= XOTCL_CSC_CALL_IS_DESTROY; /*fprintf(stderr,"setting destroy on frame %p for obj %p\n", csc, obj);*/ if (csc->destroyedCmd) { Tcl_Command_refCount(csc->destroyedCmd)++; MEM_COUNT_ALLOC("command refCount", csc->destroyedCmd); } countSelfs++; } } /* if the object is not referenced at the callstack anymore we have to directly destroy it, because CallStackPop won't find the object destroy */ if (countSelfs == 0) { /*fprintf(stderr,"directdestroy %p\n", obj);*/ CallStackDoDestroy(interp, obj); } else { /*fprintf(stderr,"selfcount for %p = %d\n", obj, countSelfs);*/ /* to prevail the deletion order call delete children now -> children destructors are called before parent's destructor */ if (obj->teardown && obj->nsPtr) { NSDeleteChildren(interp, obj->nsPtr); } } } XOTCLINLINE static int CallStackIsDestroyed(Tcl_Interp *interp) { return (RUNTIME_STATE(interp)->cs.top->destroyedCmd == NULL) ? 0 : 1; } XOTCLINLINE static void CallStackPop(Tcl_Interp *interp) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc; XOTclCallStackContent *h = cs->top; assert(cs->top > cs->content); csc = cs->top; /*fprintf(stderr, "POP frame=%p\n", csc);*/ if (csc->destroyedCmd) { int destroy = 1; TclCleanupCommand((Command *)csc->destroyedCmd); MEM_COUNT_FREE("command refCount", csc->destroyedCmd); /* do not physically destroy, when callstack still contains "self" entries of the object */ while (--h > cs->content) { if (h->self == csc->self) { destroy = 0; break; } } if (destroy) { CallStackDoDestroy(interp, csc->self); } } cs->top--; MEM_COUNT_FREE("CallStack", NULL); } XOTCLINLINE static XOTclCallStackContent* CallStackGetTopFrame(Tcl_Interp *interp) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; return cs->top; } static XOTclCallStackContent* CallStackGetFrame(Tcl_Interp *interp) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; register XOTclCallStackContent *top = cs->top; Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); /* fprintf(stderr, "Tcl_Interp_framePtr(interp) %p != varFramePtr %p && top->currentFramePtr %p\n", Tcl_Interp_framePtr(interp), varFramePtr, top->currentFramePtr);*/ if (Tcl_Interp_framePtr(interp) != varFramePtr && top->currentFramePtr) { XOTclCallStackContent *bot = cs->content + 1; /*fprintf(stderr, "uplevel\n");*/ /* we are in a uplevel */ while (varFramePtr != top->currentFramePtr && top>bot) { top--; } } return top; } /* * cmd list handling */ /* * Cmd List Add/Remove ... returns the new element */ static XOTclCmdList* CmdListAdd(XOTclCmdList **cList, Tcl_Command c, XOTclClass *clorobj, int noDuplicates) { XOTclCmdList *l = *cList, *new; /* * check for duplicates, if necessary */ if (noDuplicates) { XOTclCmdList *h = l, **end = NULL; while (h) { if (h->cmdPtr == c) return h; end = &(h->next); h = h->next; } if (end) { /* no duplicates, no need to search below, we are at the end of the list */ cList = end; l = NULL; } } /* * ok, we have no duplicates -> append "new" * to the end of the list */ new = NEW(XOTclCmdList); new->cmdPtr = c; Tcl_Command_refCount(new->cmdPtr)++; MEM_COUNT_ALLOC("command refCount", new->cmdPtr); new->clientData = NULL; new->clorobj = clorobj; new->next = NULL; if (l) { while (l->next) l = l->next; l->next = new; } else *cList = new; return new; } static void CmdListReplaceCmd(XOTclCmdList *replace, Tcl_Command cmd, XOTclClass *clorobj) { Tcl_Command del = replace->cmdPtr; replace->cmdPtr = cmd; replace->clorobj = clorobj; Tcl_Command_refCount(cmd)++; MEM_COUNT_ALLOC("command refCount", cmd); TclCleanupCommand((Command *)del); MEM_COUNT_FREE("command refCount", cmd); } #if 0 /** for debug purposes only */ static void CmdListPrint(Tcl_Interp *interp, char *title, XOTclCmdList *cmdList) { if (cmdList) fprintf(stderr, title); while (cmdList) { fprintf(stderr, " CL=%p, cmdPtr=%p %s, clorobj %p, clientData=%p\n", cmdList, cmdList->cmdPtr, in ? Tcl_GetCommandName(interp, cmdList->cmdPtr) : "", cmdList->clorobj, cmdList->clientData); cmdList = cmdList->next; } } #endif /* * physically delete an entry 'del' */ static void CmdListDeleteCmdListEntry(XOTclCmdList *del, XOTclFreeCmdListClientData *freeFct) { if (freeFct) (*freeFct)(del); MEM_COUNT_FREE("command refCount", del->cmdPtr); TclCleanupCommand((Command *)del->cmdPtr); FREE(XOTclCmdList, del); } /* * remove a command 'delCL' from a command list, but do not * free it ... returns the removed XOTclCmdList* */ static XOTclCmdList* CmdListRemoveFromList(XOTclCmdList **cmdList, XOTclCmdList *delCL) { register XOTclCmdList *c = *cmdList, *del = NULL; if (c == NULL) return NULL; if (c == delCL) { *cmdList = c->next; del = c; } else { while (c->next && c->next != delCL) { c = c->next; } if (c->next == delCL) { del = delCL; c->next = delCL->next; } } return del; } /* * remove all command pointers from a list that have a bumped epoch */ static void CmdListRemoveEpoched(XOTclCmdList **cmdList, XOTclFreeCmdListClientData *freeFct) { XOTclCmdList *f = *cmdList; while (f) { if (Tcl_Command_cmdEpoch(f->cmdPtr)) { XOTclCmdList *del = f; f = f->next; del = CmdListRemoveFromList(cmdList, del); CmdListDeleteCmdListEntry(del, freeFct); } else f = f->next; } } /* * delete all cmds with given context class object */ static void CmdListRemoveContextClassFromList(XOTclCmdList **cmdList, XOTclClass *clorobj, XOTclFreeCmdListClientData *freeFct) { XOTclCmdList *c; /* CmdListRemoveEpoched(cmdList, freeFct); */ c = *cmdList; while (c && c->clorobj == clorobj) { XOTclCmdList *del = c; *cmdList = c->next; CmdListDeleteCmdListEntry(del, freeFct); c = *cmdList; } while (c) { if (c->clorobj == clorobj) { XOTclCmdList *del = c; c = *cmdList; while (c->next && c->next != del) c = c->next; if (c->next == del) c->next = del->next; CmdListDeleteCmdListEntry(del, freeFct); } c = c->next; } } /* * free the memory of a whole 'cmdList' */ static void CmdListRemoveList(XOTclCmdList **cmdList, XOTclFreeCmdListClientData *freeFct) { while (*cmdList) { XOTclCmdList *del = *cmdList; *cmdList = (*cmdList)->next; CmdListDeleteCmdListEntry(del, freeFct); } } /* * simple list search proc to search a list of cmds * for a command ptr */ static XOTclCmdList* CmdListFindCmdInList(Tcl_Command cmd, XOTclCmdList *l) { register XOTclCmdList *h; for (h = l; h; h = h->next) { if (h->cmdPtr == cmd) return h; } return 0; } /* * simple list search proc to search a list of cmds * for a simple Name */ static XOTclCmdList* CmdListFindNameInList(Tcl_Interp *interp, char *name, XOTclCmdList *l) { register XOTclCmdList *h; for (h = l; h; h = h->next) { CONST84 char *cmdName = Tcl_GetCommandName(interp, h->cmdPtr); if (cmdName[0] == name[0] && !strcmp(cmdName, name)) return h; } return 0; } /* * Assertions */ static XOTclTclObjList* AssertionNewList(Tcl_Interp *interp, Tcl_Obj *aObj) { Tcl_Obj **ov; int oc; XOTclTclObjList *last = NULL; if (Tcl_ListObjGetElements(interp, aObj, &oc, &ov) == TCL_OK) { if (oc > 0) { int i; for (i=oc-1; i>=0; i--) { TclObjListNewElement(&last, ov[i]); } } } return last; } static Tcl_Obj* AssertionList(Tcl_Interp *interp, XOTclTclObjList *alist) { Tcl_Obj *newAssStr = Tcl_NewStringObj("", 0); for (; alist; alist = alist->next) { Tcl_AppendStringsToObj(newAssStr, "{", ObjStr(alist->content), "}", (char *) NULL); if (alist->next) Tcl_AppendStringsToObj(newAssStr, " ", (char *) NULL); } return newAssStr; } /* append a string of pre and post assertions to a proc or instproc body */ static void AssertionAppendPrePost(Tcl_Interp *interp, Tcl_DString *dsPtr, XOTclProcAssertion *procs) { if (procs) { Tcl_Obj *preAss = AssertionList(interp, procs->pre); Tcl_Obj *postAss = AssertionList(interp, procs->post); INCR_REF_COUNT(preAss); INCR_REF_COUNT(postAss); Tcl_DStringAppendElement(dsPtr, ObjStr(preAss)); Tcl_DStringAppendElement(dsPtr, ObjStr(postAss)); DECR_REF_COUNT(preAss); DECR_REF_COUNT(postAss); } } static int AssertionListCheckOption(Tcl_Interp *interp, XOTclObject *obj) { XOTclObjectOpt *opt = obj->opt; if (!opt) return TCL_OK; if (opt->checkoptions & CHECK_OBJINVAR) Tcl_AppendElement(interp, "invar"); if (opt->checkoptions & CHECK_CLINVAR) Tcl_AppendElement(interp, "instinvar"); if (opt->checkoptions & CHECK_PRE) Tcl_AppendElement(interp, "pre"); if (opt->checkoptions & CHECK_POST) Tcl_AppendElement(interp, "post"); return TCL_OK; } static XOTclProcAssertion* AssertionFindProcs(XOTclAssertionStore *aStore, char *name) { Tcl_HashEntry *hPtr; if (aStore == NULL) return NULL; hPtr = XOTcl_FindHashEntry(&aStore->procs, name); if (hPtr == NULL) return NULL; return (XOTclProcAssertion*) Tcl_GetHashValue(hPtr); } static void AssertionRemoveProc(XOTclAssertionStore *aStore, char *name) { if (aStore) { Tcl_HashEntry *hPtr = XOTcl_FindHashEntry(&aStore->procs, name); if (hPtr) { XOTclProcAssertion *procAss = (XOTclProcAssertion*) Tcl_GetHashValue(hPtr); TclObjListFreeList(procAss->pre); TclObjListFreeList(procAss->post); FREE(XOTclProcAssertion, procAss); Tcl_DeleteHashEntry(hPtr); } } } static void AssertionAddProc(Tcl_Interp *interp, char *name, XOTclAssertionStore *aStore, Tcl_Obj *pre, Tcl_Obj *post) { int nw = 0; Tcl_HashEntry *hPtr = NULL; XOTclProcAssertion *procs = NEW(XOTclProcAssertion); AssertionRemoveProc(aStore, name); procs->pre = AssertionNewList(interp, pre); procs->post = AssertionNewList(interp, post); hPtr = Tcl_CreateHashEntry(&aStore->procs, name, &nw); if (nw) Tcl_SetHashValue(hPtr, (ClientData)procs); } static XOTclAssertionStore* AssertionCreateStore() { XOTclAssertionStore *aStore = NEW(XOTclAssertionStore); aStore->invariants = NULL; Tcl_InitHashTable(&aStore->procs, TCL_STRING_KEYS); MEM_COUNT_ALLOC("Tcl_InitHashTable",&aStore->procs); return aStore; } static void AssertionRemoveStore(XOTclAssertionStore *aStore) { Tcl_HashSearch hSrch; if (aStore) { Tcl_HashEntry *hPtr; for (hPtr = Tcl_FirstHashEntry(&aStore->procs, &hSrch); hPtr; hPtr = Tcl_FirstHashEntry(&aStore->procs, &hSrch)) { /* * AssertionRemoveProc calls Tcl_DeleteHashEntry(hPtr), thus * we get the FirstHashEntry afterwards again to proceed */ AssertionRemoveProc(aStore, Tcl_GetHashKey(&aStore->procs, hPtr)); } Tcl_DeleteHashTable(&aStore->procs); MEM_COUNT_FREE("Tcl_InitHashTable",&aStore->procs); TclObjListFreeList(aStore->invariants); FREE(XOTclAssertionStore, aStore); } } /* * check a given condition in the current callframe's scope * it's the responsiblity of the caller to push the intended callframe */ static int checkConditionInScope(Tcl_Interp *interp, Tcl_Obj *condition) { int result, success; Tcl_Obj *ov[2]; ov [1] = condition; INCR_REF_COUNT(condition); result = XOTcl_ExprObjCmd(NULL, interp, 2, ov); DECR_REF_COUNT(condition); if (result == TCL_OK) { result = Tcl_GetBooleanFromObj(interp, Tcl_GetObjResult(interp),&success); if (result == TCL_OK && success == 0) result = XOTCL_CHECK_FAILED; } return result; } static int AssertionCheckList(Tcl_Interp *interp, XOTclObject *obj, XOTclTclObjList *alist, char *methodName) { XOTclTclObjList *checkFailed = NULL; Tcl_Obj *savedObjResult = Tcl_GetObjResult(interp); int savedCheckoptions, acResult = TCL_OK; /* * no obj->opt -> checkoption == CHECK_NONE */ if (!obj->opt) return TCL_OK; /* we do not check assertion modifying methods, otherwise we can not react in catch on a runtime assertion check failure */ if (isCheckString(methodName) || isInfoString(methodName) || isInvarString(methodName) || isInstinvarString(methodName) || isProcString(methodName) || isInstprocString(methodName)) return TCL_OK; INCR_REF_COUNT(savedObjResult); Tcl_ResetResult(interp); while (alist) { /* Eval instead of IfObjCmd => the substitutions in the conditions will be done by Tcl */ char *assStr = ObjStr(alist->content), *c = assStr; int comment = 0; for (; c && *c != '\0'; c++) { if (*c == '#') { comment = 1; break; } } if (!comment) { XOTcl_FrameDecls; XOTcl_PushFrame(interp, obj); CallStackPush(interp, obj, 0, 0, 0, 0, XOTCL_CSC_TYPE_PLAIN); /* don't check assertion during assertion check */ savedCheckoptions = obj->opt->checkoptions; obj->opt->checkoptions = CHECK_NONE; /* fprintf(stderr, "Checking Assertion %s ", assStr); */ /* * now check the assertion in the pushed callframe's scope */ acResult = checkConditionInScope(interp, alist->content); if (acResult != TCL_OK) checkFailed = alist; obj->opt->checkoptions = savedCheckoptions; /* fprintf(stderr, "...%s\n", checkFailed ? "failed" : "ok"); */ CallStackPop(interp); XOTcl_PopFrame(interp, obj); } if (checkFailed) break; alist = alist->next; } if (checkFailed) { DECR_REF_COUNT(savedObjResult); if (acResult == TCL_ERROR) { Tcl_Obj *sr = Tcl_GetObjResult(interp); INCR_REF_COUNT(sr); XOTclVarErrMsg(interp, "Error in Assertion: {", ObjStr(checkFailed->content), "} in proc '", GetSelfProc(interp), "'\n\n", ObjStr(sr), (char *) NULL); DECR_REF_COUNT(sr); return TCL_ERROR; } return XOTclVarErrMsg(interp, "Assertion failed check: {", ObjStr(checkFailed->content), "} in proc '", GetSelfProc(interp), "'", (char *) NULL); } Tcl_SetObjResult(interp, savedObjResult); DECR_REF_COUNT(savedObjResult); return TCL_OK; } static int AssertionCheckInvars(Tcl_Interp *interp, XOTclObject *obj, char *method, CheckOptions checkoptions) { int result = TCL_OK; if (checkoptions & CHECK_OBJINVAR && obj->opt->assertions) { result = AssertionCheckList(interp, obj, obj->opt->assertions->invariants, method); } if (result != TCL_ERROR && checkoptions & CHECK_CLINVAR) { XOTclClasses *clPtr; clPtr = ComputeOrder(obj->cl, obj->cl->order, Super); while (clPtr && result != TCL_ERROR) { XOTclAssertionStore *aStore = (clPtr->cl->opt) ? clPtr->cl->opt->assertions : 0; if (aStore) { result = AssertionCheckList(interp, obj, aStore->invariants, method); } clPtr = clPtr->next; } } return result; } static int AssertionCheck(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cl, char *method, int checkOption) { int result = TCL_OK; XOTclAssertionStore *aStore; if (cl) aStore = cl->opt ? cl->opt->assertions : 0; else aStore = obj->opt ? obj->opt->assertions : 0; assert(obj->opt); if (checkOption & obj->opt->checkoptions) { XOTclProcAssertion *procs = AssertionFindProcs(aStore, method); if (procs) { switch (checkOption) { case CHECK_PRE: result = AssertionCheckList(interp, obj, procs->pre, method); break; case CHECK_POST: result = AssertionCheckList(interp, obj, procs->post, method); break; } } if (result != TCL_ERROR) result = AssertionCheckInvars(interp, obj, method, obj->opt->checkoptions); } return result; } /* * Per-Object-Mixins */ /* * push a mixin stack information on this object */ static int MixinStackPush(XOTclObject *obj) { register XOTclMixinStack *h = NEW(XOTclMixinStack); h->currentCmdPtr = NULL; h->next = obj->mixinStack; obj->mixinStack = h; return 1; } /* * pop a mixin stack information on this object */ static void MixinStackPop(XOTclObject *obj) { register XOTclMixinStack *h = obj->mixinStack; obj->mixinStack = h->next; FREE(XOTclMixinStack, h); } /* * Appends XOTclClasses *containing the mixin classes and their * superclasses to 'mixinClasses' list from a given mixinList */ static void MixinComputeOrderFullList(Tcl_Interp *interp, XOTclCmdList **mixinList, XOTclClasses **mixinClasses, XOTclClasses **checkList, int level) { XOTclCmdList *m; XOTclClasses *pl, **clPtr = mixinClasses; CmdListRemoveEpoched(mixinList, GuardDel); for (m = *mixinList; m; m = m->next) { XOTclClass *mCl = XOTclGetClassFromCmdPtr(m->cmdPtr); if (mCl) { for (pl = ComputeOrder(mCl, mCl->order, Super); pl; pl = pl->next) { /*fprintf(stderr, " %s, ", ObjStr(pl->cl->object.cmdName));*/ if (pl->cl != RUNTIME_STATE(interp)->theObject) { XOTclClassOpt *opt = pl->cl->opt; if (opt && opt->instmixins) { /* compute transitively the instmixin classes of this added class */ XOTclClasses *cls; int i, found = 0; for (i=0, cls = *checkList; cls; i++, cls = cls->next) { /* fprintf(stderr,"+++ c%d: %s\n", i, ObjStr(cls->cl->object.cmdName));*/ if (pl->cl == cls->cl) { found = 1; break; } } if (!found) { XOTclAddClass(checkList, pl->cl, NULL); /*fprintf(stderr, "+++ transitive %s\n", ObjStr(pl->cl->object.cmdName));*/ MixinComputeOrderFullList(interp, &opt->instmixins, mixinClasses, checkList, level+1); } } /* fprintf(stderr,"+++ add to mixinClasses %p path: %s clPtr %p\n", mixinClasses, ObjStr(pl->cl->object.cmdName), clPtr);*/ clPtr = XOTclAddClass(clPtr, pl->cl, m->clientData); } } } } if (level == 0 && *checkList) { XOTclFreeClasses(*checkList); *checkList = NULL; } } static void MixinResetOrder(XOTclObject *obj) { /*fprintf(stderr,"removeList %s \n", ObjStr(obj->cmdName));*/ CmdListRemoveList(&obj->mixinOrder, NULL /*GuardDel*/); obj->mixinOrder = NULL; } /* * Computes a linearized order of per-object and per-class mixins. Then * duplicates in the full list and with the class inheritance list of * 'obj' are eliminated. * The precendence rule is that the last occurence makes it into the * final list. */ static void MixinComputeOrder(Tcl_Interp *interp, XOTclObject *obj) { XOTclClasses *fullList, *checkList = NULL, *mixinClasses = NULL, *nextCl, *pl, *checker, *guardChecker; if (obj->mixinOrder) MixinResetOrder(obj); /*fprintf(stderr, "Mixin Order:\n First List: ");*/ /* append per-obj mixins */ if (obj->opt) { MixinComputeOrderFullList(interp, &obj->opt->mixins, &mixinClasses, &checkList, 0); } /* append per-class mixins */ for (pl = ComputeOrder(obj->cl, obj->cl->order, Super); pl; pl = pl->next) { XOTclClassOpt *opt = pl->cl->opt; if (opt && opt->instmixins) { MixinComputeOrderFullList(interp, &opt->instmixins, &mixinClasses, &checkList, 0); } } fullList = mixinClasses; /* use no duplicates & no classes of the precedence order on the resulting list */ while (mixinClasses) { checker = nextCl = mixinClasses->next; /* fprintf(stderr,"--- checking %s\n", ObjStr(mixinClasses->cl->object.cmdName));*/ while (checker) { if (checker->cl == mixinClasses->cl) break; checker = checker->next; } /* if checker is set, it is a duplicate and ignored */ if (checker == NULL) { /* check obj->cl hierachy */ for (checker = ComputeOrder(obj->cl, obj->cl->order, Super); checker; checker = checker->next) { if (checker->cl == mixinClasses->cl) break; } /* if checker is set, it was found in the class hierarchy and it is ignored */ } if (checker == NULL) { /* add the class to the mixinOrder list */ XOTclCmdList *new; /* fprintf(stderr,"--- adding to mixinlist %s\n", ObjStr(mixinClasses->cl->object.cmdName));*/ new = CmdListAdd(&obj->mixinOrder, mixinClasses->cl->object.id, NULL, /*noDuplicates*/ 0); /* in the client data of the order list, we require the first matching guard ... scan the full list for it. */ for (guardChecker = fullList; guardChecker; guardChecker = guardChecker->next) { if (guardChecker->cl == mixinClasses->cl) { new->clientData = guardChecker->clientData; break; } } } mixinClasses = nextCl; } /* ... and free the memory of the full list */ XOTclFreeClasses(fullList); /*CmdListPrint(interp,"mixin order\n", obj->mixinOrder);*/ } /* * add a mixin class to 'mixinList' by appending it */ static int MixinAdd(Tcl_Interp *interp, XOTclCmdList **mixinList, Tcl_Obj *name) { XOTclClass *mixin; Tcl_Obj *guard = NULL; int ocName; Tcl_Obj **ovName; XOTclCmdList *new; if (Tcl_ListObjGetElements(interp, name, &ocName, &ovName) == TCL_OK && ocName > 1) { if (ocName == 3 && !strcmp(ObjStr(ovName[1]), XOTclGlobalStrings[XOTE_GUARD_OPTION])) { name = ovName[0]; guard = ovName[2]; /*fprintf(stderr,"mixinadd name = '%s', guard = '%s'\n", ObjStr(name), ObjStr(guard));*/ } /*else return XOTclVarErrMsg(interp, "mixin registration '", ObjStr(name), "' has too many elements.", (char *) NULL);*/ } if (GetXOTclClassFromObj(interp, name, &mixin, 1) != TCL_OK) { char *errorString = ObjStr(Tcl_GetObjResult(interp)); if (*errorString == '\0') { XOTclErrBadVal(interp, "mixin", "a class as mixin", ObjStr(name)); } return TCL_ERROR; } new = CmdListAdd(mixinList, mixin->object.id, NULL, /*noDuplicates*/ 1); if (guard) { GuardAdd(interp, new, guard); } else { if (new->clientData) GuardDel(new); } return TCL_OK; } /* * call AppendElement for matching values */ static void AppendMatchingElement(Tcl_Interp *interp, Tcl_Obj *name, char *pattern) { char *string = ObjStr(name); if (!pattern || Tcl_StringMatch(string, pattern)) { Tcl_AppendElement(interp, string); } } /* * apply AppendMatchingElement to CmdList */ static int AppendMatchingElementsFromCmdList(Tcl_Interp *interp, XOTclCmdList *cmdl, char *pattern, XOTclObject *matchObject) { int rc = 0; for ( ; cmdl; cmdl = cmdl->next) { XOTclObject *obj = XOTclGetObjectFromCmdPtr(cmdl->cmdPtr); if (obj) { if (matchObject == obj) { return 1; } else { AppendMatchingElement(interp, obj->cmdName, pattern); } } } return rc; } /* * apply AppendMatchingElement to */ static int AppendMatchingElementsFromClasses(Tcl_Interp *interp, XOTclClasses *cls, char *pattern, XOTclObject *matchObject) { int rc = 0; for ( ; cls; cls = cls->next) { XOTclObject *obj = (XOTclObject *)cls->cl; if (obj) { if (matchObject && obj == matchObject) { /* we have a matchObject and it is identical to obj, just return true and don't continue search */ return 1; } else { AppendMatchingElement(interp, obj->cmdName, pattern); } } } return rc; } /* * get all instances of a class recursively into an initialized * String key hashtable */ static int listInstances(Tcl_Interp *interp, XOTclClass *startCl, char *pattern, int closure, XOTclObject *matchObject) { Tcl_HashTable *table = &startCl->instances; XOTclClasses *sc; Tcl_HashSearch search; Tcl_HashEntry *hPtr; int rc = 0; for (hPtr = Tcl_FirstHashEntry(table, &search); hPtr; hPtr = Tcl_NextHashEntry(&search)) { XOTclObject *inst = (XOTclObject*) Tcl_GetHashKey(table, hPtr); if (matchObject && inst == matchObject) { return 1; } AppendMatchingElement(interp, inst->cmdName, pattern); } if (closure) { for (sc = startCl->sub; sc; sc = sc->next) { rc = listInstances(interp, sc->cl, pattern, closure, matchObject); if (rc) break; } } return rc; } /* * get all instances of a class recursively into an initialized * String key hashtable */ static void getAllInstances(Tcl_Interp *interp, Tcl_HashTable *destTable, XOTclClass *startCl) { Tcl_HashTable *table = &startCl->instances; XOTclClasses *sc; Tcl_HashSearch search; Tcl_HashEntry *hPtr; for (hPtr = Tcl_FirstHashEntry(table, &search); hPtr; hPtr = Tcl_NextHashEntry(&search)) { XOTclObject *inst = (XOTclObject *)Tcl_GetHashKey(table, hPtr); int new; Tcl_CreateHashEntry(destTable, ObjStr(inst->cmdName), &new); /* fprintf (stderr, " -- %s (%s)\n", ObjStr(inst->cmdName), ObjStr(startCl->object.cmdName)); */ } for (sc = startCl->sub; sc; sc = sc->next) { getAllInstances(interp, destTable, sc->cl); } } /* * helper function for getAllClassMixinsOf to add classes to the * result set, flagging test for matchObject as result */ static int addToResultSet(Tcl_Interp *interp, Tcl_HashTable *destTable, XOTclObject *obj, int *new, int appendResult, char *pattern, XOTclObject *matchObject) { Tcl_CreateHashEntry(destTable, (char *)obj, new); if (*new) { if (matchObject && matchObject == obj) { return 1; } if (appendResult) { AppendMatchingElement(interp, obj->cmdName, pattern); } } return 0; } /* * helper function for getAllClassMixins to add classes with guards * to the result set, flagging test for matchObject as result */ static int addToResultSetWithGuards(Tcl_Interp *interp, Tcl_HashTable *destTable, XOTclClass *cl, ClientData clientData, int *new, int appendResult, char *pattern, XOTclObject *matchObject) { Tcl_CreateHashEntry(destTable, (char *)cl, new); if (*new) { if (appendResult) { if (!pattern || Tcl_StringMatch(ObjStr(cl->object.cmdName), pattern)) { Tcl_Obj *l = Tcl_NewListObj(0, NULL); Tcl_Obj *g = (Tcl_Obj*) clientData; Tcl_ListObjAppendElement(interp, l, cl->object.cmdName); Tcl_ListObjAppendElement(interp, l, XOTclGlobalObjects[XOTE_GUARD_OPTION]); Tcl_ListObjAppendElement(interp, l, g); Tcl_AppendElement(interp, ObjStr(l)); DECR_REF_COUNT(l); } } if (matchObject && matchObject == (XOTclObject *)cl) { return 1; } } return 0; } /* * recursively get all per object mixins from an class and its subclasses/instmixinofs * into an initialized object ptr hashtable (TCL_ONE_WORD_KEYS) */ static int getAllObjectMixinsOf(Tcl_Interp *interp, Tcl_HashTable *destTable, XOTclClass *startCl, int isMixin, int appendResult, char *pattern, XOTclObject *matchObject) { int rc = 0, new = 0; XOTclClasses *sc; /*fprintf(stderr, "startCl = %s, opt %p, isMixin %d\n", ObjStr(startCl->object.cmdName),startCl->opt, isMixin);*/ /* * check all subclasses of startCl for mixins */ for (sc = startCl->sub; sc; sc = sc->next) { rc = getAllObjectMixinsOf(interp, destTable, sc->cl, isMixin, appendResult, pattern, matchObject); if (rc) {return rc;} } /*fprintf(stderr, "check subclasses of %s done\n",ObjStr(startCl->object.cmdName));*/ if (startCl->opt) { XOTclCmdList *m; for (m = startCl->opt->isClassMixinOf; m; m = m->next) { XOTclClass *cl; /* we should have no deleted commands in the list */ assert(Tcl_Command_cmdEpoch(m->cmdPtr) == 0); cl = XOTclGetClassFromCmdPtr(m->cmdPtr); assert(cl); /* fprintf(stderr, "check %s mixinof %s\n", ObjStr(cl->object.cmdName),ObjStr(startCl->object.cmdName));*/ rc = getAllObjectMixinsOf(interp, destTable, cl, isMixin, appendResult, pattern, matchObject); /*fprintf(stderr, "check %s mixinof %s done\n", ObjStr(cl->object.cmdName),ObjStr(startCl->object.cmdName));*/ if (rc) {return rc;} } } /* * check, if startCl has associated per-object mixins */ if (startCl->opt) { XOTclCmdList *m; for (m = startCl->opt->isObjectMixinOf; m; m = m->next) { XOTclObject *obj; /* we should have no deleted commands in the list */ assert(Tcl_Command_cmdEpoch(m->cmdPtr) == 0); obj = XOTclGetObjectFromCmdPtr(m->cmdPtr); assert(obj); rc = addToResultSet(interp, destTable, obj, &new, appendResult, pattern, matchObject); if (rc == 1) {return rc;} } } return rc; } /* * recursively get all isClassMixinOf of a class into an initialized * object ptr hashtable (TCL_ONE_WORD_KEYS) */ static int getAllClassMixinsOf(Tcl_Interp *interp, Tcl_HashTable *destTable, XOTclClass *startCl, int isMixin, int appendResult, char *pattern, XOTclObject *matchObject) { int rc = 0, new = 0; XOTclClass *cl; XOTclClasses *sc; /* fprintf(stderr, "startCl = %s, opt %p, isMixin %d\n", ObjStr(startCl->object.cmdName),startCl->opt, isMixin); */ /* * the startCl is a per class mixin, add it to the result set */ if (isMixin) { rc = addToResultSet(interp, destTable, &startCl->object, &new, appendResult, pattern, matchObject); if (rc == 1) {return rc;} /* * check all subclasses of startCl for mixins */ for (sc = startCl->sub; sc; sc = sc->next) { rc = getAllClassMixinsOf(interp, destTable, sc->cl, isMixin, appendResult, pattern, matchObject); if (rc) {return rc;} } } /* * check, if startCl is a per-class mixin of some other classes */ if (startCl->opt) { XOTclCmdList *m; for (m = startCl->opt->isClassMixinOf; m; m = m->next) { /* we should have no deleted commands in the list */ assert(Tcl_Command_cmdEpoch(m->cmdPtr) == 0); cl = XOTclGetClassFromCmdPtr(m->cmdPtr); assert(cl); rc = addToResultSet(interp, destTable, &cl->object, &new, appendResult, pattern, matchObject); if (rc == 1) {return rc;} if (new) { rc = getAllClassMixinsOf(interp, destTable, cl, 1, appendResult, pattern, matchObject); if (rc) {return rc;} } } } return rc; } /* * recursively get all instmixins of a class into an initialized * object ptr hashtable (TCL_ONE_WORD_KEYS) */ static int getAllClassMixins(Tcl_Interp *interp, Tcl_HashTable *destTable, XOTclClass *startCl, int withGuards, char *pattern, XOTclObject *matchObject) { int rc = 0, new = 0; XOTclClass *cl; XOTclClasses *sc; /* * check this class for instmixins */ if (startCl->opt) { XOTclCmdList *m; for (m = startCl->opt->instmixins; m; m = m->next) { /* we should have no deleted commands in the list */ assert(Tcl_Command_cmdEpoch(m->cmdPtr) == 0); cl = XOTclGetClassFromCmdPtr(m->cmdPtr); assert(cl); /* fprintf(stderr,"Instmixin found: %s\n", ObjStr(cl->object.cmdName)); */ if ((withGuards) && (m->clientData)) { /* fprintf(stderr,"addToResultSetWithGuards: %s\n", ObjStr(cl->object.cmdName)); */ rc = addToResultSetWithGuards(interp, destTable, cl, m->clientData, &new, 1, pattern, matchObject); } else { /* fprintf(stderr,"addToResultSet: %s\n", ObjStr(cl->object.cmdName)); */ rc = addToResultSet(interp, destTable, &cl->object, &new, 1, pattern, matchObject); } if (rc == 1) {return rc;} if (new) { /* fprintf(stderr,"Instmixin getAllClassMixins for: %s (%s)\n",ObjStr(cl->object.cmdName),ObjStr(startCl->object.cmdName)); */ rc = getAllClassMixins(interp, destTable, cl, withGuards, pattern, matchObject); if (rc) {return rc;} } } } /* * check all superclasses of startCl for instmixins */ for (sc = startCl->super; sc; sc = sc->next) { /* fprintf(stderr,"Superclass getAllClassMixins for %s (%s)\n",ObjStr(sc->cl->object.cmdName),ObjStr(startCl->object.cmdName)); */ rc = getAllClassMixins(interp, destTable, sc->cl, withGuards, pattern, matchObject); if (rc) {return rc;} } return rc; } static void RemoveFromClassMixinsOf(Tcl_Command cmd, XOTclCmdList *cmdlist) { for ( ; cmdlist; cmdlist = cmdlist->next) { XOTclClass *ncl = XOTclGetClassFromCmdPtr(cmdlist->cmdPtr); XOTclClassOpt *nclopt = ncl ? ncl->opt : NULL; if (nclopt) { XOTclCmdList *del = CmdListFindCmdInList(cmd, nclopt->isClassMixinOf); if (del) { /* fprintf(stderr,"Removing class %s from isClassMixinOf of class %s\n", ObjStr(cl->object.cmdName), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ del = CmdListRemoveFromList(&nclopt->isClassMixinOf, del); CmdListDeleteCmdListEntry(del, GuardDel); } } } } static void removeFromObjectMixinsOf(Tcl_Command cmd, XOTclCmdList *cmdlist) { for ( ; cmdlist; cmdlist = cmdlist->next) { XOTclClass *cl = XOTclGetClassFromCmdPtr(cmdlist->cmdPtr); XOTclClassOpt *clopt = cl ? cl->opt : NULL; if (clopt) { XOTclCmdList *del = CmdListFindCmdInList(cmd, clopt->isObjectMixinOf); if (del) { /* fprintf(stderr,"Removing object %s from isObjectMixinOf of Class %s\n", ObjStr(obj->cmdName), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ del = CmdListRemoveFromList(&clopt->isObjectMixinOf, del); CmdListDeleteCmdListEntry(del, GuardDel); } } /* else fprintf(stderr,"CleanupDestroyObject %s: NULL pointer in mixins!\n", ObjStr(obj->cmdName)); */ } } static void RemoveFromInstmixins(Tcl_Command cmd, XOTclCmdList *cmdlist) { for ( ; cmdlist; cmdlist = cmdlist->next) { XOTclClass *cl = XOTclGetClassFromCmdPtr(cmdlist->cmdPtr); XOTclClassOpt *clopt = cl ? cl->opt : NULL; if (clopt) { XOTclCmdList *del = CmdListFindCmdInList(cmd, clopt->instmixins); if (del) { /* fprintf(stderr,"Removing class %s from mixins of object %s\n", ObjStr(cl->object.cmdName), ObjStr(XOTclGetObjectFromCmdPtr(cmdlist->cmdPtr)->cmdName)); */ del = CmdListRemoveFromList(&clopt->instmixins, del); CmdListDeleteCmdListEntry(del, GuardDel); if (cl->object.mixinOrder) MixinResetOrder(&cl->object); } } } } static void RemoveFromMixins(Tcl_Command cmd, XOTclCmdList *cmdlist) { for ( ; cmdlist; cmdlist = cmdlist->next) { XOTclObject *nobj = XOTclGetObjectFromCmdPtr(cmdlist->cmdPtr); XOTclObjectOpt *objopt = nobj ? nobj->opt : NULL; if (objopt) { XOTclCmdList *del = CmdListFindCmdInList(cmd, objopt->mixins); if (del) { /* fprintf(stderr,"Removing class %s from mixins of object %s\n", ObjStr(cl->object.cmdName), ObjStr(XOTclGetObjectFromCmdPtr(cmdlist->cmdPtr)->cmdName)); */ del = CmdListRemoveFromList(&objopt->mixins, del); CmdListDeleteCmdListEntry(del, GuardDel); if (nobj->mixinOrder) MixinResetOrder(nobj); } } } } /* * Reset mixin order for instances of a class */ static void MixinResetOrderForInstances(Tcl_Interp *interp, XOTclClass *cl) { Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; hPtr = Tcl_FirstHashEntry(&cl->instances, &hSrch); /*fprintf(stderr,"invalidating instances of class %s\n", ObjStr(clPtr->cl->object.cmdName));*/ /* here we should check, whether this class is used as a mixin / instmixin somewhere else and invalidate the objects of these as well -- */ for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { XOTclObject *obj = (XOTclObject *)Tcl_GetHashKey(&cl->instances, hPtr); if (obj && !(obj->flags & XOTCL_DESTROY_CALLED) && (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID)) { MixinResetOrder(obj); obj->flags &= ~XOTCL_MIXIN_ORDER_VALID; } } } /* reset mixin order for all objects having this class as per object mixin */ static void ResetOrderOfClassesUsedAsMixins(XOTclClass *cl) { /*fprintf(stderr,"ResetOrderOfClassesUsedAsMixins %s - %p\n", ObjStr(cl->object.cmdName), cl->opt);*/ if (cl->opt) { XOTclCmdList *ml; for (ml = cl->opt->isObjectMixinOf; ml; ml = ml->next) { XOTclObject *obj = XOTclGetObjectFromCmdPtr(ml->cmdPtr); if (obj) { if (obj->mixinOrder) { MixinResetOrder(obj); } obj->flags &= ~XOTCL_MIXIN_ORDER_VALID; } } } } /* * if the class hierarchy or class mixins have changed -> * invalidate mixin entries in all dependent instances */ static void MixinInvalidateObjOrders(Tcl_Interp *interp, XOTclClass *cl) { XOTclClasses *saved = cl->order, *clPtr; Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; Tcl_HashTable objTable, *commandTable = &objTable; cl->order = NULL; /* reset mixin order for all instances of the class and the instances of its subclasses */ for (clPtr = ComputeOrder(cl, cl->order, Sub); clPtr; clPtr = clPtr->next) { Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = &clPtr->cl->instances ? Tcl_FirstHashEntry(&clPtr->cl->instances, &hSrch) : NULL; /* reset mixin order for all objects having this class as per object mixin */ ResetOrderOfClassesUsedAsMixins(clPtr->cl); /* fprintf(stderr,"invalidating instances of class %s\n", ObjStr(clPtr->cl->object.cmdName)); */ for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { XOTclObject *obj = (XOTclObject *)Tcl_GetHashKey(&clPtr->cl->instances, hPtr); if (obj->mixinOrder) { MixinResetOrder(obj); } obj->flags &= ~XOTCL_MIXIN_ORDER_VALID; } } XOTclFreeClasses(cl->order); cl->order = saved; /* Reset mixin order for all objects having this class as a per class mixin (instmixin). This means that we have to work through the instmixin hierarchy with its corresponding instances. */ Tcl_InitHashTable(commandTable, TCL_ONE_WORD_KEYS); MEM_COUNT_ALLOC("Tcl_InitHashTable", commandTable); getAllClassMixinsOf(interp, commandTable, cl, 1, 0, NULL, NULL); for (hPtr = Tcl_FirstHashEntry(commandTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { XOTclClass *ncl = (XOTclClass *)Tcl_GetHashKey(commandTable, hPtr); /*fprintf(stderr,"Got %s, reset for ncl %p\n",ncl?ObjStr(ncl->object.cmdName):"NULL",ncl);*/ if (ncl) { MixinResetOrderForInstances(interp, ncl); } } Tcl_DeleteHashTable(commandTable); MEM_COUNT_FREE("Tcl_InitHashTable", commandTable); } static int MixinInfo(Tcl_Interp *interp, XOTclCmdList *m, char *pattern, int withGuards, XOTclObject *matchObject); /* * the mixin order is either * DEFINED (there are mixins on the instance), * NONE (there are no mixins for the instance), * or INVALID (a class re-strucuturing has occured, thus it is not clear * whether mixins are defined or not). * If it is INVALID MixinComputeDefined can be used to compute the order * and set the instance to DEFINE or NONE */ static void MixinComputeDefined(Tcl_Interp *interp, XOTclObject *obj) { MixinComputeOrder(interp, obj); obj->flags |= XOTCL_MIXIN_ORDER_VALID; if (obj->mixinOrder) obj->flags |= XOTCL_MIXIN_ORDER_DEFINED; else obj->flags &= ~XOTCL_MIXIN_ORDER_DEFINED; } /* * Walk through the command list until the current command is reached. * return the next entry. * */ static XOTclCmdList * seekCurrent(Tcl_Command currentCmd, register XOTclCmdList *cmdl) { if (currentCmd) { /* go forward to current class */ for (; cmdl; cmdl = cmdl->next) { if (cmdl->cmdPtr == currentCmd) { return cmdl->next; } } } return cmdl; } /* * before we can perform a mixin dispatch, MixinSearchProc seeks the * current mixin and the relevant calling information */ static Tcl_Command MixinSearchProc(Tcl_Interp *interp, XOTclObject *obj, char *methodName, XOTclClass **cl, Tcl_Command *currentCmdPtr) { Tcl_Command cmd = NULL; XOTclCmdList *cmdList; XOTclClass *cls; assert(obj); assert(obj->mixinStack); /* ensure that the mixin order is not invalid, otherwise compute order */ assert(obj->flags & XOTCL_MIXIN_ORDER_VALID); /*MixinComputeDefined(interp, obj);*/ cmdList = seekCurrent(obj->mixinStack->currentCmdPtr, obj->mixinOrder); #if defined(ACTIVEMIXIN) RUNTIME_STATE(interp)->cmdPtr = cmdList->cmdPtr; #endif /* fprintf(stderr, "MixinSearch searching for '%s' %p\n", methodName, cmdList); */ /*CmdListPrint(interp,"MixinSearch CL = \n", cmdList);*/ while (cmdList) { if (Tcl_Command_cmdEpoch(cmdList->cmdPtr)) { cmdList = cmdList->next; } else { cls = XOTclGetClassFromCmdPtr(cmdList->cmdPtr); /* fprintf(stderr,"+++ MixinSearch %s->%s in %p cmdPtr %p clientData %p\n", ObjStr(obj->cmdName), methodName, cmdList, cmdList->cmdPtr, cmdList->clientData); */ if (cls) { int guardOk = TCL_OK; cmd = FindMethod(methodName, cls->nsPtr); if (cmd && cmdList->clientData) { if (!RUNTIME_STATE(interp)->cs.guardCount) { guardOk = GuardCall(obj, cls, (Tcl_Command) cmd, interp, cmdList->clientData, 1); } } if (cmd && guardOk == TCL_OK) { /* * on success: compute mixin call data */ *cl = cls; *currentCmdPtr = cmdList->cmdPtr; break; } else { cmd = NULL; cmdList = cmdList->next; } } } } return cmd; } /* * info option for mixins and instmixins */ static int MixinInfo(Tcl_Interp *interp, XOTclCmdList *m, char *pattern, int withGuards, XOTclObject *matchObject) { Tcl_Obj *list = Tcl_NewListObj(0, NULL); while (m) { /* fprintf(stderr," mixin info m=%p, next=%p, pattern %s, matchObject %p\n", m, m->next, pattern, matchObject);*/ XOTclClass *mixinClass = XOTclGetClassFromCmdPtr(m->cmdPtr); if (mixinClass && (!pattern || (matchObject && &(mixinClass->object) == matchObject) || (!matchObject && Tcl_StringMatch(ObjStr(mixinClass->object.cmdName), pattern)))) { if (withGuards && m->clientData) { Tcl_Obj *l = Tcl_NewListObj(0, NULL); Tcl_Obj *g = (Tcl_Obj*) m->clientData; Tcl_ListObjAppendElement(interp, l, mixinClass->object.cmdName); Tcl_ListObjAppendElement(interp, l, XOTclGlobalObjects[XOTE_GUARD_OPTION]); Tcl_ListObjAppendElement(interp, l, g); Tcl_ListObjAppendElement(interp, list, l); } else { Tcl_ListObjAppendElement(interp, list, mixinClass->object.cmdName); } if (matchObject) break; } m = m->next; } Tcl_SetObjResult(interp, list); return TCL_OK; } static Tcl_Command MixinSearchMethodByName(Tcl_Interp *interp, XOTclCmdList *mixinList, char *name, XOTclClass **cl) { Tcl_Command cmd; for (; mixinList; mixinList = mixinList->next) { XOTclClass *mcl = XOTclpGetClass(interp, (char *) Tcl_GetCommandName(interp, mixinList->cmdPtr)); if (mcl && SearchCMethod(mcl, name, &cmd)) { if (cl) *cl = mcl; return cmd; } } return 0; } /* * Filter-Commands */ /* * The search method implements filter search order for filter * and instfilter: first a given name is interpreted as fully * qualified instproc name. If no instproc is found, a proc is * search with fully name. Otherwise the simple name is searched * on the heritage order: object (only for * per-object filters), class, meta-class */ static Tcl_Command FilterSearch(Tcl_Interp *interp, char *name, XOTclObject *startingObj, XOTclClass *startingCl, XOTclClass **cl) { Tcl_Command cmd = NULL; if (startingObj) { XOTclObjectOpt *opt = startingObj->opt; /* * the object-specific filter can also be defined on the object's * class, its hierarchy, or the respective instmixins; thus use the * object's class as start point for the class-specific search then ... */ startingCl = startingObj->cl; /* * search for filters on object mixins */ if (opt && opt->mixins) { if ((cmd = MixinSearchMethodByName(interp, opt->mixins, name, cl))) { return cmd; } } } /* * search for instfilters on instmixins */ if (startingCl) { XOTclClassOpt *opt = startingCl->opt; if (opt && opt->instmixins) { if ((cmd = MixinSearchMethodByName(interp, opt->instmixins, name, cl))) { return cmd; } } } /* * seach for object procs that are used as filters */ if (startingObj && startingObj->nsPtr) { /*fprintf(stderr,"search filter %s as proc \n",name);*/ if ((cmd = FindMethod(name, startingObj->nsPtr))) { *cl = (XOTclClass*)startingObj; return cmd; } } /* * ok, no filter on obj or mixins -> search class */ if (startingCl) { *cl = SearchCMethod(startingCl, name, &cmd); if (!*cl) { /* * If no filter is found yet -> search the meta-class */ *cl = SearchCMethod(startingCl->object.cl, name, &cmd); } } return cmd; } /* * Filter Guards */ /* check a filter guard, return 1 if ok */ static int GuardCheck(Tcl_Interp *interp, ClientData clientData) { Tcl_Obj *guard = (Tcl_Obj*) clientData; XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; if (guard) { int rc; /* * if there are more than one filter guard for this filter * (i.e. they are inherited), then they are OR combined * -> if one check succeeds => return 1 */ /*fprintf(stderr, "checking guard **%s**\n", ObjStr(guard));*/ cs->guardCount++; rc = checkConditionInScope(interp, guard); cs->guardCount--; /*fprintf(stderr, "checking guard **%s** returned rc=%d\n", ObjStr(fr->content), rc);*/ if (rc == TCL_OK) { /* fprintf(stderr, " +++ OK\n"); */ return TCL_OK; } else if (rc == TCL_ERROR) { Tcl_Obj *sr = Tcl_GetObjResult(interp); INCR_REF_COUNT(sr); /* fprintf(stderr, " +++ ERROR\n");*/ XOTclVarErrMsg(interp, "Guard Error: '", ObjStr(guard), "'\n\n", ObjStr(sr), (char *) NULL); DECR_REF_COUNT(sr); return TCL_ERROR; } } /* fprintf(stderr, " +++ FAILED\n"); */ return XOTCL_CHECK_FAILED; } /* static void GuardPrint(Tcl_Interp *interp, ClientData clientData) { Tcl_Obj *guard = (TclObj*) clientData; fprintf(stderr, " +++ \n"); if (guard) { fprintf(stderr, " * %s \n", ObjStr(guard)); } fprintf(stderr, " +++ \n"); } */ static void GuardDel(XOTclCmdList *CL) { /*fprintf(stderr, "GuardDel %p cd = %p\n", CL, CL? CL->clientData : NULL);*/ if (CL && CL->clientData) { DECR_REF_COUNT((Tcl_Obj*)CL->clientData); CL->clientData = NULL; } } XOTCLINLINE static void GuardAdd(Tcl_Interp *interp, XOTclCmdList *CL, Tcl_Obj *guard) { if (guard) { GuardDel(CL); if (strlen(ObjStr(guard)) != 0) { INCR_REF_COUNT(guard); CL->clientData = (ClientData) guard; /*fprintf(stderr,"guard added to %p cmdPtr=%p, clientData= %p\n", CL, CL->cmdPtr, CL->clientData); */ } } } /* static void GuardAddList(Tcl_Interp *interp, XOTclCmdList *dest, ClientData source) { XOTclTclObjList *s = (XOTclTclObjList*) source; while (s) { GuardAdd(interp, dest, (Tcl_Obj*) s->content); s = s->next; } } */ static int GuardCall(XOTclObject *obj, XOTclClass *cl, Tcl_Command cmd, Tcl_Interp *interp, ClientData clientData, int push) { int rc = TCL_OK; if (clientData) { XOTclCallStackContent *csc = CallStackGetTopFrame(interp); Tcl_Obj *res = Tcl_GetObjResult(interp); /* save the result */ INCR_REF_COUNT(res); csc->callType |= XOTCL_CSC_CALL_IS_GUARD; /* GuardPrint(interp, cmdList->clientData); */ /* * ok, there is a guard ... we have to push a * fake callframe on the tcl stack so that uplevel * is in sync with the XOTcl callstack, and we can uplevel * into the above pushed CallStack entry */ if (push) { CallStackPush(interp, obj, cl, cmd, 0, 0, XOTCL_CSC_TYPE_GUARD); rc = GuardCheck(interp, clientData); CallStackPop(interp); } else { rc = GuardCheck(interp, clientData); } Tcl_SetObjResult(interp, res); /* restore the result */ DECR_REF_COUNT(res); } return rc; } static int GuardAddFromDefinitionList(Tcl_Interp *interp, XOTclCmdList *dest, XOTclObject *obj, Tcl_Command interceptorCmd, XOTclCmdList *interceptorDefList) { if (interceptorDefList) { XOTclCmdList *h = CmdListFindCmdInList(interceptorCmd, interceptorDefList); if (h) { GuardAdd(interp, dest, (Tcl_Obj*) h->clientData); /* * 1 means we have added a guard successfully "interceptorCmd" */ return 1; } } /* * 0 means we have not added a guard successfully "interceptorCmd" */ return 0; } static void GuardAddInheritedGuards(Tcl_Interp *interp, XOTclCmdList *dest, XOTclObject *obj, Tcl_Command filterCmd) { XOTclClasses *pl; int guardAdded = 0; XOTclObjectOpt *opt; /* search guards for instfilters registered on mixins */ if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { XOTclCmdList *ml; for (ml = obj->mixinOrder; ml && !guardAdded; ml = ml->next) { XOTclClass *mixin = XOTclGetClassFromCmdPtr(ml->cmdPtr); if (mixin && mixin->opt) { guardAdded = GuardAddFromDefinitionList(interp, dest, obj, filterCmd, mixin->opt->instfilters); } } } /* search per-object filters */ opt = obj->opt; if (!guardAdded && opt && opt->filters) { guardAdded = GuardAddFromDefinitionList(interp, dest, obj, filterCmd, opt->filters); } if (!guardAdded) { /* search per-class filters */ for (pl = ComputeOrder(obj->cl, obj->cl->order, Super); !guardAdded && pl; pl = pl->next) { XOTclClassOpt *opt = pl->cl->opt; if (opt) { guardAdded = GuardAddFromDefinitionList(interp, dest, obj, filterCmd, opt->instfilters); } } /* * if this is not a registered filter, it is an inherited filter, like: * Class A * A instproc f ... * Class B -superclass A * B instproc {{f {}}} * B instfilter f * -> get the guard from the filter that inherits it (here B->f) */ if (!guardAdded) { XOTclCmdList *registeredFilter = CmdListFindNameInList(interp,(char *) Tcl_GetCommandName(interp, filterCmd), obj->filterOrder); if (registeredFilter) { GuardAdd(interp, dest, (Tcl_Obj*) registeredFilter->clientData); } } } } static int GuardList(Tcl_Interp *interp, XOTclCmdList *frl, char *interceptorName) { if (frl) { /* try to find simple name first */ XOTclCmdList *h = CmdListFindNameInList(interp, interceptorName, frl); if (!h) { /* maybe it is a qualified name */ Tcl_Command cmd = NSFindCommand(interp, interceptorName, NULL); if (cmd) { h = CmdListFindCmdInList(cmd, frl); } } if (h) { Tcl_ResetResult(interp); if (h->clientData) { Tcl_Obj *g = (Tcl_Obj*) h->clientData; Tcl_SetObjResult(interp, g); } return TCL_OK; } } return XOTclVarErrMsg(interp, "info (*)guard: can't find filter/mixin ", interceptorName, (char *) NULL); } /* * append a filter command to the 'filterList' of an obj/class */ static int FilterAdd(Tcl_Interp *interp, XOTclCmdList **filterList, Tcl_Obj *name, XOTclObject *startingObj, XOTclClass *startingCl) { Tcl_Command cmd; int ocName; Tcl_Obj **ovName; Tcl_Obj *guard = NULL; XOTclCmdList *new; XOTclClass *cl; if (Tcl_ListObjGetElements(interp, name, &ocName, &ovName) == TCL_OK && ocName > 1) { if (ocName == 3 && !strcmp(ObjStr(ovName[1]), XOTclGlobalStrings[XOTE_GUARD_OPTION])) { name = ovName[0]; guard = ovName[2]; } } if (!(cmd = FilterSearch(interp, ObjStr(name), startingObj, startingCl, &cl))) { if (startingObj) return XOTclVarErrMsg(interp, "filter: can't find filterproc on: ", ObjStr(startingObj->cmdName), " - proc: ", ObjStr(name), (char *) NULL); else return XOTclVarErrMsg(interp, "instfilter: can't find filterproc on: ", ObjStr(startingCl->object.cmdName), " - proc: ", ObjStr(name), (char *) NULL); } /*fprintf(stderr, " +++ adding filter %s cl %p\n", ObjStr(name), cl);*/ new = CmdListAdd(filterList, cmd, cl, /*noDuplicates*/ 1); if (guard) { GuardAdd(interp, new, guard); } else { if (new->clientData) GuardDel(new); } return TCL_OK; } /* * reset the filter order cached in obj->filterOrder */ static void FilterResetOrder(XOTclObject *obj) { CmdListRemoveList(&obj->filterOrder, GuardDel); obj->filterOrder = NULL; } /* * search the filter in the hierarchy again with FilterSearch, e.g. * upon changes in the class hierarchy or mixins that carry the filter * command, so that we can be sure it is still reachable. */ static void FilterSearchAgain(Tcl_Interp *interp, XOTclCmdList **filters, XOTclObject *startingObj, XOTclClass *startingCl) { Tcl_Command cmd; XOTclCmdList *cmdList, *del; XOTclClass *cl = NULL; CmdListRemoveEpoched(filters, GuardDel); for (cmdList = *filters; cmdList; ) { char *simpleName = (char *) Tcl_GetCommandName(interp, cmdList->cmdPtr); cmd = FilterSearch(interp, simpleName, startingObj, startingCl, &cl); if (cmd == NULL) { del = CmdListRemoveFromList(filters, cmdList); cmdList = cmdList->next; CmdListDeleteCmdListEntry(del, GuardDel); } else if (cmd != cmdList->cmdPtr) { CmdListReplaceCmd(cmdList, cmd, cl); cmdList = cmdList->next; } else { cmdList = cmdList->next; } } /* some entries might be NULL now, if they are not found anymore -> delete those CmdListRemoveNulledEntries(filters, GuardDel); */ } /* * if the class hierarchy or class filters have changed -> * invalidate filter entries in all dependent instances * */ static void FilterInvalidateObjOrders(Tcl_Interp *interp, XOTclClass *cl) { XOTclClasses *saved = cl->order, *clPtr, *savePtr; cl->order = NULL; savePtr = clPtr = ComputeOrder(cl, cl->order, Sub); cl->order = saved; for ( ; clPtr; clPtr = clPtr->next) { Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = &clPtr->cl->instances ? Tcl_FirstHashEntry(&clPtr->cl->instances, &hSrch) : 0; /* recalculate the commands of all instfilter registrations */ if (clPtr->cl->opt) { FilterSearchAgain(interp, &clPtr->cl->opt->instfilters, 0, clPtr->cl); } for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { XOTclObject *obj = (XOTclObject*) Tcl_GetHashKey(&clPtr->cl->instances, hPtr); FilterResetOrder(obj); obj->flags &= ~XOTCL_FILTER_ORDER_VALID; /* recalculate the commands of all object filter registrations */ if (obj->opt) { FilterSearchAgain(interp, &obj->opt->filters, obj, 0); } } } XOTclFreeClasses(savePtr); } /* * from cl on down the hierarchy we remove all filters * the refer to "removeClass" namespace. E.g. used to * remove filters defined in superclass list from dependent * class cl */ static void FilterRemoveDependentFilterCmds(XOTclClass *cl, XOTclClass *removeClass) { XOTclClasses *saved = cl->order, *clPtr; cl->order = NULL; /*fprintf(stderr, "FilterRemoveDependentFilterCmds cl %p %s, removeClass %p %s\n", cl, ObjStr(cl->object.cmdName), removeClass, ObjStr(removeClass->object.cmdName));*/ for (clPtr = ComputeOrder(cl, cl->order, Sub); clPtr; clPtr = clPtr->next) { Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = &clPtr->cl->instances ? Tcl_FirstHashEntry(&clPtr->cl->instances, &hSrch) : NULL; XOTclClassOpt *opt = clPtr->cl->opt; if (opt) { CmdListRemoveContextClassFromList(&opt->instfilters, removeClass, GuardDel); } for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { XOTclObject *obj = (XOTclObject*) Tcl_GetHashKey(&clPtr->cl->instances, hPtr); if (obj->opt) { CmdListRemoveContextClassFromList(&obj->opt->filters, removeClass, GuardDel); } } } XOTclFreeClasses(cl->order); cl->order = saved; } /* * build up a qualifier of the form proc/instproc * if cl is not NULL, we build an instproc identifier for cl, else a proc * with obj */ static Tcl_Obj* getFullProcQualifier(Tcl_Interp *interp, CONST84 char *cmdName, XOTclObject *obj, XOTclClass *cl, Tcl_Command cmd) { Tcl_Obj *list = Tcl_NewListObj(0, NULL); Tcl_Obj *procObj = Tcl_NewStringObj(cmdName, -1); Tcl_ObjCmdProc *objProc = Tcl_Command_objProc(cmd); int isTcl = (TclIsProc((Command *)cmd) != NULL); if (cl) { Tcl_ListObjAppendElement(interp, list, cl->object.cmdName); /*fprintf(stderr,"current %p, dispatch %p, forward %p, parametermcd %p, is tcl %p\n", objProc, XOTclObjDispatch, XOTclForwardMethod, XOTclSetterMethod, TclIsProc((Command *)cmd)); */ if (isTcl) { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_INSTPROC]); } else if (objProc == XOTclForwardMethod) { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_INSTFORWARD]); } else if (objProc == XOTclSetterMethod) { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_INSTPARAMETERCMD]); } else { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_INSTCMD]); } } else { Tcl_ListObjAppendElement(interp, list, obj->cmdName); if (isTcl) { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_PROC]); } else if (objProc == XOTclForwardMethod) { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_FORWARD]); } else if (objProc == XOTclSetterMethod) { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_PARAMETERCMD]); } else { Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_CMD]); } } Tcl_ListObjAppendElement(interp, list, procObj); return list; } /* * info option for filters and instfilters * withGuards -> if not 0 => append guards * fullProcQualifiers -> if not 0 => full names with obj/class proc/instproc */ static int FilterInfo(Tcl_Interp *interp, XOTclCmdList *f, char *pattern, int withGuards, int fullProcQualifiers) { Tcl_Obj *list = Tcl_NewListObj(0, NULL); /* guard lists should only have unqualified filter lists when withGuards is activated, fullProcQualifiers has not effect */ if (withGuards) { fullProcQualifiers = 0; } while (f) { CONST84 char *simpleName = Tcl_GetCommandName(interp, f->cmdPtr); if (!pattern || Tcl_StringMatch(simpleName, pattern)) { if (withGuards && f->clientData) { Tcl_Obj *innerList = Tcl_NewListObj(0, NULL); Tcl_Obj *g = (Tcl_Obj*) f->clientData; Tcl_ListObjAppendElement(interp, innerList, Tcl_NewStringObj(simpleName, -1)); Tcl_ListObjAppendElement(interp, innerList, XOTclGlobalObjects[XOTE_GUARD_OPTION]); Tcl_ListObjAppendElement(interp, innerList, g); Tcl_ListObjAppendElement(interp, list, innerList); } else { if (fullProcQualifiers) { XOTclClass *fcl; XOTclObject *fobj; if (f->clorobj && !XOTclObjectIsClass(&f->clorobj->object)) { fobj = (XOTclObject *)f->clorobj; fcl = NULL; } else { fobj = NULL; fcl = f->clorobj; } Tcl_ListObjAppendElement(interp, list, getFullProcQualifier(interp, simpleName, fobj, fcl, f->cmdPtr)); } else { Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj(simpleName, -1)); } } } f = f->next; } Tcl_SetObjResult(interp, list); return TCL_OK; } /* * Appends XOTclCmdPtr *containing the filter cmds and their * superclass specializations to 'filterList' */ static void FilterComputeOrderFullList(Tcl_Interp *interp, XOTclCmdList **filters, XOTclCmdList **filterList) { XOTclCmdList *f ; XOTclClass *fcl; XOTclClasses *pl; /* * ensure that no epoched command is in the filters list */ CmdListRemoveEpoched(filters, GuardDel); for (f = *filters; f; f = f->next) { char *simpleName = (char *) Tcl_GetCommandName(interp, f->cmdPtr); fcl = f->clorobj; CmdListAdd(filterList, f->cmdPtr, fcl, /*noDuplicates*/ 0); if (fcl && !XOTclObjectIsClass(&fcl->object)) { /* get the object for per-object filter */ XOTclObject *fObj = (XOTclObject *)fcl; /* and then get class */ fcl = fObj->cl; } /* if we have a filter class -> search up the inheritance hierarchy*/ if (fcl) { pl = ComputeOrder(fcl, fcl->order, Super); if (pl && pl->next) { /* don't search on the start class again */ pl = pl->next; /* now go up the hierarchy */ for(; pl; pl = pl->next) { Tcl_Command pi = FindMethod(simpleName, pl->cl->nsPtr); if (pi) { CmdListAdd(filterList, pi, pl->cl, /*noDuplicates*/ 0); /* fprintf(stderr, " %s::%s, ", ObjStr(pl->cl->object.cmdName), simpleName); */ } } } } } /*CmdListPrint(interp,"FilterComputeOrderFullList....\n", *filterList);*/ } /* * Computes a linearized order of filter and instfilter. Then * duplicates in the full list and with the class inheritance list of * 'obj' are eliminated. * The precendence rule is that the last occurence makes it into the * final list. */ static void FilterComputeOrder(Tcl_Interp *interp, XOTclObject *obj) { XOTclCmdList *filterList = NULL, *next, *checker, *newlist; XOTclClasses *pl; if (obj->filterOrder) FilterResetOrder(obj); /* fprintf(stderr, " List: ", ObjStr(obj->cmdName)); */ /* append instfilters registered for mixins */ if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { XOTclCmdList *ml; XOTclClass *mixin; for (ml = obj->mixinOrder; ml; ml = ml->next) { mixin = XOTclGetClassFromCmdPtr(ml->cmdPtr); if (mixin && mixin->opt && mixin->opt->instfilters) FilterComputeOrderFullList(interp, &mixin->opt->instfilters, &filterList); } } /* append per-obj filters */ if (obj->opt) FilterComputeOrderFullList(interp, &obj->opt->filters, &filterList); /* append per-class filters */ for (pl = ComputeOrder(obj->cl, obj->cl->order, Super); pl; pl=pl->next) { XOTclClassOpt *opt = pl->cl->opt; if (opt && opt->instfilters) { FilterComputeOrderFullList(interp, &opt->instfilters, &filterList); } } /* fprintf(stderr, "\n"); */ /* use no duplicates & no classes of the precedence order on the resulting list */ while (filterList) { checker = next = filterList->next; while (checker) { if (checker->cmdPtr == filterList->cmdPtr) break; checker = checker->next; } if (checker == NULL) { newlist = CmdListAdd(&obj->filterOrder, filterList->cmdPtr, filterList->clorobj, /*noDuplicates*/ 0); GuardAddInheritedGuards(interp, newlist, obj, filterList->cmdPtr); /* fprintf(stderr, " Adding %s::%s,\n", filterList->cmdPtr->nsPtr->fullName, Tcl_GetCommandName(interp, filterList->cmdPtr)); */ /* GuardPrint(interp, newlist->clientData); */ } CmdListDeleteCmdListEntry(filterList, GuardDel); filterList = next; } /* fprintf(stderr, "\n"); */ } /* * the filter order is either * DEFINED (there are filter on the instance), * NONE (there are no filter for the instance), * or INVALID (a class re-strucuturing has occured, thus it is not clear * whether filters are defined or not). * If it is INVALID FilterComputeDefined can be used to compute the order * and set the instance to DEFINE or NONE */ static void FilterComputeDefined(Tcl_Interp *interp, XOTclObject *obj) { FilterComputeOrder(interp, obj); obj->flags |= XOTCL_FILTER_ORDER_VALID; if (obj->filterOrder) obj->flags |= XOTCL_FILTER_ORDER_DEFINED; else obj->flags &= ~XOTCL_FILTER_ORDER_DEFINED; } /* * push a filter stack information on this object */ static int FilterStackPush(Tcl_Interp *interp, XOTclObject *obj, Tcl_Obj *calledProc) { register XOTclFilterStack *h = NEW(XOTclFilterStack); h->currentCmdPtr = NULL; h->calledProc = calledProc; INCR_REF_COUNT(h->calledProc); h->next = obj->filterStack; obj->filterStack = h; return 1; } /* * pop a filter stack information on this object */ static void FilterStackPop(XOTclObject *obj) { register XOTclFilterStack *h = obj->filterStack; obj->filterStack = h->next; /* free stack entry */ DECR_REF_COUNT(h->calledProc); FREE(XOTclFilterStack, h); } /* * seek through the filters active for "obj" and check whether cmdPtr * is among them */ XOTCLINLINE static int FilterActiveOnObj(Tcl_Interp *interp, XOTclObject *obj, Tcl_Command cmd) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *bot = cs->content; register XOTclCallStackContent *csc = cs->top; while (csc > bot) { /* only check the callstack entries for this object && only check the callstack entries for the given cmd */ if (obj == csc->self && cmd == csc->cmdPtr && csc->frameType == XOTCL_CSC_TYPE_ACTIVE_FILTER) { return 1; } csc--; } return 0; } /* * search through the filter list on obj and class hierarchy * for registration of a command ptr as filter * * returns a tcl obj list with the filter registration, like: * " filter , * " instfilter , * or an empty list, if not registered */ static Tcl_Obj* FilterFindReg(Tcl_Interp *interp, XOTclObject *obj, Tcl_Command cmd) { Tcl_Obj *list = Tcl_NewListObj(0, NULL); XOTclClasses *pl; /* search per-object filters */ if (obj->opt && CmdListFindCmdInList(cmd, obj->opt->filters)) { Tcl_ListObjAppendElement(interp, list, obj->cmdName); Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_FILTER]); Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj(Tcl_GetCommandName(interp, cmd), -1)); return list; } /* search per-class filters */ for (pl = ComputeOrder(obj->cl, obj->cl->order, Super); pl; pl = pl->next) { XOTclClassOpt *opt = pl->cl->opt; if (opt && opt->instfilters) { if (CmdListFindCmdInList(cmd, opt->instfilters)) { Tcl_ListObjAppendElement(interp, list, pl->cl->object.cmdName); Tcl_ListObjAppendElement(interp, list, XOTclGlobalObjects[XOTE_INSTFILTER]); Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj(Tcl_GetCommandName(interp, cmd), -1)); return list; } } } return list; } /* * before we can perform a filter dispatch, FilterSearchProc seeks the * current filter and the relevant calling information */ static Tcl_Command FilterSearchProc(Tcl_Interp *interp, XOTclObject *obj, Tcl_Command *currentCmd, XOTclClass **cl) { XOTclCmdList *cmdList; assert(obj); assert(obj->filterStack); *currentCmd = NULL; /* Ensure that the filter order is not invalid, otherwise compute order FilterComputeDefined(interp, obj); */ assert(obj->flags & XOTCL_FILTER_ORDER_VALID); cmdList = seekCurrent(obj->filterStack->currentCmdPtr, obj->filterOrder); while (cmdList) { if (Tcl_Command_cmdEpoch(cmdList->cmdPtr)) { cmdList = cmdList->next; } else if (FilterActiveOnObj(interp, obj, cmdList->cmdPtr)) { /* fprintf(stderr, "Filter <%s> -- Active on: %s\n", Tcl_GetCommandName(interp, (Tcl_Command)cmdList->cmdPtr), ObjStr(obj->cmdName)); */ obj->filterStack->currentCmdPtr = cmdList->cmdPtr; cmdList = seekCurrent(obj->filterStack->currentCmdPtr, obj->filterOrder); } else { /* ok. we' ve found it */ if (cmdList->clorobj && !XOTclObjectIsClass(&cmdList->clorobj->object)) { *cl = NULL; } else { *cl = cmdList->clorobj; } *currentCmd = cmdList->cmdPtr; /* fprintf(stderr, "FilterSearchProc - found: %s, %p\n", Tcl_GetCommandName(interp, (Tcl_Command)cmdList->cmdPtr), cmdList->cmdPtr); */ return cmdList->cmdPtr; } } return NULL; } static int SuperclassAdd(Tcl_Interp *interp, XOTclClass *cl, int oc, Tcl_Obj **ov, Tcl_Obj *arg) { XOTclClasses *filterCheck, *osl = NULL; XOTclClass **scl; int reversed = 0; int i, j; filterCheck = ComputeOrder(cl, cl->order, Super); /* * we have to remove all dependent superclass filter referenced * by class or one of its subclasses * * do not check the class "cl" itself (first entry in * filterCheck class list) */ if (filterCheck) filterCheck = filterCheck->next; for (; filterCheck; filterCheck = filterCheck->next) { FilterRemoveDependentFilterCmds(cl, filterCheck->cl); } /* invalidate all interceptors orders of instances of this and of all depended classes */ MixinInvalidateObjOrders(interp, cl); FilterInvalidateObjOrders(interp, cl); scl = NEW_ARRAY(XOTclClass*, oc); for (i = 0; i < oc; i++) { if (GetXOTclClassFromObj(interp, ov[i], &scl[i], 1) != TCL_OK) { char *errorString = ObjStr(Tcl_GetObjResult(interp)); FREE(XOTclClass**, scl); if (*errorString == '\0') { XOTclErrBadVal(interp, "superclass", "a list of classes", ObjStr(arg)); } return TCL_ERROR; } } /* * check that superclasses don't precede their classes */ for (i = 0; i < oc; i++) { if (reversed) break; for (j = i+1; j < oc; j++) { XOTclClasses *dl = ComputeOrder(scl[j], scl[j]->order, Super); if (reversed) break; while (dl) { if (dl->cl == scl[i]) break; dl = dl->next; } if (dl) reversed = 1; } } if (reversed) { return XOTclErrBadVal(interp, "superclass", "classes in dependence order", ObjStr(arg)); } while (cl->super) { /* * build up an old superclass list in case we need to revert */ XOTclClass *sc = cl->super->cl; XOTclClasses *l = osl; osl = NEW(XOTclClasses); osl->cl = sc; osl->next = l; (void)RemoveSuper(cl, cl->super->cl); } for (i = 0; i < oc; i++) { AddSuper(cl, scl[i]); } FREE(XOTclClass**, scl); FlushPrecedencesOnSubclasses(cl); if (!ComputeOrder(cl, cl->order, Super)) { /* * cycle in the superclass graph, backtrack */ XOTclClasses *l; while (cl->super) (void)RemoveSuper(cl, cl->super->cl); for (l = osl; l; l = l->next) AddSuper(cl, l->cl); XOTclFreeClasses(osl); return XOTclErrBadVal(interp, "superclass", "a cycle-free graph", ObjStr(arg)); } XOTclFreeClasses(osl); /* if there are no more super classes add the Object class as superclasses */ if (cl->super == NULL) AddSuper(cl, RUNTIME_STATE(interp)->theObject); Tcl_ResetResult(interp); return TCL_OK; } static int varExists(Tcl_Interp *interp, XOTclObject *obj, char *varName, char *index, int triggerTrace, int requireDefined) { XOTcl_FrameDecls; Var *varPtr, *arrayPtr; int result; int flags = 0; #ifdef PRE81 flags |= (index == NULL) ? TCL_PARSE_PART1 : 0; #endif XOTcl_PushFrame(interp, obj); #if defined(PRE83) varPtr = TclLookupVar(interp, varName, index, flags, "access", /*createPart1*/ 0, /*createPart2*/ 0, &arrayPtr); #else if (triggerTrace) varPtr = TclVarTraceExists(interp, varName); else varPtr = TclLookupVar(interp, varName, index, flags, "access", /*createPart1*/ 0, /*createPart2*/ 0, &arrayPtr); #endif /* fprintf(stderr, "varExists %s varPtr %p requireDefined %d, triggerTrace %d, isundef %d\n", varName, varPtr, requireDefined, triggerTrace, varPtr ? TclIsVarUndefined(varPtr) : 0); */ result = (varPtr && (!requireDefined || !TclIsVarUndefined(varPtr))); XOTcl_PopFrame(interp, obj); return result; } static void getVarAndNameFromHash(Tcl_HashEntry *hPtr, Var **val, Tcl_Obj **varNameObj) { *val = VarHashGetValue(hPtr); #if defined(PRE85) # if FORWARD_COMPATIBLE if (forwardCompatibleMode) { *varNameObj = VarHashGetKey(*val); } else { *varNameObj = Tcl_NewStringObj(Tcl_GetHashKey(hPtr->tablePtr, hPtr),-1); } # else *varNameObj = Tcl_NewStringObj(Tcl_GetHashKey(hPtr->tablePtr, hPtr),-1); # endif #else *varNameObj = VarHashGetKey(*val); #endif } /* * Search default values specified through 'parameter' on one class */ static int SearchDefaultValuesOnClass(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cmdCl, XOTclClass *targetClass) { int result = TCL_OK; Var *defaults, *initcmds; Tcl_Namespace *ns = targetClass->object.nsPtr; TclVarHashTable *varTable = ns ? Tcl_Namespace_varTable(ns) : targetClass->object.varTable; defaults = LookupVarFromTable(varTable, "__defaults",(XOTclObject*)targetClass); initcmds = LookupVarFromTable(varTable, "__initcmds",(XOTclObject*)targetClass); if (defaults && TclIsVarArray(defaults)) { TclVarHashTable *tablePtr = valueOfVar(TclVarHashTable, defaults, tablePtr); Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = tablePtr ? Tcl_FirstHashEntry(VarHashTable(tablePtr), &hSrch) : 0; /*fprintf(stderr, "+++ we have defaults for %s in <%s>\n", ObjStr(obj->cmdName), className(targetClass));*/ /* iterate over all elements of the defaults array */ for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { Var *val; Tcl_Obj *varNameObj; getVarAndNameFromHash(hPtr, &val, &varNameObj); INCR_REF_COUNT(varNameObj); if (TclIsVarScalar(val)) { Tcl_Obj *oldValue = XOTclOGetInstVar2((XOTcl_Object*) obj, interp, varNameObj, NULL, TCL_PARSE_PART1); /** we check whether the variable is already set. if so, we do not set it again */ if (oldValue == NULL) { Tcl_Obj *valueObj = valueOfVar(Tcl_Obj, val, objPtr); char *value = ObjStr(valueObj), *v; int doSubst = 0; for (v=value; *v; v++) { if (*v == '[' && doSubst == 0) doSubst = 1; else if ((doSubst == 1 && *v == ']') || *v == '$') { doSubst = 2; break; } } if (doSubst == 2) { /* we have to subst */ Tcl_Obj *ov[2]; int rc = CallStackPush(interp, obj, cmdCl, 0, 1, &varNameObj, XOTCL_CSC_TYPE_PLAIN); if (rc != TCL_OK) { DECR_REF_COUNT(varNameObj); return rc; } ov[1] = valueObj; Tcl_ResetResult(interp); rc = XOTcl_SubstObjCmd(NULL, interp, 2, ov); CallStackPop(interp); if (rc == TCL_OK) { valueObj = Tcl_GetObjResult(interp); } else { DECR_REF_COUNT(varNameObj); return rc; } } /*fprintf(stderr,"calling %s value='%s'\n", ObjStr(varNameObj), ObjStr(valueObj));*/ INCR_REF_COUNT(valueObj); result = XOTclCallMethodWithArgs((ClientData)obj, interp, varNameObj, valueObj, 1, 0, 0); DECR_REF_COUNT(valueObj); if (result != TCL_OK) { DECR_REF_COUNT(varNameObj); return result; } } } DECR_REF_COUNT(varNameObj); } } if (initcmds && TclIsVarArray(initcmds)) { TclVarHashTable *tablePtr = valueOfVar(TclVarHashTable, initcmds, tablePtr); Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = tablePtr ? Tcl_FirstHashEntry(VarHashTable(tablePtr), &hSrch) : NULL; /*fprintf(stderr, "+++ we have initcmds for <%s>\n", className(targetClass));*/ /* iterate over the elements of initcmds */ for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { Var *val; Tcl_Obj *varNameObj; getVarAndNameFromHash(hPtr, &val, &varNameObj); INCR_REF_COUNT(varNameObj); /*fprintf(stderr,"varexists(%s->%s) = %d\n", ObjStr(obj->cmdName), ObjStr(varNameObj), varExists(interp, obj, ObjStr(varNameObj), NULL, 0, 0));*/ if (TclIsVarScalar(val) && (!varExists(interp, obj, ObjStr(varNameObj), NULL, 0, 0) || varExists(interp, &targetClass->object, "__defaults", ObjStr(varNameObj), 0, 0) )) { Tcl_Obj *valueObj = valueOfVar(Tcl_Obj, val, objPtr); char *string = ObjStr(valueObj); if (*string) { int rc; XOTcl_FrameDecls; XOTcl_PushFrame(interp, obj); /* make instvars accessible */ CallStackPush(interp, obj, cmdCl, 0, 1, &varNameObj, XOTCL_CSC_TYPE_PLAIN); /*allow to call self*/ /*fprintf(stderr,"evaluating '%s' obj=%s\n\n", ObjStr(valueObj), ObjStr(obj->cmdName)); XOTclCallStackDump(interp);*/ rc = Tcl_EvalObjEx(interp, valueObj, TCL_EVAL_DIRECT); CallStackPop(interp); XOTcl_PopFrame(interp, obj); if (rc != TCL_OK) { DECR_REF_COUNT(varNameObj); return rc; } /* fprintf(stderr,"... varexists(%s->%s) = %d\n", ObjStr(obj->cmdName), varName, varExists(interp, obj, varName, NULL, 0, 0)); */ } } DECR_REF_COUNT(varNameObj); } } return result; } /* * Search default values specified through 'parameter' on * mixin and class hierarchy */ static int SearchDefaultValues(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cmdCl) { XOTcl_FrameDecls; XOTclClass *cl = obj->cl; XOTclClasses *pl; XOTclCmdList *ml; int result = TCL_OK; if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) ml = obj->mixinOrder; else ml = NULL; assert(cl); XOTcl_PushFrame(interp, obj); while (ml) { XOTclClass *mixin = XOTclGetClassFromCmdPtr(ml->cmdPtr); result = SearchDefaultValuesOnClass(interp, obj, cmdCl, mixin); if (result != TCL_OK) break; ml = ml->next; } for (pl = ComputeOrder(cl, cl->order, Super); pl; pl = pl->next) { result = SearchDefaultValuesOnClass(interp, obj, cmdCl, pl->cl); if (result != TCL_OK) break; } XOTcl_PopFrame(interp, obj); return result; } static int ParameterSearchDefaultsMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); XOTclObject *defaultObj; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc != 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "searchDefaults obj"); if (XOTclObjConvertObject(interp, objv[1], &defaultObj) != TCL_OK) return XOTclVarErrMsg(interp, "Can't find default object ", ObjStr(objv[1]), (char *) NULL); /* * Search for default values for vars on superclasses */ return SearchDefaultValues(interp, defaultObj, defaultObj->cl); } static int callParameterMethodWithArg(XOTclObject *obj, Tcl_Interp *interp, Tcl_Obj *method, Tcl_Obj *arg, int objc, Tcl_Obj *CONST objv[], int flags) { XOTclClassOpt *opt = obj->cl->opt; Tcl_Obj *pcl = XOTclGlobalObjects[XOTE_PARAM_CL]; XOTclClass *paramCl; int result; if (opt && opt->parameterClass) pcl = opt->parameterClass; result = GetXOTclClassFromObj(interp, pcl,¶mCl, 1); if (result == TCL_OK) { result = XOTclCallMethodWithArgs((ClientData)paramCl, interp, method, arg, objc-2, objv, flags); } else { char *errorString = ObjStr(Tcl_GetObjResult(interp)); if (*errorString == '\0') { XOTclVarErrMsg(interp, "create: can't find parameter class", (char *) NULL); } } return result; } #if !defined(PRE85) # if defined(WITH_TCL_COMPILE) # include # endif static void MakeProcError( Tcl_Interp *interp, /* The interpreter in which the procedure was * called. */ Tcl_Obj *procNameObj) /* Name of the procedure. Used for error * messages and trace information. */ { int overflow, limit = 60, nameLen; const char *procName = Tcl_GetStringFromObj(procNameObj, &nameLen); overflow = (nameLen > limit); Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (procedure \"%.*s%s\" line %d)", (overflow ? limit : nameLen), procName, (overflow ? "..." : ""), Tcl_GetErrorLine(interp))); } static int PushProcCallFrame( ClientData clientData, /* Record describing procedure to be * interpreted. */ register Tcl_Interp *interp,/* Interpreter in which procedure was * invoked. */ int objc, /* Count of number of arguments to this * procedure. */ Tcl_Obj *CONST objv[], /* Argument value objects. */ int isLambda) /* 1 if this is a call by ApplyObjCmd: it * needs special rules for error msg */ { Proc *procPtr = (Proc *) clientData; Namespace *nsPtr = procPtr->cmdPtr->nsPtr; CallFrame *framePtr, **framePtrPtr = &framePtr; int result; static Tcl_ObjType CONST86 *byteCodeType = NULL; if (byteCodeType == NULL) { static XOTclMutex initMutex = 0; XOTclMutexLock(&initMutex); if (byteCodeType == NULL) { byteCodeType = Tcl_GetObjType("bytecode"); } XOTclMutexUnlock(&initMutex); } if (procPtr->bodyPtr->typePtr == byteCodeType) { # if defined(WITH_TCL_COMPILE) ByteCode *codePtr; Interp *iPtr = (Interp *) interp; /* * When we've got bytecode, this is the check for validity. That is, * the bytecode must be for the right interpreter (no cross-leaks!), * the code must be from the current epoch (so subcommand compilation * is up-to-date), the namespace must match (so variable handling * is right) and the resolverEpoch must match (so that new shadowed * commands and/or resolver changes are considered). */ codePtr = procPtr->bodyPtr->internalRep.otherValuePtr; if (((Interp *) *codePtr->interpHandle != iPtr) || (codePtr->compileEpoch != iPtr->compileEpoch) || (codePtr->nsPtr != nsPtr) || (codePtr->nsEpoch != nsPtr->resolverEpoch)) { goto doCompilation; } # endif } else { # if defined(WITH_TCL_COMPILE) doCompilation: # endif result = TclProcCompileProc(interp, procPtr, procPtr->bodyPtr, (Namespace *) nsPtr, "body of proc", TclGetString(objv[isLambda])); /*fprintf(stderr,"compile returned %d",result);*/ if (result != TCL_OK) { return result; } } /* * Set up and push a new call frame for the new procedure invocation. * This call frame will execute in the proc's namespace, which might be * different than the current namespace. The proc's namespace is that of * its command, which can change if the command is renamed from one * namespace to another. */ result = TclPushStackFrame(interp, (Tcl_CallFrame **) framePtrPtr, (Tcl_Namespace *) nsPtr, (isLambda? (FRAME_IS_PROC|FRAME_IS_LAMBDA) : FRAME_IS_PROC)); if (result != TCL_OK) { return result; } framePtr->objc = objc; framePtr->objv = objv; framePtr->procPtr = procPtr; return TCL_OK; } #endif /* * method dispatch */ /* actually call a method (with assertion checking) */ static int callProcCheck(ClientData cp, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], Tcl_Command cmd, XOTclObject *obj, XOTclClass *cl, char *methodName, int frameType, int isTclProc) { int result = TCL_OK; XOTclRuntimeState *rst = RUNTIME_STATE(interp); #if defined(PROFILE) long int startUsec, startSec; struct timeval trt; gettimeofday(&trt, NULL); startSec = trt.tv_sec; startUsec = trt.tv_usec; #endif assert(obj); rst->callIsDestroy = 0; /*fprintf(stderr,"callProcCheck: setting callIsDestroy = 0, m=%s obj=%p (%s) is TclProc %d\n", methodName, obj, ObjStr(obj->cmdName), isTclProc);*/ /* fprintf(stderr,"*** callProcCheck: cmd = %p\n", cmd); fprintf(stderr, "cp=%p, isTclProc=%d %p %s, dispatch=%d %p, forward=%d %p, scoped %p, ov[0]=%p oc=%d\n", cp, isTclProc, cmd, Tcl_GetCommandName(interp, cmd), Tcl_Command_objProc(cmd) == XOTclObjDispatch, XOTclObjDispatch, Tcl_Command_objProc(cmd) == XOTclForwardMethod, XOTclForwardMethod, XOTclObjscopedMethod, objv[0], objc ); */ #ifdef CALLSTACK_TRACE XOTclCallStackDump(interp); #endif /*fprintf(stderr, "+++ callProcCheck teardown %p, method=%s, isTclProc %d\n",obj->teardown,methodName,isTclProc);*/ if (!obj->teardown) { goto finish; } if (isTclProc == 0) { if (obj->opt) { int co = obj->opt->checkoptions; if ((co & CHECK_INVAR) && ((result = AssertionCheckInvars(interp, obj, methodName, co)) == TCL_ERROR)) { goto finish; } } #ifdef DISPATCH_TRACE printCall(interp,"callProcCheck cmd", objc, objv); fprintf(stderr,"\tcmd=%s\n", Tcl_GetCommandName(interp, cmd)); #endif result = Tcl_NRCallObjProc(interp, Tcl_Command_objProc(cmd), cp, objc, objv); #ifdef DISPATCH_TRACE printExit(interp,"callProcCheck cmd", objc, objv, result); /*fprintf(stderr, " returnCode %d xotcl rc %d\n", Tcl_Interp_returnCode(interp), rst->returnCode);*/ #endif /* if (obj && obj->teardown && cl && !(obj->flags & XOTCL_DESTROY_CALLED)) { fprintf(stderr, "Obj= %s ", ObjStr(obj->cmdName)); fprintf(stderr, "CL= %s ", ObjStr(cl->object.cmdName)); fprintf(stderr, "method=%s\n", methodName); } */ /* The order of the check is important, since obj might be already freed in case the call was a instdestroy */ if (!rst->callIsDestroy && obj->opt) { int co = obj->opt->checkoptions; if ((co & CHECK_INVAR) && ((result = AssertionCheckInvars(interp, obj, methodName, co)) == TCL_ERROR)) { goto finish; } } } else { /* isTclProc == 1 * if this is a filter, check whether its guard applies, * if not: just step forward to the next filter */ /*fprintf(stderr,"calling proc %s isTclProc %d tearDown %d\n",methodName,isTclProc,obj->teardown);*/ if (frameType == XOTCL_CSC_TYPE_ACTIVE_FILTER) { XOTclCmdList *cmdList; /* * seek cmd in obj's filterOrder */ assert(obj->flags & XOTCL_FILTER_ORDER_VALID); /* otherwise: FilterComputeDefined(interp, obj);*/ for (cmdList = obj->filterOrder; cmdList && cmdList->cmdPtr != cmd; cmdList = cmdList->next); /* * when it is found, check whether it has a filter guard */ if (cmdList) { int rc = GuardCall(obj, cl, (Tcl_Command) cmdList->cmdPtr, interp, cmdList->clientData, 0); if (rc != TCL_OK) { if (rc != TCL_ERROR) { /* * call next, use the given objv's, not the callstack objv * we may not be in a method, thus there may be wrong or * no callstackobjs */ /*fprintf(stderr, "... calling nextmethod\n"); XOTclCallStackDump(interp);*/ rc = XOTclNextMethod(obj, interp, cl, methodName, objc, objv, /*useCallStackObjs*/ 0); /*fprintf(stderr, "... after nextmethod\n"); XOTclCallStackDump(interp);*/ } return rc; } } } /*fprintf(stderr, "AFTER FILTER, teardown=%p call is destroy %d\n",obj->teardown,rst->callIsDestroy);*/ /* if (!obj->teardown || rst->callIsDestroy) { goto finish; } */ if (obj->opt && (obj->opt->checkoptions & CHECK_PRE) && (result = AssertionCheck(interp, obj, cl, methodName, CHECK_PRE)) == TCL_ERROR) { goto finish; } #if defined(RST_RETURNCODE) if (Tcl_Interp_numLevels(interp) <= 2) rst->returnCode = TCL_OK; #endif #ifdef DISPATCH_TRACE printCall(interp,"callProcCheck tclCmd", objc, objv); fprintf(stderr,"\tproc=%s\n", Tcl_GetCommandName(interp, cmd)); #endif /* * In case, we have Tcl 8.5.* or better, we can avoid calling the * standard TclObjInterpProc() and ::xotcl::initProcNS defined in * the method, since Tcl 8.5 has a separate functions * PushProcCallFrame() and TclObjInterpProcCore(), where the * latter is callable from the outside (e.g. from XOTcl). This new * interface allows us to setup the XOTcl callframe before the * bytecode of the method body (provisioned by PushProcCallFrame) * is executed. On the medium range, we do not need the xotcl * callframe when we stop supporting Tcl 8.4 (we should simply use * the calldata field in the callstack), which should be managed * here or in PushProcCallFrame. At the same time, we could do the * non-pos-arg handling here as well. */ #if !defined(PRE85) && !defined(NRE) /*fprintf(stderr,"\tproc=%s cp=%p %d\n", Tcl_GetCommandName(interp, cmd),cp, isTclProc);*/ result = PushProcCallFrame(cp, interp, objc, objv, /*isLambda*/ 0); if (result == TCL_OK) { rst->cs.top->currentFramePtr = (Tcl_CallFrame *) Tcl_Interp_varFramePtr(interp); result = TclObjInterpProcCore(interp, objv[0], 1, &MakeProcError); } else { result = TCL_ERROR; } #else result = Tcl_NRCallObjProc(interp, Tcl_Command_objProc(cmd), cp, objc, objv); #endif #ifdef DISPATCH_TRACE printExit(interp,"callProcCheck tclCmd", objc, objv, result); /* fprintf(stderr, " returnCode %d xotcl rc %d\n", Tcl_Interp_returnCode(interp), result);*/ #endif #if defined(RST_RETURNCODE) if (result == TCL_BREAK && rst->returnCode == TCL_OK) rst->returnCode = result; #endif /* we give the information whether the call has destroyed the object back to the caller, because after CallStackPop it cannot be retrieved via the call stack */ /* if the object is destroyed -> the assertion structs's are already destroyed */ if (rst->cs.top->callType & XOTCL_CSC_CALL_IS_DESTROY) { rst->callIsDestroy = 1; /*fprintf(stderr,"callProcCheck: setting callIsDestroy = 1\n");*/ } if (obj->opt && !rst->callIsDestroy && obj->teardown && (obj->opt->checkoptions & CHECK_POST) && ((result = AssertionCheck(interp, obj, cl, methodName, CHECK_POST)) == TCL_ERROR)) { goto finish; } } finish: #if defined(PROFILE) if (rst->callIsDestroy == 0) { XOTclProfileEvaluateData(interp, startSec, startUsec, obj, cl, methodName); } #endif return result; } static int DoCallProcCheck(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], Tcl_Command cmd, XOTclObject *obj, XOTclClass *cl, char *methodName, int frameType) { int rc, push, isTclProc = 0; ClientData cp = Tcl_Command_objClientData(cmd); if (cp) { register Tcl_ObjCmdProc *proc = Tcl_Command_objProc(cmd); if (proc == TclObjInterpProc) { assert((TclIsProc((Command *)cmd))); isTclProc = 1; } else if (proc == XOTclObjDispatch) { assert((TclIsProc((Command *)cmd) == NULL)); } else if (proc == XOTclForwardMethod || proc == XOTclObjscopedMethod) { tclCmdClientData *tcd = (tclCmdClientData *)cp; tcd->obj = obj; assert((TclIsProc((Command *)cmd) == NULL)); } else if (cp == XOTCL_NONLEAF_METHOD) { cp = cd; assert((TclIsProc((Command *)cmd) == NULL)); } /* push the xotcl info */ push = 1; if ((CallStackPush(interp, obj, cl, cmd, objc, objv, frameType)) != TCL_OK) { return TCL_ERROR; } } else { push = 0; assert((TclIsProc((Command *)cmd) == NULL)); cp = cd; } rc = callProcCheck(cp, interp, objc, objv, cmd, obj, cl, methodName, frameType, isTclProc); if (push) { CallStackPop(interp); } return rc; } XOTCLINLINE static int DoDispatch(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int flags) { register XOTclObject *obj = (XOTclObject*)cd; int result = TCL_OK, mixinStackPushed = 0, filterStackPushed = 0, unknown, objflags, frameType = XOTCL_CSC_TYPE_PLAIN; #ifdef OBJDELETION_TRACE Tcl_Obj *method; #endif char *methodName; XOTclClass *cl = NULL; Tcl_Command cmd = NULL; XOTclRuntimeState *rst = RUNTIME_STATE(interp); Tcl_Obj *cmdName = obj->cmdName; XOTclCallStack *cs = &rst->cs; /* int isdestroy = (objv[1] == XOTclGlobalObjects[XOTE_DESTROY]); */ #ifdef AUTOVARS int isNext; #endif assert(objc>0); methodName = ObjStr(objv[1]); #ifdef AUTOVARS isNext = isNextString(methodName); #endif #ifdef DISPATCH_TRACE printCall(interp,"DISPATCH", objc, objv); #endif #ifdef OBJDELETION_TRACE method = objv[1]; if (method == XOTclGlobalObjects[XOTE_CLEANUP] || method == XOTclGlobalObjects[XOTE_DESTROY]) { fprintf(stderr, "%s->%s id=%p destroyCalled=%d\n", ObjStr(cmdName), methodName, obj, (obj->flags & XOTCL_DESTROY_CALLED)); } #endif objflags = obj->flags; /* avoid stalling */ INCR_REF_COUNT(cmdName); if (!(objflags & XOTCL_FILTER_ORDER_VALID)) FilterComputeDefined(interp, obj); if (!(objflags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); #ifdef AUTOVARS if (!isNext) { #endif /* Only start new filter chain, if (a) filters are defined and (b) the toplevel csc entry is not an filter on self */ if (((obj->flags & XOTCL_FILTER_ORDER_DEFINED_AND_VALID) == XOTCL_FILTER_ORDER_DEFINED_AND_VALID) && RUNTIME_STATE(interp)->doFilters && !(flags & XOTCL_CM_NO_FILTERS) && !cs->guardCount) { XOTclObject *self = GetSelfObj(interp); if (obj != self || cs->top->frameType != XOTCL_CSC_TYPE_ACTIVE_FILTER) { filterStackPushed = FilterStackPush(interp, obj, objv[1]); cmd = FilterSearchProc(interp, obj, &obj->filterStack->currentCmdPtr,&cl); if (cmd) { frameType = XOTCL_CSC_TYPE_ACTIVE_FILTER; methodName = (char *)Tcl_GetCommandName(interp, cmd); } else { FilterStackPop(obj); filterStackPushed = 0; } } } /* check if a mixin is to be called. don't use mixins on next method calls, since normally it is not intercepted (it is used as a primitive command). don't use mixins on init calls, since init is invoked on mixins during mixin registration (in XOTclOMixinMethod) */ if ((obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) == XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { mixinStackPushed = MixinStackPush(obj); if (frameType != XOTCL_CSC_TYPE_ACTIVE_FILTER) { cmd = MixinSearchProc(interp, obj, methodName, &cl, &obj->mixinStack->currentCmdPtr); if (cmd) { frameType = XOTCL_CSC_TYPE_ACTIVE_MIXIN; } else { /* the else branch could be deleted */ MixinStackPop(obj); mixinStackPushed = 0; } } } #ifdef AUTOVARS } #endif /* if no filter/mixin is found => do ordinary method lookup */ if (cmd == NULL) { if (obj->nsPtr) { cmd = FindMethod(methodName, obj->nsPtr); /* fprintf(stderr,"lookup for proc in obj %p method %s nsPtr %p => %p\n", obj, methodName, obj->nsPtr, cmd);*/ } /*fprintf(stderr,"findMethod for proc '%s' in %p returned %p\n", methodName, obj->nsPtr, cmd);*/ if (cmd == NULL) { if (obj->cl->order == NULL) obj->cl->order = TopoOrder(obj->cl, Super); cl = SearchPLMethod(obj->cl->order, methodName, &cmd); /* cl = SearchCMethod(obj->cl, methodName, &cmd); */ } } if (cmd) { if ((result = DoCallProcCheck(cd, interp, objc-1, objv+1, cmd, obj, cl, methodName, frameType)) == TCL_ERROR) { result = XOTclErrInProc(interp, cmdName, cl ? cl->object.cmdName : NULL, methodName); } if (RUNTIME_STATE(interp)->unknown && (frameType & XOTCL_CSC_TYPE_ACTIVE_FILTER)) { /*fprintf(stderr, "use saved unknown %d frameType %.6x\n", RUNTIME_STATE(interp)->unknown, frameType);*/ unknown = 1; } else { unknown = 0; } } else { unknown = 1; } if (result == TCL_OK) { /*fprintf(stderr,"after doCallProcCheck unknown == %d\n", unknown);*/ if (unknown) { if (XOTclObjectIsClass(obj) && (flags & XOTCL_CM_NO_UNKNOWN)) { return XOTclVarErrMsg(interp, ObjStr(objv[0]), ": unable to dispatch method '", methodName, "'", (char *) NULL); } else if (objv[1] != XOTclGlobalObjects[XOTE_UNKNOWN]) { /* * back off and try unknown; */ XOTclObject *obj = (XOTclObject*)cd; ALLOC_ON_STACK(Tcl_Obj*, objc+1, tov); /*fprintf(stderr,"... calling unknown for %s %s, flgs=%02x,%02x isClass=%d %p %s\n", ObjStr(obj->cmdName), ObjStr(objv[1]), flags, XOTCL_CM_NO_UNKNOWN, XOTclObjectIsClass(obj), obj, ObjStr(obj->cmdName));*/ tov[0] = obj->cmdName; tov[1] = XOTclGlobalObjects[XOTE_UNKNOWN]; if (objc>1) memcpy(tov+2, objv+1, sizeof(Tcl_Obj *)*(objc-1)); /* fprintf(stderr,"?? %s unknown %s\n", ObjStr(obj->cmdName), ObjStr(tov[2])); */ result = DoDispatch(cd, interp, objc+1, tov, flags | XOTCL_CM_NO_UNKNOWN); FREE_ON_STACK(Tcl_Obj *, tov); } else { /* unknown failed */ return XOTclVarErrMsg(interp, ObjStr(objv[0]), ": unable to dispatch method '", ObjStr(objv[2]), "'", (char *) NULL); } } } /* be sure to reset unknown flag */ if (unknown) RUNTIME_STATE(interp)->unknown = 0; #ifdef DISPATCH_TRACE printExit(interp,"DISPATCH", objc, objv, result); fprintf(stderr,"obj=%p isDestroy %d\n",obj, rst->callIsDestroy); if (!rst->callIsDestroy) { fprintf(stderr,"obj %p mixinStackPushed %d mixinStack %p\n", obj, mixinStackPushed, obj->mixinStack); } #endif /*if (!rst->callIsDestroy) fprintf(stderr, "obj freed? %p destroy %p self %p %s %d [%d] reference=%d,%d\n", obj, cs->top->destroyedCmd, cs->top->self, ObjStr(objv[1]), rst->callIsDestroy, cs->top->callType & XOTCL_CSC_CALL_IS_DESTROY, !rst->callIsDestroy, isdestroy);*/ if (!rst->callIsDestroy) { /*!(obj->flags & XOTCL_DESTROY_CALLED)) {*/ if (mixinStackPushed && obj->mixinStack) MixinStackPop(obj); if (filterStackPushed && obj->filterStack) FilterStackPop(obj); } DECR_REF_COUNT(cmdName); /* must be after last dereferencing of obj */ return result; } int XOTclObjDispatch(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int result; #ifdef STACK_TRACE XOTclStackDump(interp); #endif #ifdef CALLSTACK_TRACE XOTclCallStackDump(interp); #endif if (objc == 1) { Tcl_Obj *tov[2]; tov[0] = objv[0]; tov[1] = XOTclGlobalObjects[XOTE_DEFAULTMETHOD]; result = DoDispatch(cd, interp, 2, tov, 0); } else { /* normal dispatch */ result = DoDispatch(cd, interp, objc, objv, 0); } return result; } #ifdef XOTCL_BYTECODE int XOTclDirectSelfDispatch(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int result; #ifdef XOTCLOBJ_TRACE XOTclObject *obj; #endif objTrace("BEFORE SELF DISPATCH", obj); result = XOTclObjDispatch((ClientData)GetSelfObj(interp), interp, objc, objv); objTrace("AFTER SELF DISPATCH", obj); return result; } #endif /* * Non Positional Args */ static void NonposArgsDeleteHashEntry(Tcl_HashEntry *hPtr) { XOTclNonposArgs *nonposArg = (XOTclNonposArgs*) Tcl_GetHashValue(hPtr); if (nonposArg) { DECR_REF_COUNT(nonposArg->nonposArgs); DECR_REF_COUNT(nonposArg->ordinaryArgs); MEM_COUNT_FREE("nonposArg", nonposArg); ckfree((char *) nonposArg); Tcl_DeleteHashEntry(hPtr); } } static Tcl_HashTable* NonposArgsCreateTable() { Tcl_HashTable *nonposArgsTable = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable)); MEM_COUNT_ALLOC("Tcl_HashTable", nonposArgsTable); Tcl_InitHashTable(nonposArgsTable, TCL_STRING_KEYS); MEM_COUNT_ALLOC("Tcl_InitHashTable", nonposArgsTable); return nonposArgsTable; } static void NonposArgsFreeTable(Tcl_HashTable *nonposArgsTable) { Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = nonposArgsTable ? Tcl_FirstHashEntry(nonposArgsTable, &hSrch) : 0; for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { NonposArgsDeleteHashEntry(hPtr); } } static XOTclNonposArgs* NonposArgsGet(Tcl_HashTable *nonposArgsTable, char * methodName) { Tcl_HashEntry *hPtr; if (nonposArgsTable && ((hPtr = XOTcl_FindHashEntry(nonposArgsTable, methodName)))) { return (XOTclNonposArgs*) Tcl_GetHashValue(hPtr); } return NULL; } static Tcl_Obj* NonposArgsFormat(Tcl_Interp *interp, Tcl_Obj *nonposArgsData) { int r1, npalistc, npac, checkc; Tcl_Obj **npalistv, **npav, **checkv, *list = Tcl_NewListObj(0, NULL); /*fprintf(stderr, "nonposargsformat '%s'\n", ObjStr(nonposArgsData));*/ r1 = Tcl_ListObjGetElements(interp, nonposArgsData, &npalistc, &npalistv); if (r1 == TCL_OK) { int i, j; for (i=0; i < npalistc; i++) { r1 = Tcl_ListObjGetElements(interp, npalistv[i], &npac, &npav); if (r1 == TCL_OK) { Tcl_Obj *innerlist, *nameStringObj; nameStringObj = Tcl_NewStringObj("-", 1); Tcl_AppendStringsToObj(nameStringObj, ObjStr(npav[0]), (char *) NULL); if (npac > 1 && *(ObjStr(npav[1])) != '\0') { r1 = Tcl_ListObjGetElements(interp, npav[1], &checkc, &checkv); if (r1 == TCL_OK) { int first = 1; for (j=0; j < checkc; j++) { if (first) { Tcl_AppendToObj(nameStringObj,":", 1); first = 0; } else { Tcl_AppendToObj(nameStringObj,",", 1); } Tcl_AppendToObj(nameStringObj, ObjStr(checkv[j]), -1); } } } /* fprintf(stderr, "nonposargsformat namestring '%s'\n", ObjStr(nameStringObj));*/ #if 1 innerlist = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(interp, innerlist, nameStringObj); if (npac > 2) { Tcl_ListObjAppendElement(interp, innerlist, npav[2]); } #else { Tcl_DString ds, *dsPtr = &ds; DSTRING_INIT(dsPtr); Tcl_DStringAppend(dsPtr, ObjStr(nameStringObj), -1); if (npac > 2) { Tcl_DStringAppendElement(dsPtr, ObjStr(npav[2])); } innerlist = Tcl_NewStringObj(Tcl_DStringValue(dsPtr), Tcl_DStringLength(dsPtr)); DSTRING_FREE(dsPtr); } #endif Tcl_ListObjAppendElement(interp, list, innerlist); } } } return list; } /* * Proc-Creation */ static Tcl_Obj *addPrefixToBody(Tcl_Obj *body, int nonposArgs) { Tcl_Obj *resultBody; resultBody = Tcl_NewStringObj("", 0); INCR_REF_COUNT(resultBody); #if defined(PRE85) || defined(NRE) Tcl_AppendStringsToObj(resultBody, "::xotcl::initProcNS\n", (char *) NULL); #endif if (nonposArgs) { Tcl_AppendStringsToObj(resultBody, "::xotcl::interpretNonpositionalArgs $args\n", (char *) NULL); } Tcl_AppendStringsToObj(resultBody, ObjStr(body), (char *) NULL); return resultBody; } static int parseNonposArgs(Tcl_Interp *interp, char *procName, Tcl_Obj *npArgs, Tcl_Obj *ordinaryArgs, Tcl_HashTable **nonposArgsTable, int *haveNonposArgs) { int rc, nonposArgsDefc, npac; Tcl_Obj **nonposArgsDefv; rc = Tcl_ListObjGetElements(interp, npArgs, &nonposArgsDefc, &nonposArgsDefv); if (rc != TCL_OK) { return XOTclVarErrMsg(interp, "cannot break down non-positional args: ", ObjStr(npArgs), (char *) NULL); } if (nonposArgsDefc > 0) { int start, end, i, j, nw = 0; Tcl_Obj **npav, *nonposArgsObj = Tcl_NewListObj(0, NULL); INCR_REF_COUNT(nonposArgsObj); for (i=0; i < nonposArgsDefc; i++) { Tcl_Obj *npaObj; int length; char *arg; rc = Tcl_ListObjGetElements(interp, nonposArgsDefv[i], &npac, &npav); if (rc == TCL_ERROR || npac < 1 || npac > 2) { DECR_REF_COUNT(nonposArgsObj); return XOTclVarErrMsg(interp, "wrong # of elements in non-positional args ", "(should be 1 or 2 list elements): ", ObjStr(npArgs), (char *) NULL); } npaObj = Tcl_NewListObj(0, NULL); arg = ObjStr(npav[0]); if (arg[0] != '-') { DECR_REF_COUNT(npaObj); DECR_REF_COUNT(nonposArgsObj); return XOTclVarErrMsg(interp, "non-positional args does not start with '-': ", arg, " in: ", ObjStr(npArgs), (char *) NULL); } length = strlen(arg); for (j=0; j0 && isspace((int)arg[end-1]); end--); Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj(arg+start, end-start)); l++; start = l; while (start0 && isspace((int)arg[end-1]); end--); Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj(arg+start, end-start)); /* append the whole thing to the list */ Tcl_ListObjAppendElement(interp, npaObj, list); } else { Tcl_ListObjAppendElement(interp, npaObj, Tcl_NewStringObj(arg+1, length)); Tcl_ListObjAppendElement(interp, npaObj, Tcl_NewStringObj("", 0)); } if (npac == 2) { Tcl_ListObjAppendElement(interp, npaObj, npav[1]); } Tcl_ListObjAppendElement(interp, nonposArgsObj, npaObj); *haveNonposArgs = 1; } if (*haveNonposArgs) { XOTclNonposArgs *nonposArg; Tcl_HashEntry *hPtr; if (*nonposArgsTable == NULL) { *nonposArgsTable = NonposArgsCreateTable(); } hPtr = Tcl_CreateHashEntry(*nonposArgsTable, procName, &nw); assert(nw); MEM_COUNT_ALLOC("nonposArg", nonposArg); nonposArg = (XOTclNonposArgs*)ckalloc(sizeof(XOTclNonposArgs)); nonposArg->nonposArgs = nonposArgsObj; nonposArg->ordinaryArgs = ordinaryArgs; INCR_REF_COUNT(ordinaryArgs); Tcl_SetHashValue(hPtr, (ClientData)nonposArg); } else { /* for strange reasons, we did not find nonpos-args, although we have definitions */ DECR_REF_COUNT(nonposArgsObj); } } return TCL_OK; } static int MakeProc(Tcl_Namespace *ns, XOTclAssertionStore *aStore, Tcl_HashTable **nonposArgsTable, Tcl_Interp *interp, int objc, Tcl_Obj *objv[], XOTclObject *obj) { int result, haveNonposArgs = 0; TclCallFrame frame, *framePtr = &frame; Tcl_Obj *ov[4]; Tcl_HashEntry *hPtr = NULL; char *procName = ObjStr(objv[1]); if (*nonposArgsTable && (hPtr = XOTcl_FindHashEntry(*nonposArgsTable, procName))) { NonposArgsDeleteHashEntry(hPtr); } ov[0] = objv[0]; ov[1] = objv[1]; if (objc == 5 || objc == 7) { if ((result = parseNonposArgs(interp, procName, objv[2], objv[3], nonposArgsTable, &haveNonposArgs)) != TCL_OK) return result; if (haveNonposArgs) { ov[2] = XOTclGlobalObjects[XOTE_ARGS]; ov[3] = addPrefixToBody(objv[4], 1); } else { /* no nonpos arguments */ ov[2] = objv[3]; ov[3] = addPrefixToBody(objv[4], 0); } } else { #if !defined(XOTCL_DISJOINT_ARGLISTS) int argsc, i; Tcl_Obj **argsv; /* see, if we have nonposArgs in the ordinary argument list */ result = Tcl_ListObjGetElements(interp, objv[2], &argsc, &argsv); if (result != TCL_OK) { return XOTclVarErrMsg(interp, "cannot break args into list: ", ObjStr(objv[2]), (char *) NULL); } for (i=0; i 0) { char *arg = ObjStr(npav[0]); /* fprintf(stderr, "*** argparse1 arg='%s' rc=%d\n", arg, rc);*/ if (*arg == '-') { haveNonposArgs = 1; continue; } } break; } if (haveNonposArgs) { int nrOrdinaryArgs = argsc - i; Tcl_Obj *ordinaryArgs = Tcl_NewListObj(nrOrdinaryArgs, &argsv[i]); Tcl_Obj *nonposArgs = Tcl_NewListObj(i, &argsv[0]); INCR_REF_COUNT(ordinaryArgs); INCR_REF_COUNT(nonposArgs); result = parseNonposArgs(interp, procName, nonposArgs, ordinaryArgs, nonposArgsTable, &haveNonposArgs); DECR_REF_COUNT(ordinaryArgs); DECR_REF_COUNT(nonposArgs); if (result != TCL_OK) return result; } #endif if (haveNonposArgs) { ov[2] = XOTclGlobalObjects[XOTE_ARGS]; ov[3] = addPrefixToBody(objv[3], 1); } else { /* no nonpos arguments */ ov[2] = objv[2]; ov[3] = addPrefixToBody(objv[3], 0); } } #ifdef AUTOVARS { char *p, *body; body = ObjStr(ov[3]); if ((p = strstr(body, "self")) && p != body && *(p-1) != '[') Tcl_AppendStringsToObj(ov[3], "::set self [self]\n", (char *) NULL); if (strstr(body, "proc")) Tcl_AppendStringsToObj(ov[3], "::set proc [self proc]\n", (char *) NULL); if (strstr(body, "class")) Tcl_AppendStringsToObj(ov[3], "::set class [self class]\n", (char *) NULL); } #endif Tcl_PushCallFrame(interp,(Tcl_CallFrame *)framePtr, ns, 0); result = Tcl_ProcObjCmd(0, interp, 4, ov) != TCL_OK; #if defined(NAMESPACEINSTPROCS) { Proc *procPtr = TclFindProc((Interp *)interp, procName); /*fprintf(stderr,"proc=%p cmd=%p ns='%s' objns=%s\n", procPtr, procPtr->cmdPtr, procPtr->cmdPtr->nsPtr->fullName, cmd->nsPtr->fullName);*/ /*** patch the command ****/ if (procPtr) { /* procPtr->cmdPtr = (Command *)obj->id; OLD*/ procPtr->cmdPtr->nsPtr = ((Command *)obj->id)->nsPtr; } } #endif Tcl_PopCallFrame(interp); if (objc == 6 || objc == 7) { int incr = (objc == 6) ? 0:1; AssertionAddProc(interp, ObjStr(objv[1]), aStore, objv[4+incr], objv[5+incr]); } DECR_REF_COUNT(ov[3]); return result; } /* * List-Functions for Info */ static int ListInfo(Tcl_Interp *interp, int isclass) { Tcl_ResetResult(interp); Tcl_AppendElement(interp, "vars"); Tcl_AppendElement(interp, "body"); Tcl_AppendElement(interp, "default"); Tcl_AppendElement(interp, "args"); Tcl_AppendElement(interp, "procs"); Tcl_AppendElement(interp, "commands"); Tcl_AppendElement(interp, "class"); Tcl_AppendElement(interp, "children"); Tcl_AppendElement(interp, "filter"); Tcl_AppendElement(interp, "filterguard"); Tcl_AppendElement(interp, "forward"); Tcl_AppendElement(interp, "info"); Tcl_AppendElement(interp, "invar"); Tcl_AppendElement(interp, "mixin"); Tcl_AppendElement(interp, "methods"); Tcl_AppendElement(interp, "parent"); Tcl_AppendElement(interp, "pre"); Tcl_AppendElement(interp, "post"); Tcl_AppendElement(interp, "precedence"); if (isclass) { Tcl_AppendElement(interp, "superclass"); Tcl_AppendElement(interp, "subclass"); Tcl_AppendElement(interp, "heritage"); Tcl_AppendElement(interp, "instances"); Tcl_AppendElement(interp, "instcommands"); Tcl_AppendElement(interp, "instprocs"); Tcl_AppendElement(interp, "instdefault"); Tcl_AppendElement(interp, "instbody"); Tcl_AppendElement(interp, "instmixin"); Tcl_AppendElement(interp, "instforward"); Tcl_AppendElement(interp, "instmixinof"); Tcl_AppendElement(interp, "mixinof"); Tcl_AppendElement(interp, "classchildren"); Tcl_AppendElement(interp, "classparent"); Tcl_AppendElement(interp, "instfilter"); Tcl_AppendElement(interp, "instfilterguard"); Tcl_AppendElement(interp, "instinvar"); Tcl_AppendElement(interp, "instpre"); Tcl_AppendElement(interp, "instpost"); Tcl_AppendElement(interp, "parameter"); } return TCL_OK; } XOTCLINLINE static int noMetaChars(char *pattern) { register char c, *p = pattern; assert(pattern); for (c=*p; c; c = *++p) { if (c == '*' || c == '[') { return 0; } } return 1; } static int getMatchObject(Tcl_Interp *interp, char **pattern, XOTclObject **matchObject, Tcl_DString *dsPtr) { if (*pattern && noMetaChars(*pattern)) { *matchObject = XOTclpGetObject(interp, *pattern); if (*matchObject) { *pattern = ObjStr((*matchObject)->cmdName); return 1; } else { /* object does not exist */ Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); return -1; } } else { *matchObject = NULL; if (*pattern) { /* * we have a pattern and meta characters, we might have * to prefix it to ovoid abvious errors: since all object * names are prefixed with ::, we add this prefix automatically * to the match pattern, if it does not exist */ if (**pattern && **pattern != ':' && **pattern+1 && **pattern+1 != ':') { /*fprintf(stderr, "pattern is not prefixed '%s'\n",*pattern);*/ Tcl_DStringAppend(dsPtr, "::", -1); Tcl_DStringAppend(dsPtr, *pattern, -1); *pattern = Tcl_DStringValue(dsPtr); /*fprintf(stderr, "prefixed pattern = '%s'\n",*pattern);*/ } } } return 0; } static int ListKeys(Tcl_Interp *interp, Tcl_HashTable *table, char *pattern) { Tcl_HashEntry *hPtr; char *key; if (pattern && noMetaChars(pattern)) { hPtr = table ? XOTcl_FindHashEntry(table, pattern) : 0; if (hPtr) { key = Tcl_GetHashKey(table, hPtr); Tcl_SetResult(interp, key, TCL_VOLATILE); } else { Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); } } else { Tcl_Obj *list = Tcl_NewListObj(0, NULL); Tcl_HashSearch hSrch; hPtr = table ? Tcl_FirstHashEntry(table, &hSrch) : 0; for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { key = Tcl_GetHashKey(table, hPtr); if (!pattern || Tcl_StringMatch(key, pattern)) { Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj(key,-1)); } } Tcl_SetObjResult(interp, list); } return TCL_OK; } #if !defined(PRE85) || FORWARD_COMPATIBLE static int ListVarKeys(Tcl_Interp *interp, Tcl_HashTable *tablePtr, char *pattern) { Tcl_HashEntry *hPtr; if (pattern && noMetaChars(pattern)) { Tcl_Obj *patternObj = Tcl_NewStringObj(pattern, -1); INCR_REF_COUNT(patternObj); hPtr = tablePtr ? XOTcl_FindHashEntry(tablePtr, (char *)patternObj) : 0; if (hPtr) { Var *val = VarHashGetValue(hPtr); Tcl_SetObjResult(interp, VarHashGetKey(val)); } else { Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); } DECR_REF_COUNT(patternObj); } else { Tcl_Obj *list = Tcl_NewListObj(0, NULL); Tcl_HashSearch hSrch; hPtr = tablePtr ? Tcl_FirstHashEntry(tablePtr, &hSrch) : 0; for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { Var *val = VarHashGetValue(hPtr); Tcl_Obj *key = VarHashGetKey(val); if (!pattern || Tcl_StringMatch(ObjStr(key), pattern)) { Tcl_ListObjAppendElement(interp, list, key); } } Tcl_SetObjResult(interp, list); } return TCL_OK; } #endif static int ListVars(Tcl_Interp *interp, XOTclObject *obj, char *pattern) { Tcl_Obj *varlist, *okList, *element; int i, length; TclVarHashTable *varTable = obj->nsPtr ? Tcl_Namespace_varTable(obj->nsPtr) : obj->varTable; #if defined(PRE85) # if FORWARD_COMPATIBLE if (forwardCompatibleMode) { ListVarKeys(interp, VarHashTable(varTable), pattern); } else { ListKeys(interp, varTable, pattern); } # else ListKeys(interp, varTable, pattern); # endif #else ListVarKeys(interp, VarHashTable(varTable), pattern); #endif varlist = Tcl_GetObjResult(interp); Tcl_ListObjLength(interp, varlist, &length); okList = Tcl_NewListObj(0, NULL); for (i=0; icmdName); */ /* } else { */ /* Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); */ /* } */ /* } else { */ /* Tcl_Obj *list = Tcl_NewListObj(0, NULL); */ /* Tcl_HashSearch hSrch; */ /* hPtr = table ? Tcl_FirstHashEntry(table, &hSrch) : 0; */ /* for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { */ /* XOTclObject *obj = (XOTclObject*)Tcl_GetHashKey(table, hPtr); */ /* if (!pattern || Tcl_StringMatch(ObjStr(obj->cmdName), pattern)) { */ /* Tcl_ListObjAppendElement(interp, list, obj->cmdName); */ /* } */ /* } */ /* Tcl_SetObjResult(interp, list); */ /* } */ /* return TCL_OK; */ /* } */ static int ListMethodKeys(Tcl_Interp *interp, Tcl_HashTable *table, char *pattern, int noProcs, int noCmds, int noDups, int onlyForwarder, int onlySetter) { Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = table ? Tcl_FirstHashEntry(table, &hSrch) : 0; for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(table, hPtr); Tcl_Command cmd = (Tcl_Command)Tcl_GetHashValue(hPtr); Tcl_ObjCmdProc *proc = Tcl_Command_objProc(cmd); if (pattern && !Tcl_StringMatch(key, pattern)) continue; if (noCmds && proc != RUNTIME_STATE(interp)->objInterpProc) continue; if (noProcs && proc == RUNTIME_STATE(interp)->objInterpProc) continue; if (onlyForwarder && proc != XOTclForwardMethod) continue; if (onlySetter && proc != XOTclSetterMethod) continue; /* XOTclObjscopedMethod ??? */ if (noDups) { int listc; Tcl_Obj **listv; int result = Tcl_ListObjGetElements(interp, Tcl_GetObjResult(interp), &listc, &listv); size_t keylen = strlen(key); if (result == TCL_OK) { int found = 0, i; for (i=0; iprefix) { Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj("-methodprefix",-1)); Tcl_ListObjAppendElement(interp, list, tcd->prefix); } if (tcd->subcommands) { Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj("-default",-1)); Tcl_ListObjAppendElement(interp, list, tcd->subcommands); } if (tcd->objscope) { Tcl_ListObjAppendElement(interp, list, Tcl_NewStringObj("-objscope",-1)); } Tcl_ListObjAppendElement(interp, list, tcd->cmdName); if (tcd->args) { Tcl_Obj **args; int nrArgs, i; Tcl_ListObjGetElements(interp, tcd->args, &nrArgs, &args); for (i=0; insPtr) { Tcl_HashTable *cmdTable = Tcl_Namespace_cmdTable(obj->nsPtr); ListMethodKeys(interp, cmdTable, pattern, noProcs, noCmds, 0, 0, 0); } if (!noMixins) { if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { XOTclCmdList *ml; for (ml = obj->mixinOrder; ml; ml = ml->next) { int guardOk = TCL_OK; XOTclClass *mixin = XOTclGetClassFromCmdPtr(ml->cmdPtr); if (inContext) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; if (!cs->guardCount) { guardOk = GuardCall(obj, 0, 0, interp, ml->clientData, 1); } } if (mixin && guardOk == TCL_OK) { Tcl_HashTable *cmdTable = Tcl_Namespace_cmdTable(mixin->nsPtr); ListMethodKeys(interp, cmdTable, pattern, noProcs, noCmds, 1, 0, 0); } } } } /* append per-class filters */ for (pl = ComputeOrder(obj->cl, obj->cl->order, Super); pl; pl = pl->next) { Tcl_HashTable *cmdTable = Tcl_Namespace_cmdTable(pl->cl->nsPtr); ListMethodKeys(interp, cmdTable, pattern, noProcs, noCmds, 1, 0, 0); } return TCL_OK; } static int ListClass(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]) { Tcl_SetObjResult(interp, obj->cl->object.cmdName); return TCL_OK; } static int ListHeritage(Tcl_Interp *interp, XOTclClass *cl, char *pattern) { XOTclClasses *pl = ComputeOrder(cl, cl->order, Super); Tcl_ResetResult(interp); if (pl) pl=pl->next; for (; pl; pl = pl->next) { AppendMatchingElement(interp, pl->cl->object.cmdName, pattern); } return TCL_OK; } static int ListPrecedence(Tcl_Interp *interp, XOTclObject *obj, char *pattern, int intrinsicOnly) { XOTclClasses *pl; Tcl_ResetResult(interp); if (!intrinsicOnly) { if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { XOTclCmdList *ml = obj->mixinOrder; for (; ml; ml = ml->next) { XOTclClass *mixin = XOTclGetClassFromCmdPtr(ml->cmdPtr); AppendMatchingElement(interp, mixin->object.cmdName, pattern); } } } for (pl = ComputeOrder(obj->cl, obj->cl->order, Super); pl; pl = pl->next) { AppendMatchingElement(interp, pl->cl->object.cmdName, pattern); } return TCL_OK; } static Proc* FindProc(Tcl_Interp *interp, Tcl_HashTable *table, char *name) { Tcl_HashEntry *hPtr = table ? XOTcl_FindHashEntry(table, name) : 0; if (hPtr) { Tcl_Command cmd = (Tcl_Command)Tcl_GetHashValue(hPtr); Tcl_ObjCmdProc *proc = Tcl_Command_objProc(cmd); if (proc == RUNTIME_STATE(interp)->objInterpProc) return (Proc*) Tcl_Command_objClientData(cmd); #if USE_INTERP_PROC else if ((Tcl_CmdProc*)proc == RUNTIME_STATE(interp)->interpProc) return (Proc*) Tcl_Command_clientData(cmd); #endif } return 0; } static int ListProcArgs(Tcl_Interp *interp, Tcl_HashTable *table, char *name) { Proc *proc = FindProc(interp, table, name); if (proc) { CompiledLocal *args = proc->firstLocalPtr; Tcl_ResetResult(interp); for ( ; args; args = args->nextPtr) { if (TclIsCompiledLocalArgument(args)) Tcl_AppendElement(interp, args->name); } return TCL_OK; } return XOTclErrBadVal(interp, "info args", "a tcl method name", name); } static void AppendOrdinaryArgsFromNonposArgs(Tcl_Interp *interp, XOTclNonposArgs *nonposArgs, int varsOnly, Tcl_Obj *argList) { int i, rc, ordinaryArgsDefc, defaultValueObjc; Tcl_Obj **ordinaryArgsDefv, **defaultValueObjv; rc = Tcl_ListObjGetElements(interp, nonposArgs->ordinaryArgs, &ordinaryArgsDefc, &ordinaryArgsDefv); for (i=0; i < ordinaryArgsDefc; i++) { Tcl_Obj *ordinaryArg = ordinaryArgsDefv[i]; rc = Tcl_ListObjGetElements(interp, ordinaryArg, &defaultValueObjc, &defaultValueObjv); if (rc == TCL_OK) { if (varsOnly && defaultValueObjc == 2) { Tcl_ListObjAppendElement(interp, argList, defaultValueObjv[0]); } else { Tcl_ListObjAppendElement(interp, argList, ordinaryArg); } } } } static int ListArgsFromOrdinaryArgs(Tcl_Interp *interp, XOTclNonposArgs *nonposArgs) { Tcl_Obj *argList = Tcl_NewListObj(0, NULL); AppendOrdinaryArgsFromNonposArgs(interp, nonposArgs, 1, argList); Tcl_SetObjResult(interp, argList); return TCL_OK; } static int GetProcDefault(Tcl_Interp *interp, Tcl_HashTable *table, char *name, char *arg, Tcl_Obj **resultObj) { Proc *proc = FindProc(interp, table, name); *resultObj = NULL; if (proc) { CompiledLocal *ap; for (ap = proc->firstLocalPtr; ap; ap = ap->nextPtr) { if (!TclIsCompiledLocalArgument(ap)) continue; if (strcmp(arg, ap->name) != 0) continue; if (ap->defValuePtr) { *resultObj = ap->defValuePtr; return TCL_OK; } return TCL_OK; } } return TCL_ERROR; } static int SetProcDefault(Tcl_Interp *interp, Tcl_Obj *var, Tcl_Obj *defVal) { int result = TCL_OK; callFrameContext ctx = {0}; CallStackUseActiveFrames(interp,&ctx); if (defVal) { if (Tcl_ObjSetVar2(interp, var, NULL, defVal, 0)) { Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); } else { result = TCL_ERROR; } } else { if (Tcl_ObjSetVar2(interp, var, NULL, XOTclGlobalObjects[XOTE_EMPTY], 0)) { Tcl_SetIntObj(Tcl_GetObjResult(interp), 0); } else { result = TCL_ERROR; } } CallStackRestoreSavedFrames(interp, &ctx); if (result == TCL_ERROR) { XOTclVarErrMsg(interp, "couldn't store default value in variable '", var, "'", (char *) NULL); } return result; } static int ListProcDefault(Tcl_Interp *interp, Tcl_HashTable *table, char *name, char *arg, Tcl_Obj *var) { Tcl_Obj *defVal; int result; if (GetProcDefault(interp, table, name, arg, &defVal) == TCL_OK) { result = SetProcDefault(interp, var, defVal); } else { XOTclVarErrMsg(interp, "method '", name, "' doesn't exist or doesn't have an argument '", arg, "'", (char *) NULL); result = TCL_ERROR; } return result; } static int ListDefaultFromOrdinaryArgs(Tcl_Interp *interp, char *procName, XOTclNonposArgs *nonposArgs, char *arg, Tcl_Obj *var) { int i, rc, ordinaryArgsDefc, defaultValueObjc; Tcl_Obj **ordinaryArgsDefv, **defaultValueObjv; rc = Tcl_ListObjGetElements(interp, nonposArgs->ordinaryArgs, &ordinaryArgsDefc, &ordinaryArgsDefv); if (rc != TCL_OK) return TCL_ERROR; for (i=0; i < ordinaryArgsDefc; i++) { Tcl_Obj *ordinaryArg = ordinaryArgsDefv[i]; rc = Tcl_ListObjGetElements(interp, ordinaryArg, &defaultValueObjc, &defaultValueObjv); /*fprintf(stderr, "arg='%s', *arg==0 %d, defaultValueObjc=%d\n", arg, *arg==0, defaultValueObjc);*/ if (rc == TCL_OK) { if (defaultValueObjc > 0 && !strcmp(arg, ObjStr(defaultValueObjv[0]))) { return SetProcDefault(interp, var, defaultValueObjc == 2 ? defaultValueObjv[1] : NULL); } else if (defaultValueObjc == 0 && *arg == 0) { return SetProcDefault(interp, var, NULL); } } } XOTclVarErrMsg(interp, "method '", procName, "' doesn't have an argument '", arg, "'", (char *) NULL); return TCL_ERROR; } static char * StripBodyPrefix(char *body) { #if defined(PRE85) || defined(NRE) if (strncmp(body, "::xotcl::initProcNS\n", 20) == 0) body+=20; #endif if (strncmp(body, "::xotcl::interpretNonpositionalArgs $args\n", 42) == 0) body+=42; /*fprintf(stderr, "--- returing body ***%s***\n", body);*/ return body; } static int ListProcBody(Tcl_Interp *interp, Tcl_HashTable *table, char *name) { Proc *proc = FindProc(interp, table, name); if (proc) { char *body = ObjStr(proc->bodyPtr); Tcl_SetObjResult(interp, Tcl_NewStringObj(StripBodyPrefix(body), -1)); return TCL_OK; } return XOTclErrBadVal(interp, "info body", "a tcl method name", name); } static int ListChildren(Tcl_Interp *interp, XOTclObject *obj, char *pattern, int classesOnly) { XOTclObject *childobj; Tcl_HashTable *cmdTable; XOTcl_FrameDecls; if (!obj->nsPtr) return TCL_OK; cmdTable = Tcl_Namespace_cmdTable(obj->nsPtr); if (pattern && noMetaChars(pattern)) { XOTcl_PushFrame(interp, obj); if ((childobj = XOTclpGetObject(interp, pattern)) && (!classesOnly || XOTclObjectIsClass(childobj)) && (childobj->id && Tcl_Command_nsPtr(childobj->id) == obj->nsPtr) /* true children */ ) { Tcl_SetObjResult(interp, childobj->cmdName); } else { Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); } XOTcl_PopFrame(interp, obj); } else { Tcl_Obj *list = Tcl_NewListObj(0, NULL); Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = Tcl_FirstHashEntry(cmdTable, &hSrch); XOTcl_PushFrame(interp, obj); for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(cmdTable, hPtr); if (!pattern || Tcl_StringMatch(key, pattern)) { if ((childobj = XOTclpGetObject(interp, key)) && (!classesOnly || XOTclObjectIsClass(childobj)) && (childobj->id && Tcl_Command_nsPtr(childobj->id) == obj->nsPtr) /* true children */ ) { Tcl_ListObjAppendElement(interp, list, childobj->cmdName); } } } XOTcl_PopFrame(interp, obj); Tcl_SetObjResult(interp, list); } return TCL_OK; } static int ListParent(Tcl_Interp *interp, XOTclObject *obj) { if (obj->id) { Tcl_SetResult(interp, NSCmdFullName(obj->id), TCL_VOLATILE); } return TCL_OK; } static XOTclClass* FindCalledClass(Tcl_Interp *interp, XOTclObject *obj) { XOTclCallStackContent *csc = CallStackGetTopFrame(interp); char *methodName; Tcl_Command cmd; if (csc->frameType == XOTCL_CSC_TYPE_PLAIN) return GetSelfClass(interp); if (csc->frameType == XOTCL_CSC_TYPE_ACTIVE_FILTER) methodName = ObjStr(csc->filterStackEntry->calledProc); else if (csc->frameType == XOTCL_CSC_TYPE_ACTIVE_MIXIN && obj->mixinStack) methodName = (char *) GetSelfProc(interp); else methodName = ""; if (obj->nsPtr) { cmd = FindMethod(methodName, obj->nsPtr); if (cmd) { return NULL; } } return SearchCMethod(obj->cl, methodName, &cmd); } /* * Next Primitive Handling */ XOTCLINLINE static void NextSearchMethod(XOTclObject *obj, Tcl_Interp *interp, XOTclCallStackContent *csc, XOTclClass **cl, char **method, Tcl_Command *cmd, int *isMixinEntry, int *isFilterEntry, int *endOfFilterChain, Tcl_Command *currentCmd) { XOTclClasses *pl = 0; int endOfChain = 0; *endOfFilterChain = 0; /* * Next in filters */ /*assert(obj->flags & XOTCL_FILTER_ORDER_VALID); *** strange, worked before ****/ FilterComputeDefined(interp, obj); if ((obj->flags & XOTCL_FILTER_ORDER_VALID) && obj->filterStack && obj->filterStack->currentCmdPtr) { *cmd = FilterSearchProc(interp, obj, currentCmd, cl); /*fprintf(stderr,"EndOfChain? proc=%p, cmd=%p\n",*proc,*cmd);*/ /* XOTclCallStackDump(interp); XOTclStackDump(interp);*/ if (*cmd == 0) { if (csc->frameType == XOTCL_CSC_TYPE_ACTIVE_FILTER) { /* reset the information to the values of method, cl to the values they had before calling the filters */ *method = ObjStr(obj->filterStack->calledProc); endOfChain = 1; *endOfFilterChain = 1; *cl = 0; /*fprintf(stderr,"EndOfChain resetting cl\n");*/ } } else { *method = (char *) Tcl_GetCommandName(interp, *cmd); *isFilterEntry = 1; return; } } /* * Next in Mixins */ assert(obj->flags & XOTCL_MIXIN_ORDER_VALID); /* otherwise: MixinComputeDefined(interp, obj); */ /*fprintf(stderr,"nextsearch: mixinorder valid %d stack=%p\n", obj->flags & XOTCL_MIXIN_ORDER_VALID, obj->mixinStack);*/ if ((obj->flags & XOTCL_MIXIN_ORDER_VALID) && obj->mixinStack) { *cmd = MixinSearchProc(interp, obj, *method, cl, currentCmd); /*fprintf(stderr,"nextsearch: mixinsearch cmd %p, currentCmd %p\n",*cmd, *currentCmd);*/ if (*cmd == 0) { if (csc->frameType == XOTCL_CSC_TYPE_ACTIVE_MIXIN) { endOfChain = 1; *cl = 0; } } else { *isMixinEntry = 1; return; } } /* * otherwise: normal method dispatch * * if we are already in the precedence ordering, then advance * past our last point; otherwise (if cl==0) begin from the start */ /* if a mixin or filter chain has ended -> we have to search the obj-specific methods as well */ if (obj->nsPtr && endOfChain) { *cmd = FindMethod(*method, obj->nsPtr); } else { *cmd = 0; } if (!*cmd) { for (pl = ComputeOrder(obj->cl, obj->cl->order, Super); pl && *cl; pl = pl->next) { if (pl->cl == *cl) *cl = 0; } /* * search for a further class method */ *cl = SearchPLMethod(pl, *method, cmd); /*fprintf(stderr, "no cmd, cl = %p %s\n",*cl, ObjStr((*cl)->object.cmdName));*/ } else { *cl = 0; } return; } static int XOTclNextMethod(XOTclObject *obj, Tcl_Interp *interp, XOTclClass *givenCl, char *givenMethod, int objc, Tcl_Obj *CONST objv[], int useCallstackObjs) { XOTclCallStackContent *csc = CallStackGetTopFrame(interp); Tcl_Command cmd, currentCmd = NULL; int result = TCL_OK, isMixinEntry = 0, isFilterEntry = 0, endOfFilterChain = 0, decrObjv0 = 0; int nobjc; Tcl_Obj **nobjv; XOTclClass **cl = &givenCl; char **methodName = &givenMethod; #if !defined(NDEBUG) if (useCallstackObjs) { Tcl_CallFrame *cf = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); int found = 0; while (cf) { /* fprintf(stderr, " ... compare fp = %p and cfp %p procFrame %p oc=%d\n", cf, csc->currentFramePtr, Tcl_Interp_framePtr(interp), Tcl_CallFrame_objc(Tcl_Interp_framePtr(interp)) );*/ if (cf == csc->currentFramePtr) { found = 1; break; } cf = (Tcl_CallFrame *)((CallFrame *)cf)->callerPtr; } /* if (!found) { if (Tcl_Interp_varFramePtr(interp)) { fprintf(stderr,"found (csc->currentFramePtr %p)= %d cur level=%d\n", csc->currentFramePtr, found, Tcl_CallFrame_level(Tcl_Interp_varFramePtr(interp))); } else { fprintf(stderr,"no varFramePtr\n"); } return TCL_OK; } */ } #endif /*fprintf(stderr,"givenMethod = %s, csc = %p, useCallstackObj %d, objc %d currentFramePtr %p\n", givenMethod, csc, useCallstackObjs, objc, csc->currentFramePtr);*/ /* if no args are given => use args from stack */ if (objc < 2 && useCallstackObjs && csc->currentFramePtr) { nobjc = Tcl_CallFrame_objc(csc->currentFramePtr); nobjv = (Tcl_Obj **)Tcl_CallFrame_objv(csc->currentFramePtr); } else { nobjc = objc; nobjv = (Tcl_Obj **)objv; /* We do not want to have "next" as the procname, since this can lead to unwanted results e.g. in a forwarder using %proc. So, we replace the first word with the value from the callstack to be compatible with the case where next is called without args. */ if (useCallstackObjs && csc->currentFramePtr) { nobjv[0] = Tcl_CallFrame_objv(csc->currentFramePtr)[0]; INCR_REF_COUNT(nobjv[0]); /* we seem to need this here */ decrObjv0 = 1; } } /* * Search the next method & compute its method data */ NextSearchMethod(obj, interp, csc, cl, methodName, &cmd, &isMixinEntry, &isFilterEntry, &endOfFilterChain, ¤tCmd); /* fprintf(stderr, "NextSearchMethod -- RETURN: method=%s eoffc=%d,", *methodName, endOfFilterChain); if (obj) fprintf(stderr, " obj=%s,", ObjStr(obj->cmdName)); if ((*cl)) fprintf(stderr, " cl=%s,", (*cl)->nsPtr->fullName); fprintf(stderr, " mixin=%d, filter=%d, proc=%p\n", isMixinEntry, isFilterEntry, proc); */ Tcl_ResetResult(interp); /* needed for bytecode support */ if (cmd) { int frameType = XOTCL_CSC_TYPE_PLAIN; /* * change mixin state */ if (obj->mixinStack) { if (csc->frameType == XOTCL_CSC_TYPE_ACTIVE_MIXIN) csc->frameType = XOTCL_CSC_TYPE_INACTIVE_MIXIN; /* otherwise move the command pointer forward */ if (isMixinEntry) { frameType = XOTCL_CSC_TYPE_ACTIVE_MIXIN; obj->mixinStack->currentCmdPtr = currentCmd; } } /* * change filter state */ if (obj->filterStack) { if (csc->frameType == XOTCL_CSC_TYPE_ACTIVE_FILTER) csc->frameType = XOTCL_CSC_TYPE_INACTIVE_FILTER; /* otherwise move the command pointer forward */ if (isFilterEntry) { frameType = XOTCL_CSC_TYPE_ACTIVE_FILTER; obj->filterStack->currentCmdPtr = currentCmd; } } /* * now actually call the "next" method */ /* cut the flag, that no stdargs should be used, if it is there */ if (nobjc > 1) { char *nobjv1 = ObjStr(nobjv[1]); if (nobjv1[0] == '-' && !strcmp(nobjv1, "--noArgs")) nobjc = 1; } csc->callType |= XOTCL_CSC_CALL_IS_NEXT; RUNTIME_STATE(interp)->unknown = 0; result = DoCallProcCheck((ClientData)obj, interp, nobjc, nobjv, cmd, obj, *cl, *methodName, frameType); csc->callType &= ~XOTCL_CSC_CALL_IS_NEXT; if (csc->frameType == XOTCL_CSC_TYPE_INACTIVE_FILTER) csc->frameType = XOTCL_CSC_TYPE_ACTIVE_FILTER; else if (csc->frameType == XOTCL_CSC_TYPE_INACTIVE_MIXIN) csc->frameType = XOTCL_CSC_TYPE_ACTIVE_MIXIN; } else if (result == TCL_OK && endOfFilterChain) { /*fprintf(stderr,"setting unknown to 1\n");*/ RUNTIME_STATE(interp)->unknown = 1; } if (decrObjv0) { INCR_REF_COUNT(nobjv[0]); } return result; } int XOTclNextObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclCallStackContent *csc = CallStackGetTopFrame(interp); if (!csc->self) return XOTclVarErrMsg(interp, "next: can't find self", (char *) NULL); if (!csc->cmdPtr) return XOTclErrMsg(interp, "next: no executing proc", TCL_STATIC); return XOTclNextMethod(csc->self, interp, csc->cl, (char *)Tcl_GetCommandName(interp, csc->cmdPtr), objc, objv, 1); } int XOTclQualifyObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *string; if (objc != 2) return XOTclVarErrMsg(interp, "wrong # of args for __qualify", (char *) NULL); string = ObjStr(objv[1]); if (!isAbsolutePath(string)) { Tcl_SetObjResult(interp, NameInNamespaceObj(interp, string, callingNameSpace(interp))); } else { Tcl_SetObjResult(interp, objv[1]); } return TCL_OK; } /* method for calling e.g. $obj __next */ static int XOTclONextMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc = CallStackGetTopFrame(interp); char *methodName; for (; csc >= cs->content; csc--) { if (csc->self == obj) break; } if (csccontent) return XOTclVarErrMsg(interp, "__next: can't find object", ObjStr(obj->cmdName), (char *) NULL); methodName = (char *)Tcl_GetCommandName(interp, csc->cmdPtr); /*fprintf(stderr,"******* next for proc %s\n", methodName);*/ return XOTclNextMethod(obj, interp, csc->cl, methodName, objc-1, &objv[1], 0); } /* * "self" object command */ static int FindSelfNext(Tcl_Interp *interp, XOTclObject *obj) { XOTclCallStackContent *csc = CallStackGetTopFrame(interp); Tcl_Command cmd, currentCmd = 0; int isMixinEntry = 0, isFilterEntry = 0, endOfFilterChain = 0; XOTclClass *cl = csc->cl; XOTclObject *o = csc->self; char *methodName; Tcl_ResetResult(interp); methodName = (char *)GetSelfProc(interp); if (!methodName) return TCL_OK; NextSearchMethod(o, interp, csc, &cl, &methodName, &cmd, &isMixinEntry, &isFilterEntry, &endOfFilterChain, ¤tCmd); if (cmd) { Tcl_SetObjResult(interp, getFullProcQualifier(interp, Tcl_GetCommandName(interp, cmd), o, cl, cmd)); } return TCL_OK; } static Tcl_Obj * computeLevelObj(Tcl_Interp *interp, CallStackLevel level) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc; Tcl_Obj *resultObj; switch (level) { case CALLING_LEVEL: csc = XOTclCallStackFindLastInvocation(interp, 1); break; case ACTIVE_LEVEL: csc = XOTclCallStackFindActiveFrame(interp, 1); break; default: csc = NULL; } if (cs->top->currentFramePtr == ((Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp)) && csc && csc < cs->top && csc->currentFramePtr) { /* this was from an xotcl frame, return absolute frame number */ char buffer[LONG_AS_STRING]; int l; buffer[0] = '#'; /* fprintf(stderr,"*** csc=%p\n", csc);*/ XOTcl_ltoa(buffer+1,(long)Tcl_CallFrame_level(csc->currentFramePtr),&l); resultObj = Tcl_NewStringObj(buffer, l+1); } else { /* If not called from an xotcl frame, return 1 as default */ resultObj = Tcl_NewIntObj(1); } /*XOTclStackDump(interp);XOTclCallStackDump(interp);*/ return resultObj; } static int XOTclSelfSubCommand(Tcl_Interp *interp, XOTclObject *obj, char *option) { assert(option); if (isProcString(option)) { /* proc subcommand */ char *procName = (char *) GetSelfProc(interp); if (procName) { Tcl_SetResult(interp, procName, TCL_VOLATILE); return TCL_OK; } else { return XOTclVarErrMsg(interp, "Can't find proc", (char *) NULL); } } else if (isClassString(option)) { /* class subcommand */ XOTclClass *cl = GetSelfClass(interp); Tcl_SetObjResult(interp, cl ? cl->object.cmdName : XOTclGlobalObjects[XOTE_EMPTY]); return TCL_OK; } else { XOTclCallStackContent *csc = NULL; switch (*option) { /* other callstack information */ case 'a': if (!strcmp(option, "activelevel")) { Tcl_SetObjResult(interp, computeLevelObj(interp, ACTIVE_LEVEL)); return TCL_OK; } else if (!strcmp(option,"args")) { int nobjc; Tcl_Obj **nobjv; csc = CallStackGetTopFrame(interp); nobjc = Tcl_CallFrame_objc(csc->currentFramePtr); nobjv = (Tcl_Obj **)Tcl_CallFrame_objv(csc->currentFramePtr); Tcl_SetObjResult(interp, Tcl_NewListObj(nobjc-1, nobjv+1)); return TCL_OK; } #if defined(ACTIVEMIXIN) else if (!strcmp(option, "activemixin")) { XOTclObject *o = NULL; csc = CallStackGetTopFrame(interp); /*CmdListPrint(interp,"self a....\n", obj->mixinOrder); fprintf(stderr,"current cmdPtr = %p cl = %p, mo=%p %p\n", csc->cmdPtr, csc->cl, obj->mixinOrder, RUNTIME_STATE(interp)->cmdPtr);*/ if (RUNTIME_STATE(interp)->cmdPtr) { o = XOTclGetObjectFromCmdPtr(RUNTIME_STATE(interp)->cmdPtr); } Tcl_SetObjResult(interp, o ? o->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); return TCL_OK; } #endif break; case 'c': if (!strcmp(option, "calledproc")) { if (!(csc = CallStackFindActiveFilter(interp))) return XOTclVarErrMsg(interp, "self calledproc called from outside of a filter", (char *) NULL); Tcl_SetObjResult(interp, csc->filterStackEntry->calledProc); return TCL_OK; } else if (!strcmp(option, "calledclass")) { Tcl_SetResult(interp, className(FindCalledClass(interp, obj)), TCL_VOLATILE); return TCL_OK; } else if (!strcmp(option, "callingproc")) { csc = XOTclCallStackFindLastInvocation(interp, 1); Tcl_SetResult(interp, csc ? (char *)Tcl_GetCommandName(interp, csc->cmdPtr) : "", TCL_VOLATILE); return TCL_OK; } else if (!strcmp(option, "callingclass")) { csc = XOTclCallStackFindLastInvocation(interp, 1); Tcl_SetObjResult(interp, csc && csc->cl ? csc->cl->object.cmdName : XOTclGlobalObjects[XOTE_EMPTY]); return TCL_OK; } else if (!strcmp(option, "callinglevel")) { Tcl_SetObjResult(interp, computeLevelObj(interp, CALLING_LEVEL)); return TCL_OK; } else if (!strcmp(option, "callingobject")) { /*XOTclStackDump(interp); XOTclCallStackDump(interp);*/ csc = XOTclCallStackFindLastInvocation(interp, 1); Tcl_SetObjResult(interp, csc ? csc->self->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); return TCL_OK; } break; case 'f': if (!strcmp(option, "filterreg")) { if (!(csc = CallStackFindActiveFilter(interp))) { return XOTclVarErrMsg(interp, "self filterreg called from outside of a filter", (char *) NULL); } Tcl_SetObjResult(interp, FilterFindReg(interp, obj, GetSelfProcCmdPtr(interp))); return TCL_OK; } break; case 'i': if (!strcmp(option, "isnextcall")) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; csc = cs->top; csc--; Tcl_SetBooleanObj(Tcl_GetObjResult(interp), (csc > cs->content && (csc->callType & XOTCL_CSC_CALL_IS_NEXT))); return TCL_OK; } break; case 'n': if (!strcmp(option, "next")) return FindSelfNext(interp, obj); break; } } return XOTclVarErrMsg(interp, "unknown option '", option, "' for self", (char *) NULL); } /* int XOTclKObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if (objc < 2) return XOTclVarErrMsg(interp, "wrong # of args for K", (char *) NULL); Tcl_SetObjResult(interp, objv[1]); return TCL_OK; } */ int XOTclGetSelfObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj; if (objc > 2) return XOTclVarErrMsg(interp, "wrong # of args for self", (char *) NULL); obj = GetSelfObj(interp); /*fprintf(stderr,"getSelfObj returns %p\n", obj);XOTclCallStackDump(interp);*/ if (!obj) { if (objc == 2 && !strcmp(ObjStr(objv[1]),"callinglevel")) { Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); return TCL_OK; } else { return XOTclVarErrMsg(interp, "self: no current object", (char *) NULL); } } if (objc == 1) { Tcl_SetObjResult(interp, obj->cmdName); return TCL_OK; } else { return XOTclSelfSubCommand(interp, obj, ObjStr(objv[1])); } } /* * object creation & destruction */ static int unsetInAllNamespaces(Tcl_Interp *interp, Namespace *nsPtr, CONST char *name) { int rc = 0; fprintf(stderr, "### unsetInAllNamespaces variable '%s', current namespace '%s'\n", name, nsPtr ? nsPtr->fullName : "NULL"); if (nsPtr) { Tcl_HashSearch search; Tcl_HashEntry *entryPtr = Tcl_FirstHashEntry(&nsPtr->childTable, &search); Tcl_Var *varPtr; varPtr = (Tcl_Var *) Tcl_FindNamespaceVar(interp, name, (Tcl_Namespace *) nsPtr, 0); /*fprintf(stderr, "found %s in %s -> %p\n", name, nsPtr->fullName, varPtr);*/ if (varPtr) { Tcl_DString dFullname, *dsPtr = &dFullname; int result; Tcl_DStringInit(dsPtr); Tcl_DStringAppend(dsPtr, "unset ", -1); Tcl_DStringAppend(dsPtr, nsPtr->fullName, -1); Tcl_DStringAppend(dsPtr, "::", 2); Tcl_DStringAppend(dsPtr, name, -1); /*rc = Tcl_UnsetVar2(interp, Tcl_DStringValue(dsPtr), NULL, TCL_LEAVE_ERR_MSG);*/ result = Tcl_Eval(interp, Tcl_DStringValue(dsPtr)); /* fprintf(stderr, "fqName = '%s' unset => %d %d\n", Tcl_DStringValue(dsPtr), rc, TCL_OK);*/ if (result == TCL_OK) { rc = 1; } else { Tcl_Obj *resultObj = Tcl_GetObjResult(interp); fprintf(stderr, " err = '%s'\n", ObjStr(resultObj)); } Tcl_DStringFree(dsPtr); } while (rc == 0 && entryPtr) { Namespace *childNsPtr = (Namespace *) Tcl_GetHashValue(entryPtr); /*fprintf(stderr, "child = %s\n", childNsPtr->fullName);*/ entryPtr = Tcl_NextHashEntry(&search); rc |= unsetInAllNamespaces(interp, childNsPtr, name); } } return rc; } static int freeUnsetTraceVariable(Tcl_Interp *interp, XOTclObject *obj) { int rc = TCL_OK; obj->flags |= XOTCL_FREE_TRACE_VAR_CALLED; if (obj->opt && obj->opt->volatileVarName) { /* Somebody destroys a volatile object manually while the vartrace is still active. Destroying the object will be a problem in case the variable is deleted later and fires the trace. So, we unset the variable here which will cause a destroy via var trace, which in turn clears the volatileVarName flag. */ /*fprintf(stderr,"### freeUnsetTraceVariable %s\n", obj->opt->volatileVarName);*/ rc = Tcl_UnsetVar2(interp, obj->opt->volatileVarName, NULL, 0); if (rc != TCL_OK) { /* try hard to find variable */ int rc = Tcl_UnsetVar2(interp, obj->opt->volatileVarName, NULL, TCL_GLOBAL_ONLY); if (rc != TCL_OK) { Namespace *nsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp); if (unsetInAllNamespaces(interp, nsPtr, obj->opt->volatileVarName) == 0) { fprintf(stderr, "### don't know how to delete variable '%s' of volatile object\n", obj->opt->volatileVarName); } } } /*if (rc == TCL_OK) { fprintf(stderr, "### success unset\n"); }*/ } return rc; } static char * XOTclUnsetTrace(ClientData cd, Tcl_Interp *interp, CONST84 char *name, CONST84 char *name2, int flags) { Tcl_Obj *obj = (Tcl_Obj *)cd; XOTclObject *o; char *result = NULL; /*fprintf(stderr,"XOTclUnsetTrace %s flags %x %x\n", name, flags, flags & TCL_INTERP_DESTROYED); */ if ((flags & TCL_INTERP_DESTROYED) == 0) { if (XOTclObjConvertObject(interp, obj, &o) == TCL_OK) { /*fprintf(stderr,"XOTclUnsetTrace o %p flags %.6x\n", o, o->flags);*/ /* clear variable, destroy is called from trace */ if (o->opt && o->opt->volatileVarName) { o->opt->volatileVarName = NULL; } if ( o->flags & XOTCL_FREE_TRACE_VAR_CALLED ) { /*fprintf(stderr,"XOTclUnsetTrace o %p remove trace\n", o);*/ Tcl_UntraceVar(interp, name, flags, (Tcl_VarTraceProc*)XOTclUnsetTrace, (ClientData)o); } else { Tcl_Obj *res = Tcl_GetObjResult(interp); /* save the result */ INCR_REF_COUNT(res); if (callMethod((ClientData)o, interp, XOTclGlobalObjects[XOTE_DESTROY], 2, 0, 0) != TCL_OK) { result = "Destroy for volatile object failed"; } else { result = "No XOTcl Object passed"; } Tcl_SetObjResult(interp, res); /* restore the result */ DECR_REF_COUNT(res); } } DECR_REF_COUNT(obj); } else { /*fprintf(stderr, "omitting destroy on %s %p\n", name);*/ } return result; } /* * mark an obj on the existing callstack, as not destroyed */ static void UndestroyObj(Tcl_Interp *interp, XOTclObject *obj) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc; /* * mark the object on the whole callstack as not destroyed */ for (csc = &cs->content[1]; csc <= cs->top; csc++) { if (obj == csc->self && csc->destroyedCmd) { /* * The ref count was incremented, when csc->destroyedCmd * was set. We revert this first before forgetting the * destroyedCmd. */ if (Tcl_Command_refCount(csc->destroyedCmd) > 1) { Tcl_Command_refCount(csc->destroyedCmd)--; MEM_COUNT_FREE("command refCount", csc->destroyedCmd); } csc->destroyedCmd = 0; } } /* * mark obj->flags XOTCL_DESTROY_CALLED as NOT CALLED (0) */ obj->flags &= ~XOTCL_DESTROY_CALLED; } /* * bring an object into a state, as after initialization */ static void CleanupDestroyObject(Tcl_Interp *interp, XOTclObject *obj, int softrecreate) { XOTclClass *thecls, *theobj; thecls = RUNTIME_STATE(interp)->theClass; theobj = RUNTIME_STATE(interp)->theObject; /* remove the instance, but not for ::Class/::Object */ if (obj != &(thecls->object) && obj != &(theobj->object)) { if (!softrecreate) { (void)RemoveInstance(obj, obj->cl); } } if (obj->nsPtr) { NSCleanupNamespace(interp, obj->nsPtr); NSDeleteChildren(interp, obj->nsPtr); } if (obj->varTable) { TclDeleteVars(((Interp *)interp), obj->varTable); ckfree((char *)obj->varTable); /*FREE(obj->varTable, obj->varTable);*/ obj->varTable = 0; } if (obj->opt) { XOTclObjectOpt *opt = obj->opt; AssertionRemoveStore(opt->assertions); opt->assertions = NULL; #ifdef XOTCL_METADATA XOTclMetaDataDestroy(obj); #endif if (!softrecreate) { /* * Remove this object from all per object mixin lists and clear the mixin list */ removeFromObjectMixinsOf(obj->id, opt->mixins); CmdListRemoveList(&opt->mixins, GuardDel); CmdListRemoveList(&opt->filters, GuardDel); FREE(XOTclObjectOpt, opt); obj->opt = 0; } } if (obj->nonposArgsTable) { NonposArgsFreeTable(obj->nonposArgsTable); Tcl_DeleteHashTable(obj->nonposArgsTable); MEM_COUNT_FREE("Tcl_InitHashTable", obj->nonposArgsTable); ckfree((char *) obj->nonposArgsTable); MEM_COUNT_FREE("Tcl_HashTable", obj->nonposArgsTable); } obj->flags &= ~XOTCL_MIXIN_ORDER_VALID; if (obj->mixinOrder) MixinResetOrder(obj); obj->flags &= ~XOTCL_FILTER_ORDER_VALID; if (obj->filterOrder) FilterResetOrder(obj); } /* * do obj initialization & namespace creation */ static void CleanupInitObject(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cl, Tcl_Namespace *namespacePtr, int softrecreate) { #ifdef OBJDELETION_TRACE fprintf(stderr,"+++ CleanupInitObject\n"); #endif obj->teardown = interp; obj->nsPtr = namespacePtr; if (!softrecreate) { AddInstance(obj, cl); } if (obj->flags & XOTCL_RECREATE) { obj->opt = 0; obj->varTable = 0; obj->nonposArgsTable = 0; obj->mixinOrder = 0; obj->filterOrder = 0; obj->flags = 0; } } /* * physical object destroy */ static void PrimitiveODestroy(ClientData cd) { XOTclObject *obj = (XOTclObject*)cd; Tcl_Interp *interp; /*fprintf(stderr, "****** PrimitiveODestroy %p %s\n", obj, ObjStr(obj->cmdName));*/ assert(obj && !(obj->flags & XOTCL_DESTROYED)); /* * check and latch against recurrent calls with obj->teardown */ PRINTOBJ("PrimitiveODestroy", obj); if (!obj || !obj->teardown) return; interp = obj->teardown; /* * Don't destroy, if the interpreter is destroyed already * e.g. TK calls Tcl_DeleteInterp directly, if the window is killed */ if (Tcl_InterpDeleted(interp)) return; /* * call and latch user destroy with obj->id if we haven't */ if (!(obj->flags & XOTCL_DESTROY_CALLED)) { callDestroyMethod(cd, interp, obj, 0); obj->id = NULL; } #ifdef OBJDELETION_TRACE fprintf(stderr," physical delete of %p id=%p destroyCalled=%d '%s'\n", obj, obj->id, (obj->flags & XOTCL_DESTROY_CALLED), ObjStr(obj->cmdName)); #endif CleanupDestroyObject(interp, obj, 0); while (obj->mixinStack) MixinStackPop(obj); while (obj->filterStack) FilterStackPop(obj); obj->teardown = NULL; #if 0 { /* Prevent that PrimitiveODestroy is called more than once. This code was used in earlier versions of XOTcl but does not seem necessary any more. If it has to be used again in the future, don't use Tcl_GetCommandFromObj() in Tcl 8.4.* versions. */ Tcl_Command cmd = Tcl_FindCommand(interp, ObjStr(obj->cmdName), 0, 0); if (cmd) Tcl_Command_deleteProc(cmd) = NULL; } #endif if (obj->nsPtr) { /*fprintf(stderr,"primitive odestroy calls deletenamespace for obj %p\n", obj);*/ XOTcl_DeleteNamespace(interp, obj->nsPtr); obj->nsPtr = NULL; } /*fprintf(stderr, " +++ OBJ/CLS free: %s\n", ObjStr(obj->cmdName));*/ obj->flags |= XOTCL_DESTROYED; objTrace("ODestroy", obj); #if REFCOUNT_TRACE fprintf(stderr,"ODestroy %p flags %d rc %d destr %d dc %d\n", obj, obj->flags, (obj->flags & XOTCL_REFCOUNTED) != 0, (obj->flags & XOTCL_DESTROYED) != 0, (obj->flags & XOTCL_DESTROY_CALLED) != 0 ); #endif #if REFCOUNTED if (!(obj->flags & XOTCL_REFCOUNTED)) { DECR_REF_COUNT(obj->cmdName); } #else DECR_REF_COUNT(obj->cmdName); #endif XOTclCleanupObject(obj); #if !defined(NDEBUG) if (obj != (XOTclObject*)RUNTIME_STATE(interp)->theClass) checkAllInstances(interp, RUNTIME_STATE(interp)->theClass, 0); #endif } static void PrimitiveOInit(void *mem, Tcl_Interp *interp, char *name, XOTclClass *cl) { XOTclObject *obj = (XOTclObject*)mem; Tcl_Namespace *nsPtr = NULL; #ifdef OBJDELETION_TRACE fprintf(stderr,"+++ PrimitiveOInit\n"); #endif #ifdef XOTCLOBJ_TRACE fprintf(stderr, "OINIT %s = %p\n", name, obj); #endif XOTclObjectRefCountIncr(obj); /* if the command of the obj was used before, we have to clean * up the callstack from set "destroyedCmd" flags */ UndestroyObj(interp, obj); if (Tcl_FindNamespace(interp, name, NULL, 0)) { nsPtr = NSGetFreshNamespace(interp, (ClientData)obj, name); } CleanupInitObject(interp, obj, cl, nsPtr, 0); /*obj->flags = XOTCL_MIXIN_ORDER_VALID | XOTCL_FILTER_ORDER_VALID;*/ obj->mixinStack = NULL; obj->filterStack = NULL; } /* * Object creation: create object name (full name) and Tcl command */ static XOTclObject* PrimitiveOCreate(Tcl_Interp *interp, char *name, XOTclClass *cl) { XOTclObject *obj = (XOTclObject*)ckalloc(sizeof(XOTclObject)); unsigned length; /*fprintf(stderr, "CKALLOC Object %p %s\n", obj, name);*/ #if defined(XOTCLOBJ_TRACE) fprintf(stderr, "CKALLOC Object %p %s\n", obj, name); #endif #ifdef OBJDELETION_TRACE fprintf(stderr,"+++ PrimitiveOCreate\n"); #endif memset(obj, 0, sizeof(XOTclObject)); MEM_COUNT_ALLOC("XOTclObject/XOTclClass", obj); assert(obj); /* ckalloc panics, if malloc fails */ assert(isAbsolutePath(name)); length = strlen(name); if (!NSCheckForParent(interp, name, length)) { ckfree((char *) obj); return 0; } obj->id = Tcl_CreateObjCommand(interp, name, XOTclObjDispatch, (ClientData)obj, tclDeletesObject); PrimitiveOInit(obj, interp, name, cl); #if 0 /*defined(KEEP_TCL_CMD_TYPE)*/ /*TclNewObj(obj->cmdName);*/ obj->cmdName = Tcl_NewStringObj(name, length); TclSetCmdNameObj(interp, obj->cmdName, (Command*)obj->id); /*fprintf(stderr, "new command has name '%s'\n", ObjStr(obj->cmdName));*/ #else obj->cmdName = NewXOTclObjectObjName(obj, name, length); #endif INCR_REF_COUNT(obj->cmdName); objTrace("PrimitiveOCreate", obj); return obj; } /* * Cleanup class: remove filters, mixins, assertions, instances ... * and remove class from class hierarchy */ static void CleanupDestroyClass(Tcl_Interp *interp, XOTclClass *cl, int softrecreate, int recreate) { Tcl_HashSearch hSrch; XOTclClass *theobj = RUNTIME_STATE(interp)->theObject; XOTclClassOpt *clopt = cl->opt; assert(softrecreate? recreate == 1 : 1); /* fprintf(stderr, "CleanupDestroyClass softrecreate=%d,recreate=%d, %p\n", softrecreate,recreate,clopt); */ /* do this even with no clopt, since the class might be used as a superclass of a per object mixin, so it has no clopt... */ MixinInvalidateObjOrders(interp, cl); FilterInvalidateObjOrders(interp, cl); if (clopt) { /* * Remove this class from all isClassMixinOf lists and clear the instmixin list */ RemoveFromClassMixinsOf(clopt->id, clopt->instmixins); CmdListRemoveList(&clopt->instmixins, GuardDel); /*MixinInvalidateObjOrders(interp, cl);*/ CmdListRemoveList(&clopt->instfilters, GuardDel); /*FilterInvalidateObjOrders(interp, cl);*/ if (!recreate) { /* * Remove this class from all mixin lists and clear the isObjectMixinOf list */ RemoveFromMixins(clopt->id, clopt->isObjectMixinOf); CmdListRemoveList(&clopt->isObjectMixinOf, GuardDel); /* * Remove this class from all instmixin lists and clear the isClassMixinOf list */ RemoveFromInstmixins(clopt->id, clopt->isClassMixinOf); CmdListRemoveList(&clopt->isClassMixinOf, GuardDel); } /* remove dependent filters of this class from all subclasses*/ FilterRemoveDependentFilterCmds(cl, cl); AssertionRemoveStore(clopt->assertions); clopt->assertions = NULL; #ifdef XOTCL_OBJECTDATA XOTclFreeObjectData(cl); #endif } Tcl_ForgetImport(interp, cl->nsPtr, "*"); /* don't destroy namespace imported objects */ NSCleanupNamespace(interp, cl->nsPtr); NSDeleteChildren(interp, cl->nsPtr); if (!softrecreate) { /* Reclass all instances of the current class the the appropriate most general class ("baseClass"). The most general class of a metaclass is ::xotcl::Class, the most general class of an object is ::xotcl::Object. Instances of metaclasses can be only reset to ::xotcl::Class (and not to ::xotcl::Object as in earlier versions), since otherwise their instances can't be deleted, because ::xotcl::Object has no method "instdestroy". We do not have to reclassing in case, cl == ::xotcl::Object */ if (cl != theobj) { Tcl_HashEntry *hPtr; XOTclClass *baseClass = IsMetaClass(interp, cl) ? RUNTIME_STATE(interp)->theClass : theobj; if (baseClass == cl) { /* During final cleanup, we delete ::xotcl::Class; there are no more Classes or user objects available at that time, so we reclass to ::xotcl::Object. */ baseClass = theobj; } hPtr = &cl->instances ? Tcl_FirstHashEntry(&cl->instances, &hSrch) : 0; for (; hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { XOTclObject *inst = (XOTclObject*)Tcl_GetHashKey(&cl->instances, hPtr); if (inst && inst != (XOTclObject*)cl && inst->id) { if (inst != &(baseClass->object)) { (void)RemoveInstance(inst, cl->object.cl); AddInstance(inst, baseClass); } } } } Tcl_DeleteHashTable(&cl->instances); MEM_COUNT_FREE("Tcl_InitHashTable",&cl->instances); } if (cl->nonposArgsTable) { NonposArgsFreeTable(cl->nonposArgsTable); Tcl_DeleteHashTable(cl->nonposArgsTable); MEM_COUNT_FREE("Tcl_InitHashTable", cl->nonposArgsTable); ckfree((char *) cl->nonposArgsTable); MEM_COUNT_FREE("Tcl_HashTable", cl->nonposArgsTable); } if (cl->parameters) { DECR_REF_COUNT(cl->parameters); } if ((clopt) && (!recreate)) { if (clopt->parameterClass) { DECR_REF_COUNT(clopt->parameterClass); } FREE(XOTclClassOpt, clopt); cl->opt = 0; } /* On a recreate, it might be possible that the newly created class has a different superclass. So we have to flush the precedence list on a recreate as well. */ FlushPrecedencesOnSubclasses(cl); while (cl->super) (void)RemoveSuper(cl, cl->super->cl); if (!softrecreate) { /* * flush all caches, unlink superclasses */ while (cl->sub) { XOTclClass *subClass = cl->sub->cl; (void)RemoveSuper(subClass, cl); /* if there are no more super classes add the Object * class as superclasses * -> don't do that for Object itself! */ if (subClass->super == 0 && cl != theobj) AddSuper(subClass, theobj); } } } /* * do class initialization & namespace creation */ static void CleanupInitClass(Tcl_Interp *interp, XOTclClass *cl, Tcl_Namespace *namespacePtr, int softrecreate, int recreate) { XOTclObject *obj = (XOTclObject*)cl; assert(softrecreate? recreate == 1 : 1); #ifdef OBJDELETION_TRACE fprintf(stderr,"+++ CleanupInitClass\n"); #endif /* * during init of Object and Class the theClass value is not set */ /* if (RUNTIME_STATE(interp)->theClass != 0) obj->type = RUNTIME_STATE(interp)->theClass; */ XOTclObjectSetClass(obj); cl->nsPtr = namespacePtr; if (!softrecreate) { /* subclasses are preserved during recreate, superclasses not (since the creation statement defined the superclass, might be different the second time) */ cl->sub = NULL; } cl->super = NULL; AddSuper(cl, RUNTIME_STATE(interp)->theObject); cl->color = WHITE; cl->order = NULL; cl->parameters = NULL; if (!softrecreate) { Tcl_InitHashTable(&cl->instances, TCL_ONE_WORD_KEYS); MEM_COUNT_ALLOC("Tcl_InitHashTable",&cl->instances); } if (!recreate) { cl->opt = NULL; } cl->nonposArgsTable = NULL; } /* * class physical destruction */ static void PrimitiveCDestroy(ClientData cd) { XOTclClass *cl = (XOTclClass*)cd; XOTclObject *obj = (XOTclObject*)cd; Tcl_Interp *interp; Tcl_Namespace *saved; /* * check and latch against recurrent calls with obj->teardown */ if (!obj || !obj->teardown) return; interp = obj->teardown; /* * Don't destroy, if the interpreted is destroyed already * e.g. TK calls Tcl_DeleteInterp directly, if Window is killed */ if (Tcl_InterpDeleted(interp)) return; /* * call and latch user destroy with obj->id if we haven't */ /*fprintf(stderr,"PrimitiveCDestroy %s flags %x\n", ObjStr(obj->cmdName), obj->flags);*/ if (!(obj->flags & XOTCL_DESTROY_CALLED)) /*fprintf(stderr,"PrimitiveCDestroy call destroy\n");*/ callDestroyMethod(cd, interp, obj, 0); obj->teardown = 0; CleanupDestroyClass(interp, cl, 0, 0); /* * handoff the primitive teardown */ saved = cl->nsPtr; obj->teardown = interp; /* * class object destroy + physical destroy */ /* fprintf(stderr,"primitive cdestroy calls primitive odestroy\n");*/ PrimitiveODestroy(cd); /*fprintf(stderr,"primitive cdestroy calls deletenamespace for obj %p\n", cl);*/ saved->clientData = NULL; XOTcl_DeleteNamespace(interp, saved); return; } /* * class init */ static void PrimitiveCInit(XOTclClass *cl, Tcl_Interp *interp, char *name) { TclCallFrame frame, *framePtr = &frame; Tcl_Namespace *ns; /* * ensure that namespace is newly created during CleanupInitClass * ie. kill it, if it exists already */ if (Tcl_PushCallFrame(interp, (Tcl_CallFrame *)framePtr, RUNTIME_STATE(interp)->XOTclClassesNS, 0) != TCL_OK) return; ns = NSGetFreshNamespace(interp, (ClientData)cl, name); Tcl_PopCallFrame(interp); CleanupInitClass(interp, cl, ns, 0, 0); return; } /* * class create: creation of namespace + class full name * calls class object creation */ static XOTclClass* PrimitiveCCreate(Tcl_Interp *interp, char *name, XOTclClass *class) { XOTclClass *cl = (XOTclClass*)ckalloc(sizeof(XOTclClass)); unsigned length; XOTclObject *obj = (XOTclObject*)cl; /*fprintf(stderr, "PrimitiveCCreate Class %p %s\n", cl, name);*/ memset(cl, 0, sizeof(XOTclClass)); MEM_COUNT_ALLOC("XOTclObject/XOTclClass", cl); /* fprintf(stderr, " +++ CLS alloc: %s\n", name); */ assert(isAbsolutePath(name)); length = strlen(name); /* fprintf(stderr,"Class alloc %p '%s'\n", cl, name); */ /* check whether Object parent NS already exists, otherwise: error */ if (!NSCheckForParent(interp, name, length)) { ckfree((char *) cl); return 0; } obj->id = Tcl_CreateObjCommand(interp, name, XOTclObjDispatch, (ClientData)cl, tclDeletesClass); PrimitiveOInit(obj, interp, name, class); obj->cmdName = NewXOTclObjectObjName(obj, name, length); INCR_REF_COUNT(obj->cmdName); PrimitiveCInit(cl, interp, name+2); objTrace("PrimitiveCCreate", obj); return cl; } /* change XOTcl class conditionally; obj must not be NULL */ XOTCLINLINE static int changeClass(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cl) { assert(obj); if (cl != obj->cl) { if (IsMetaClass(interp, cl)) { /* Do not allow upgrading from a class to a meta-class (in other words, don't make an object to a class). To allow this, it would be necessary to reallocate the base structures. */ if (!IsMetaClass(interp, obj->cl)) { return XOTclVarErrMsg(interp, "cannot turn object into a class", (char *) NULL); } } else { /* The target class is not a meta class. Changing meta-class to meta-class, or class to class, or object to object is fine, but upgrading/downgrading is not allowed */ /*fprintf(stderr,"target class %s not a meta class, am i a class %d\n", ObjStr(cl->object.cmdName), XOTclObjectIsClass(obj) );*/ if (XOTclObjectIsClass(obj)) { return XOTclVarErrMsg(interp, "cannot turn class into an object ", (char *) NULL); } } (void)RemoveInstance(obj, obj->cl); AddInstance(obj, cl); MixinComputeDefined(interp, obj); FilterComputeDefined(interp, obj); } return TCL_OK; } /* * Undestroy the object, reclass it, and call "cleanup" afterwards */ static int doCleanup(Tcl_Interp *interp, XOTclObject *newobj, XOTclObject *classobj, int objc, Tcl_Obj *CONST objv[]) { int destroyed = 0, result; XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc; /* * we check whether the object to be re-created is destroyed or not */ for (csc = &cs->content[1]; csc <= cs->top; csc++) { if (newobj == csc->self && csc->destroyedCmd) { destroyed = 1; break; } } if (destroyed) UndestroyObj(interp, newobj); /* * re-create, first ensure correct class for newobj */ result = changeClass(interp, newobj, (XOTclClass*) classobj); if (result == TCL_OK) { /* * dispatch "cleanup" */ result = callMethod((ClientData) newobj, interp, XOTclGlobalObjects[XOTE_CLEANUP], 2, 0, 0); } return result; } /* * Std object initialization: * call parameter default values * apply "-" methods (call "configure" with given arguments) * call constructor "init", if it was not called before */ static int doObjInitialization(Tcl_Interp *interp, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]) { int result, initArgsC = objc; Tcl_Obj *savedObjResult = Tcl_GetObjResult(interp); /* save the result */ INCR_REF_COUNT(savedObjResult); /* * Search for default values of parameter on superclasses */ if (!(obj->flags & XOTCL_INIT_CALLED)) { result = callParameterMethodWithArg(obj, interp, XOTclGlobalObjects[XOTE_SEARCH_DEFAULTS], obj->cmdName, 3, 0, 0); if (result != TCL_OK) return result; } /* clear INIT_CALLED_FLAG */ obj->flags &= ~XOTCL_INIT_CALLED; /* * call configure methods (starting with '-') */ result = callMethod((ClientData) obj, interp, XOTclGlobalObjects[XOTE_CONFIGURE], objc, objv+2, 0); if (result != TCL_OK) return result; /* check, whether init was called already, and determine where the * configure (with '-') start (we don't send them as args to * "init"). */ if (!(obj->flags & XOTCL_INIT_CALLED)) { int newargs; Tcl_Obj *resultObj = Tcl_GetObjResult(interp); /* * Call the user-defined constructor 'init' */ INCR_REF_COUNT(resultObj); result = Tcl_GetIntFromObj(interp, resultObj,&newargs); DECR_REF_COUNT(resultObj); if (result == TCL_OK && newargs+2 < objc) initArgsC = newargs+2; result = callMethod((ClientData) obj, interp, XOTclGlobalObjects[XOTE_INIT], initArgsC, objv+2, 0); obj->flags |= XOTCL_INIT_CALLED; } if (result == TCL_OK) { Tcl_SetObjResult(interp, savedObjResult); } DECR_REF_COUNT(savedObjResult); return result; } /* * experimental resolver implementation -> not used at the moment */ #ifdef EXPERIMENTAL_CMD_RESOLVER static int XOTclResolveCmd(Tcl_Interp *interp, char *name, Tcl_Namespace *contextNsPtr, int flags, Tcl_Command *rPtr) { Tcl_Namespace *nsPtr[2], *cxtNsPtr; char *simpleName; register Tcl_HashEntry *entryPtr; register Tcl_Command cmd; register int search; /*fprintf(stderr, " ***%s->%s\n", contextNsPtr->fullName, name);*/ /* * Find the namespace(s) that contain the command. */ if (flags & TCL_GLOBAL_ONLY) { cxtNsPtr = Tcl_GetGlobalNamespace(interp); } else if (contextNsPtr) { cxtNsPtr = contextNsPtr; } else { cxtNsPtr = Tcl_GetCurrentNamespace(interp); } TclGetNamespaceForQualName(interp, name, (Namespace *) contextNsPtr,flags, &nsPtr[0], &nsPtr[1], &cxtNsPtr, &simpleName); /*fprintf(stderr, " ***Found %s, %s\n", nsPtr[0]->fullName, nsPtr[0]->fullName);*/ /* * Look for the command in the command table of its namespace. * Be sure to check both possible search paths: from the specified * namespace context and from the global namespace. */ cmd = NULL; for (search = 0; (search < 2) && (cmd == NULL); search++) { if (nsPtr[search] && simpleName) { cmdTable = Tcl_Namespace_cmdTable(nsPtr[search]); entryPtr = XOTcl_FindHashEntry(cmdTable, simpleName); if (entryPtr) { cmd = (Tcl_Command) Tcl_GetHashValue(entryPtr); } } } if (cmd) { Tcl_ObjCmdProc *objProc = Tcl_Command_objProc(cmd); if (NSisXOTclNamespace(cxtNsPtr) && objProc != XOTclObjDispatch && objProc != XOTclNextObjCmd && objProc != XOTclGetSelfObjCmd) { /* * the cmd is defined in an XOTcl object or class namespace, but * not an object & not self/next -> redispatch in * global namespace */ cmd = 0; nsPtr[0] = Tcl_GetGlobalNamespace(interp); if (nsPtr[0] && simpleName) { cmdTable = Tcl_Namespace_cmdTable(nsPtr[0]); if ((entryPtr = XOTcl_FindHashEntry(cmdTable, simpleName))) { cmd = (Tcl_Command) Tcl_GetHashValue(entryPtr); } } /* XOTclStackDump(interp); XOTclCallStackDump(interp); */ } *rPtr = cmd; return TCL_OK; } return TCL_CONTINUE; } static int XOTclResolveVar(Tcl_Interp *interp, char *name, Tcl_Namespace *context, Tcl_ResolvedVarInfo *rPtr) { /*fprintf(stderr, "Resolving %s in %s\n", name, context->fullName);*/ return TCL_CONTINUE; } #endif /* * object method implementations */ static int XOTclODestroyMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 1) return XOTclObjErrArgCnt(interp, obj->cmdName, "destroy"); PRINTOBJ("XOTclODestroyMethod", obj); /* * call instdestroy for [self] */ return XOTclCallMethodWithArgs((ClientData)obj->cl, interp, XOTclGlobalObjects[XOTE_INSTDESTROY], obj->cmdName, objc, objv+1, 0); } static int XOTclOCleanupMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclClass *cl = XOTclObjectToClass(obj); int softrecreate; Tcl_Obj *savedNameObj; #if defined(OBJDELETION_TRACE) fprintf(stderr,"+++ XOTclOCleanupMethod\n"); #endif if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 1) return XOTclObjErrArgCnt(interp, obj->cmdName, "cleanup"); PRINTOBJ("XOTclOCleanupMethod", obj); savedNameObj = obj->cmdName; INCR_REF_COUNT(savedNameObj); /* save and pass around softrecreate*/ softrecreate = obj->flags & XOTCL_RECREATE && RUNTIME_STATE(interp)->doSoftrecreate; CleanupDestroyObject(interp, obj, softrecreate); CleanupInitObject(interp, obj, obj->cl, obj->nsPtr, softrecreate); if (cl) { CleanupDestroyClass(interp, cl, softrecreate, 1); CleanupInitClass(interp, cl, cl->nsPtr, softrecreate, 1); } DECR_REF_COUNT(savedNameObj); return TCL_OK; } static int XOTclOIsClassMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Obj *className; XOTclObject *obj = (XOTclObject*)cd, *o; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 1 || objc > 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "isclass ?className?"); className = (objc == 2) ? objv[1] : obj->cmdName; Tcl_SetIntObj(Tcl_GetObjResult(interp), (XOTclObjConvertObject(interp, className, &o) == TCL_OK && XOTclObjectIsClass(o) )); return TCL_OK; } static int XOTclOIsObjectMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd, *o; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "isobject "); if (XOTclObjConvertObject(interp, objv[1], &o) == TCL_OK) { Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); } else { Tcl_SetIntObj(Tcl_GetObjResult(interp), 0); } return TCL_OK; } static int IsMetaClass(Tcl_Interp *interp, XOTclClass *cl) { /* check if cl is a meta-class by checking is Class is a superclass of cl*/ XOTclClasses *pl, *checkList = NULL, *mixinClasses = NULL, *mc; int hasMCM = 0; if (cl == RUNTIME_STATE(interp)->theClass) return 1; for (pl = ComputeOrder(cl, cl->order, Super); pl; pl = pl->next) { if (pl->cl == RUNTIME_STATE(interp)->theClass) return 1; } for (pl = ComputeOrder(cl, cl->order, Super); pl; pl = pl->next) { XOTclClassOpt *clopt = pl->cl->opt; if (clopt && clopt->instmixins) { MixinComputeOrderFullList(interp, &clopt->instmixins, &mixinClasses, &checkList, 0); } } for (mc=mixinClasses; mc; mc = mc->next) { /*fprintf(stderr,"- got %s\n", ObjStr(mc->cl->object.cmdName));*/ if (isSubType(mc->cl, RUNTIME_STATE(interp)->theClass)) { hasMCM = 1; break; } } XOTclFreeClasses(mixinClasses); XOTclFreeClasses(checkList); /*fprintf(stderr,"has MC returns %d, mixinClasses = %p\n", hasMCM, mixinClasses);*/ return hasMCM; } static int XOTclOIsMetaClassMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd, *o; Tcl_Obj *className; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 1 || objc > 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "ismetaclass ?metaClassName?"); className = (objc == 2) ? objv[1] : obj->cmdName; if (XOTclObjConvertObject(interp, className, &o) == TCL_OK && XOTclObjectIsClass(o) && IsMetaClass(interp, (XOTclClass*)o)) { Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); } else { Tcl_SetIntObj(Tcl_GetObjResult(interp), 0); } return TCL_OK; } static int isSubType(XOTclClass *subcl, XOTclClass *cl) { XOTclClasses *t; int success = 1; assert(cl && subcl); if (cl != subcl) { success = 0; for (t = ComputeOrder(subcl, subcl->order, Super); t && t->cl; t = t->next) { if (t->cl == cl) { success = 1; break; } } } return success; } static int XOTclOIsTypeMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclClass *cl; int success = 0; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "istype "); if (obj->cl && GetXOTclClassFromObj(interp, objv[1],&cl, 1) == TCL_OK) { success = isSubType(obj->cl, cl); } Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), success); return TCL_OK; } static int hasMixin(Tcl_Interp *interp, XOTclObject *obj, XOTclClass *cl) { if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); if ((obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID)) { XOTclCmdList *ml; for (ml = obj->mixinOrder; ml; ml = ml->next) { XOTclClass *mixin = XOTclGetClassFromCmdPtr(ml->cmdPtr); if (mixin == cl) { return 1; } } } return 0; } static int XOTclOIsMixinMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclClass *cl; int success = 0; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "ismixin "); if (GetXOTclClassFromObj(interp, objv[1],&cl, 1) == TCL_OK) { success = hasMixin(interp, obj, cl); } Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), success); return TCL_OK; } static int XOTclOExistsMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "exists var"); Tcl_SetIntObj(Tcl_GetObjResult(interp), varExists(interp, obj, ObjStr(objv[1]), NULL, 1, 1)); return TCL_OK; } static int countModifiers(int objc, Tcl_Obj * CONST objv[]) { int i, count = 0; for (i = 2; i < objc; i++) { char *to = ObjStr(objv[i]); if (to[0] == '-') { count++; /* '--' stops modifiers */ if (to[1] == '-') break; } } return count; } static int checkForModifier(Tcl_Obj * CONST objv[], int numberModifiers, char *modifier) { int i; if (numberModifiers == 0) return 0; for (i = 2; i-2 < numberModifiers; i++) { char *ov = ObjStr(objv[i]); /* all start with a "-", so there must be a ov[1] */ if (ov[1] == modifier[1] && !strcmp(ov, modifier)) return 1; } return 0; } static int XOTclOInfoMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; Tcl_Namespace *nsp; char *cmd, *pattern; int modifiers = 0; XOTclObjectOpt *opt; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "info ?args?"); nsp = obj->nsPtr; opt = obj->opt; cmd = ObjStr(objv[1]); pattern = (objc > 2) ? ObjStr(objv[2]) : 0; /*fprintf(stderr, "OInfo cmd=%s, obj=%s, nsp=%p\n", cmd, ObjStr(obj->cmdName), nsp);*/ /* * check for "-" modifiers */ if (pattern && *pattern == '-') { modifiers = countModifiers(objc, objv); pattern = (objc > 2+modifiers) ? ObjStr(objv[2+modifiers]) : 0; } switch (*cmd) { case 'a': if (isArgsString(cmd)) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info args "); if (obj->nonposArgsTable) { XOTclNonposArgs *nonposArgs = NonposArgsGet(obj->nonposArgsTable, pattern); if (nonposArgs) { return ListArgsFromOrdinaryArgs(interp, nonposArgs); } } if (nsp) return ListProcArgs(interp, Tcl_Namespace_cmdTable(nsp), pattern); else return TCL_OK; } break; case 'b': if (!strcmp(cmd, "body")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info body "); if (nsp) return ListProcBody(interp, Tcl_Namespace_cmdTable(nsp), pattern); else return TCL_OK; } break; case 'c': if (isClassString(cmd)) { if (objc > 3 || modifiers > 0 || pattern) return XOTclObjErrArgCnt(interp, obj->cmdName, "info class"); return ListClass(interp, obj, objc, objv); } else if (!strcmp(cmd, "commands")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info commands ?pattern?"); if (nsp) return ListKeys(interp, Tcl_Namespace_cmdTable(nsp), pattern); else return TCL_OK; } else if (!strcmp(cmd, "children")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info children ?pattern?"); return ListChildren(interp, obj, pattern, 0); } else if (!strcmp(cmd, "check")) { if (objc != 2 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info check"); return AssertionListCheckOption(interp, obj); } break; case 'd': if (!strcmp(cmd, "default")) { if (objc != 5 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info default "); if (obj->nonposArgsTable) { XOTclNonposArgs *nonposArgs = NonposArgsGet(obj->nonposArgsTable, pattern); if (nonposArgs) { return ListDefaultFromOrdinaryArgs(interp, pattern, nonposArgs, ObjStr(objv[3]), objv[4]); } } if (nsp) return ListProcDefault(interp, Tcl_Namespace_cmdTable(nsp), pattern, ObjStr(objv[3]), objv[4]); else return TCL_OK; } break; case 'f': if (!strcmp(cmd, "filter")) { int withGuards = 0, withOrder = 0; if (objc-modifiers > 3) return XOTclObjErrArgCnt(interp, obj->cmdName, "info filter ?-guards? ?-order? ?pattern?"); if (modifiers > 0) { withGuards = checkForModifier(objv, modifiers, "-guards"); withOrder = checkForModifier(objv, modifiers, "-order"); if (withGuards == 0 && withOrder == 0) return XOTclVarErrMsg(interp, "info filter: unknown modifier ", ObjStr(objv[2]), (char *) NULL); /* if (withGuards && withOrder) return XOTclVarErrMsg(interp, "info filter: cannot use -guards and -order together", ObjStr(objv[2]), (char *) NULL); */ } if (withOrder) { if (!(obj->flags & XOTCL_FILTER_ORDER_VALID)) FilterComputeDefined(interp, obj); return FilterInfo(interp, obj->filterOrder, pattern, withGuards, 1); } return opt ? FilterInfo(interp, opt->filters, pattern, withGuards, 0) : TCL_OK; } else if (!strcmp(cmd, "filterguard")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info filterguard filter"); return opt ? GuardList(interp, opt->filters, pattern) : TCL_OK; } else if (!strcmp(cmd, "forward")) { int argc = objc-modifiers; int definition; if (argc < 2 || argc > 3) return XOTclObjErrArgCnt(interp, obj->cmdName, "info forward ?-definition name? ?pattern?"); definition = checkForModifier(objv, modifiers, "-definition"); if (definition && argc < 3) return XOTclObjErrArgCnt(interp, obj->cmdName, "info forward ?-definition name? ?pattern?"); if (nsp) { return forwardList(interp, Tcl_Namespace_cmdTable(nsp), pattern, definition); } else { return TCL_OK; } } break; case 'h': if (!strcmp(cmd, "hasNamespace")) { Tcl_SetBooleanObj(Tcl_GetObjResult(interp), nsp != NULL); return TCL_OK; } break; case 'i': if (!strcmp(cmd, "invar")) { if (objc != 2 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info invar"); if (opt && opt->assertions) Tcl_SetObjResult(interp, AssertionList(interp, opt->assertions->invariants)); return TCL_OK; } else if (!strcmp(cmd, "info")) { if (objc > 2 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info info"); return ListInfo(interp, GetXOTclClassFromObj(interp, obj->cmdName, NULL, 0) == TCL_OK); } break; case 'm': if (!strcmp(cmd, "mixin")) { int withOrder = 0, withGuards = 0; XOTclObject *matchObject; Tcl_DString ds, *dsPtr = &ds; if (objc-modifiers > 3) return XOTclObjErrArgCnt(interp, obj->cmdName, "info mixin ?-guards? ?-order? ?class?"); if (modifiers > 0) { withOrder = checkForModifier(objv, modifiers, "-order"); withGuards = checkForModifier(objv, modifiers, "-guards"); if (withOrder == 0 && withGuards == 0) return XOTclVarErrMsg(interp, "info mixin: unknown modifier . ", ObjStr(objv[2]), (char *) NULL); } DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } if (withOrder) { if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); MixinInfo(interp, obj->mixinOrder, pattern, withGuards, matchObject); } else if (opt) { MixinInfo(interp, opt->mixins, pattern, withGuards, matchObject); } DSTRING_FREE(dsPtr); return TCL_OK; } else if (!strcmp(cmd, "mixinguard")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info mixinguard mixin"); return opt ? GuardList(interp, opt->mixins, pattern) : TCL_OK; } else if (!strcmp(cmd, "methods")) { int noprocs = 0, nocmds = 0, nomixins = 0, inContext = 0; if (objc-modifiers > 3) return XOTclObjErrArgCnt(interp, obj->cmdName, "info methods ?-noprocs? ?-nocmds? ?-nomixins? ?-incontext? ?pattern?"); if (modifiers > 0) { noprocs = checkForModifier(objv, modifiers, "-noprocs"); nocmds = checkForModifier(objv, modifiers, "-nocmds"); nomixins = checkForModifier(objv, modifiers, "-nomixins"); inContext = checkForModifier(objv, modifiers, "-incontext"); } return ListMethods(interp, obj, pattern, noprocs, nocmds, nomixins, inContext); } #ifdef XOTCL_METADATA else if (!strcmp(cmd, "metadata")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info metadata ?pattern?"); return ListKeys(interp, &obj->metaData, pattern); } #endif break; case 'n': if (!strcmp(cmd, "nonposargs")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info nonposargs "); if (obj->nonposArgsTable) { XOTclNonposArgs *nonposArgs = NonposArgsGet(obj->nonposArgsTable, pattern); if (nonposArgs) { Tcl_SetObjResult(interp, NonposArgsFormat(interp, nonposArgs->nonposArgs)); } } return TCL_OK; } break; case 'p': if (!strcmp(cmd, "procs")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info procs ?pattern?"); if (nsp) return ListMethodKeys(interp, Tcl_Namespace_cmdTable(nsp), pattern, /*noProcs*/ 0, /*noCmds*/ 1, /* noDups */ 0, /* onlyForward */0, /* onlySetter */ 0 ); else return TCL_OK; } else if (!strcmp(cmd, "parent")) { if (objc > 2 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info parent"); return ListParent(interp, obj); } else if (!strcmp(cmd, "pre")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info pre "); if (opt) { XOTclProcAssertion *procs = AssertionFindProcs(opt->assertions, ObjStr(objv[2])); if (procs) Tcl_SetObjResult(interp, AssertionList(interp, procs->pre)); } return TCL_OK; } else if (!strcmp(cmd, "post")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info post "); if (opt) { XOTclProcAssertion *procs = AssertionFindProcs(opt->assertions, ObjStr(objv[2])); if (procs) Tcl_SetObjResult(interp, AssertionList(interp, procs->post)); } return TCL_OK; } else if (!strcmp(cmd, "precedence")) { int intrinsic = 0; if (objc-modifiers > 3 || modifiers > 1) return XOTclObjErrArgCnt(interp, obj->cmdName, "info precedence ?-intrinsic? ?pattern?"); intrinsic = checkForModifier(objv, modifiers, "-intrinsic"); return ListPrecedence(interp, obj, pattern, intrinsic); } else if (!strcmp(cmd, "parametercmd")) { int argc = objc-modifiers; if (argc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "info parametercmd ?pattern?"); if (nsp) { return ListMethodKeys(interp, Tcl_Namespace_cmdTable(nsp), pattern, 1, 0, 0, 0, 1); } else { return TCL_OK; } } break; case 'v': if (!strcmp(cmd, "vars")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, obj->cmdName, "info vars ?pattern?"); return ListVars(interp, obj, pattern); } break; } return XOTclErrBadVal(interp, "info", "an info option (use 'info info' to list all info options)", cmd); } static int XOTclOProcMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; char *argStr, *bdyStr, *name; XOTclObjectOpt *opt; int incr = 0, result = TCL_OK; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 4 || objc > 7) return XOTclObjErrArgCnt(interp, obj->cmdName, "proc name ?non-positional-args? args body ?preAssertion postAssertion?"); if (objc == 5 || objc == 7) { incr = 1; } argStr = ObjStr(objv[2 + incr]); bdyStr = ObjStr(objv[3 + incr]); name = ObjStr(objv[1 + incr]); if (*argStr == 0 && *bdyStr == 0) { opt = obj->opt; if (opt) AssertionRemoveProc(opt->assertions, name); if (obj->nsPtr) NSDeleteCmd(interp, obj->nsPtr, name); } else { XOTclAssertionStore *aStore = NULL; if (objc > 5) { opt = XOTclRequireObjectOpt(obj); if (!opt->assertions) opt->assertions = AssertionCreateStore(); aStore = opt->assertions; } requireObjNamespace(interp, obj); result = MakeProc(obj->nsPtr, aStore, &(obj->nonposArgsTable), interp, objc, (Tcl_Obj **) objv, obj); } /* could be a filter => recompute filter order */ FilterComputeDefined(interp, obj); return result; } static int XOTclONoinitMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 1) return XOTclObjErrArgCnt(interp, obj->cmdName, "noninit"); obj->flags |= XOTCL_INIT_CALLED; return TCL_OK; } Tcl_Obj* XOTclOSetInstVar(XOTcl_Object *obj, Tcl_Interp *interp, Tcl_Obj *name, Tcl_Obj *value, int flgs) { return XOTclOSetInstVar2(obj, interp, name, (Tcl_Obj *)NULL, value, (flgs|TCL_PARSE_PART1)); } Tcl_Obj* XOTclOGetInstVar(XOTcl_Object *obj, Tcl_Interp *interp, Tcl_Obj *name, int flgs) { return XOTclOGetInstVar2(obj, interp, name, (Tcl_Obj *)NULL, (flgs|TCL_PARSE_PART1)); } int XOTclUnsetInstVar(XOTcl_Object *obj, Tcl_Interp *interp, char *name, int flgs) { return XOTclUnsetInstVar2 (obj, interp, name,(char *)NULL, flgs); } extern int XOTclCreateObject(Tcl_Interp *interp, Tcl_Obj *name, XOTcl_Class *cli) { XOTclClass *cl = (XOTclClass*) cli; int result; INCR_REF_COUNT(name); result = XOTclCallMethodWithArgs((ClientData)cl, interp, XOTclGlobalObjects[XOTE_CREATE], name, 1, 0, 0); DECR_REF_COUNT(name); return result; } extern int XOTclCreateClass(Tcl_Interp *interp, Tcl_Obj *name, XOTcl_Class *cli) { XOTclClass *cl = (XOTclClass*) cli; int result; INCR_REF_COUNT(name); result = XOTclCallMethodWithArgs((ClientData)cl, interp, XOTclGlobalObjects[XOTE_CREATE], name, 1, 0, 0); DECR_REF_COUNT(name); return result; } int XOTclDeleteObject(Tcl_Interp *interp, XOTcl_Object *obji) { XOTclObject *obj = (XOTclObject*) obji; return callMethod((ClientData)obj, interp, XOTclGlobalObjects[XOTE_DESTROY], 2, 0, 0); } int XOTclDeleteClass(Tcl_Interp *interp, XOTcl_Class *cli) { XOTclClass *cl = (XOTclClass*) cli; return callMethod((ClientData)cl, interp, XOTclGlobalObjects[XOTE_DESTROY], 2, 0, 0); } extern Tcl_Obj* XOTclOSetInstVar2(XOTcl_Object *obji, Tcl_Interp *interp, Tcl_Obj *name1, Tcl_Obj *name2, Tcl_Obj *value, int flgs) { XOTclObject *obj = (XOTclObject*) obji; Tcl_Obj *result; XOTcl_FrameDecls; XOTcl_PushFrame(interp, obj); if (obj->nsPtr) flgs |= TCL_NAMESPACE_ONLY; result = Tcl_ObjSetVar2(interp, name1, name2, value, flgs); XOTcl_PopFrame(interp, obj); return result; } extern int XOTclUnsetInstVar2(XOTcl_Object *obji, Tcl_Interp *interp, char *name1, char *name2, int flgs) { XOTclObject *obj = (XOTclObject*) obji; int result; XOTcl_FrameDecls; XOTcl_PushFrame(interp, obj); if (obj->nsPtr) flgs |= TCL_NAMESPACE_ONLY; result = Tcl_UnsetVar2(interp, name1, name2, flgs); XOTcl_PopFrame(interp, obj); return result; } static int GetInstVarIntoCurrentScope(Tcl_Interp *interp, XOTclObject *obj, Tcl_Obj *varName, Tcl_Obj *newName) { Var *otherPtr = NULL, *arrayPtr; int new; Tcl_CallFrame *varFramePtr; TclVarHashTable *tablePtr; XOTcl_FrameDecls; int flgs = TCL_LEAVE_ERR_MSG | /* PARSE_PART1 needed for 8.0.5 */ TCL_PARSE_PART1; XOTcl_PushFrame(interp, obj); if (obj->nsPtr) { flgs = flgs|TCL_NAMESPACE_ONLY; } otherPtr = XOTclObjLookupVar(interp, varName, (char *) NULL, flgs, "define", /*createPart1*/ 1, /*createPart2*/ 1, &arrayPtr); XOTcl_PopFrame(interp, obj); if (otherPtr == NULL) { return XOTclVarErrMsg(interp, "can't make instvar ", ObjStr(varName), ": can't find variable on ", ObjStr(obj->cmdName), (char *) NULL); } /* * if newName == NULL -> there is no alias, use varName * as target link name */ if (newName == NULL) { /* * Variable link into namespace cannot be an element in an array. * see Tcl_VariableObjCmd ... */ if (arrayPtr) { return XOTclVarErrMsg(interp, "can't make instvar ", ObjStr(varName), " on ", ObjStr(obj->cmdName), ": variable cannot be an element in an array;", " use an alias or objeval.", (char *) NULL); } newName = varName; } varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); /* * If we are executing inside a Tcl procedure, create a local * variable linked to the new namespace variable "varName". */ if (varFramePtr && Tcl_CallFrame_isProcCallFrame(varFramePtr)) { Proc *procPtr = Tcl_CallFrame_procPtr(varFramePtr); int localCt = procPtr->numCompiledLocals; CompiledLocal *localPtr = procPtr->firstLocalPtr; Var *localVarPtr = Tcl_CallFrame_compiledLocals(varFramePtr); char *newNameString = ObjStr(newName); int i, nameLen = strlen(newNameString); Var *varPtr = NULL; for (i = 0; i < localCt; i++) { /* look in compiled locals */ /* fprintf(stderr,"%d of %d %s flags %x not isTemp %d\n", i, localCt, localPtr->name, localPtr->flags, !TclIsCompiledLocalTemporary(localPtr));*/ if (!TclIsCompiledLocalTemporary(localPtr)) { char *localName = localPtr->name; if ((newNameString[0] == localName[0]) && (nameLen == localPtr->nameLength) && (strcmp(newNameString, localName) == 0)) { varPtr = getNthVar(localVarPtr, i); new = 0; break; } } localPtr = localPtr->nextPtr; } if (varPtr == NULL) { /* look in frame's local var hashtable */ tablePtr = Tcl_CallFrame_varTablePtr(varFramePtr); if (tablePtr == NULL) { tablePtr = (TclVarHashTable *) ckalloc(varHashTableSize); InitVarHashTable(tablePtr, NULL); Tcl_CallFrame_varTablePtr(varFramePtr) = tablePtr; } varPtr = VarHashCreateVar(tablePtr, newName, &new); } /* * if we define an alias (newName != varName), be sure that * the target does not exist already */ if (!new) { if (varPtr == otherPtr) return XOTclVarErrMsg(interp, "can't instvar to variable itself", (char *) NULL); if (TclIsVarLink(varPtr)) { /* we try to make the same instvar again ... this is ok */ Var *linkPtr = valueOfVar(Var, varPtr, linkPtr); if (linkPtr == otherPtr) { return TCL_OK; } /*fprintf(stderr, "linkvar flags=%x\n", linkPtr->flags); Tcl_Panic("new linkvar %s... When does this happen?", newNameString, NULL);*/ /* We have already a variable with the same name imported from a different object. Get rid of this old variable */ VarHashRefCount(linkPtr)--; if (TclIsVarUndefined(linkPtr)) { CleanupVar(linkPtr, (Var *) NULL); } } else if (!TclIsVarUndefined(varPtr)) { return XOTclVarErrMsg(interp, "variable '", ObjStr(newName), "' exists already", (char *) NULL); } else if (TclIsVarTraced(varPtr)) { return XOTclVarErrMsg(interp, "variable '", ObjStr(newName), "' has traces: can't use for instvar", (char *) NULL); } } TclSetVarLink(varPtr); TclClearVarUndefined(varPtr); #if FORWARD_COMPATIBLE if (forwardCompatibleMode) { Var85 *vPtr = (Var85 *)varPtr; vPtr->value.linkPtr = (Var85 *)otherPtr; } else { varPtr->value.linkPtr = otherPtr; } #else varPtr->value.linkPtr = otherPtr; #endif VarHashRefCount(otherPtr)++; /* { Var85 *p = (Var85 *)varPtr; fprintf(stderr,"defining an alias var='%s' in obj %s fwd %d flags %x isLink %d isTraced %d isUndefined %d\n", ObjStr(newName), ObjStr(obj->cmdName), forwardCompatibleMode, varFlags(varPtr), TclIsVarLink(varPtr), TclIsVarTraced(varPtr), TclIsVarUndefined(varPtr)); } */ } return TCL_OK; } static int XOTclOInstVarMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); extern int XOTclInstVar(XOTcl_Object *obji, Tcl_Interp *interp, char *name, char *destName) { XOTclObject *obj = (XOTclObject*) obji; int result; Tcl_Obj *alias = NULL; ALLOC_ON_STACK(Tcl_Obj*, 2, objv); objv[0] = XOTclGlobalObjects[XOTE_INSTVAR]; objv[1] = Tcl_NewStringObj(name, -1); INCR_REF_COUNT(objv[1]); if (destName) { alias = Tcl_NewStringObj(destName, -1); INCR_REF_COUNT(alias); Tcl_ListObjAppendElement(interp, objv[1], alias); } result = XOTclOInstVarMethod((ClientData) obj, interp, 2, objv); if (destName) { DECR_REF_COUNT(alias); } DECR_REF_COUNT(objv[1]); FREE_ON_STACK(Tcl_Obj *, objv); return result; } extern void XOTclRemovePMethod(Tcl_Interp *interp, XOTcl_Object *obji, char *nm) { XOTclObject *obj = (XOTclObject*) obji; if (obj->nsPtr) NSDeleteCmd(interp, obj->nsPtr, nm); } extern void XOTclRemoveIMethod(Tcl_Interp *interp, XOTcl_Class *cli, char *nm) { XOTclClass *cl = (XOTclClass*) cli; NSDeleteCmd(interp, cl->nsPtr, nm); } /* * obj/cl ClientData setter/getter */ extern void XOTclSetObjClientData(XOTcl_Object *obji, ClientData data) { XOTclObject *obj = (XOTclObject*) obji; XOTclObjectOpt *opt = XOTclRequireObjectOpt(obj); opt->clientData = data; } extern ClientData XOTclGetObjClientData(XOTcl_Object *obji) { XOTclObject *obj = (XOTclObject*) obji; return (obj && obj->opt) ? obj->opt->clientData : 0; } extern void XOTclSetClassClientData(XOTcl_Class *cli, ClientData data) { XOTclClass *cl = (XOTclClass*) cli; XOTclRequireClassOpt(cl); cl->opt->clientData = data; } extern ClientData XOTclGetClassClientData(XOTcl_Class *cli) { XOTclClass *cl = (XOTclClass*) cli; return (cl && cl->opt) ? cl->opt->clientData : 0; } static int setInstVar(Tcl_Interp *interp, XOTclObject *obj, Tcl_Obj *name, Tcl_Obj *value) { Tcl_Obj *result; int flags = (obj->nsPtr) ? TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY : TCL_LEAVE_ERR_MSG; XOTcl_FrameDecls; XOTcl_PushFrame(interp, obj); if (value == NULL) { result = Tcl_ObjGetVar2(interp, name, NULL, flags); } else { result = Tcl_ObjSetVar2(interp, name, NULL, value, flags); } XOTcl_PopFrame(interp, obj); if (result) { Tcl_SetObjResult(interp, result); return TCL_OK; } return TCL_ERROR; } static int XOTclOSetMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc > 3 || objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "set var ?value?"); return setInstVar(interp, obj, objv[1], objc == 3 ? objv[2] : NULL); } static int XOTclSetterMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc > 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "parameter ?value?"); return setInstVar(interp, obj, objv[0], objc == 2 ? objv[1] : NULL); } static int XOTclOUpvarMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; Tcl_Obj *frameInfoObj = NULL; int i, result = TCL_ERROR; char *frameInfo; callFrameContext ctx = {0}; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "?level? otherVar localVar ?otherVar localVar ...?"); if (objc % 2 == 0) { frameInfo = ObjStr(objv[1]); i = 2; } else { frameInfoObj = computeLevelObj(interp, CALLING_LEVEL); INCR_REF_COUNT(frameInfoObj); frameInfo = ObjStr(frameInfoObj); i = 1; } if (obj && (obj->filterStack || obj->mixinStack)) { CallStackUseActiveFrames(interp, &ctx); } for ( ; i < objc; i += 2) { result = Tcl_UpVar2(interp, frameInfo, ObjStr(objv[i]), NULL, ObjStr(objv[i+1]), 0 /*flags*/); if (result != TCL_OK) break; } if (frameInfoObj) { DECR_REF_COUNT(frameInfoObj); } CallStackRestoreSavedFrames(interp, &ctx); return result; } static int XOTclOUplevelMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclObject *obj = (XOTclObject *)cd; int i, result = TCL_ERROR; char *frameInfo = NULL; Tcl_CallFrame *framePtr = NULL, *savedVarFramePtr; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 2) { uplevelSyntax: return XOTclObjErrArgCnt(interp, obj->cmdName, "?level? command ?arg ...?"); } /* * Find the level to use for executing the command. */ if (objc>2) { CallFrame *cf; frameInfo = ObjStr(objv[1]); result = TclGetFrame(interp, frameInfo, &cf); if (result == -1) { return TCL_ERROR; } framePtr = (Tcl_CallFrame *)cf; i = result+1; } else { i = 1; } objc -= i; objv += i; if (objc == 0) { goto uplevelSyntax; } if (!framePtr) { XOTclCallStackContent *csc = XOTclCallStackFindLastInvocation(interp, 1); if (csc) framePtr = csc->currentFramePtr; } savedVarFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); Tcl_Interp_varFramePtr(interp) = (CallFrame *)framePtr; /* * Execute the residual arguments as a command. */ if (objc == 1) { result = Tcl_EvalObjEx(interp, objv[0], TCL_EVAL_DIRECT); } else { /* * More than one argument: concatenate them together with spaces * between, then evaluate the result. Tcl_EvalObjEx will delete * the object when it decrements its refcount after eval'ing it. */ Tcl_Obj *objPtr = Tcl_ConcatObj(objc, objv); result = Tcl_EvalObjEx(interp, objPtr, TCL_EVAL_DIRECT); } if (result == TCL_ERROR) { char msg[32 + TCL_INTEGER_SPACE]; sprintf(msg, "\n (\"uplevel\" body line %d)", Tcl_GetErrorLine(interp)); Tcl_AddObjErrorInfo(interp, msg, -1); } /* * Restore the variable frame, and return. */ Tcl_Interp_varFramePtr(interp) = (CallFrame *)savedVarFramePtr; return result; } static int forwardArg(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], Tcl_Obj *o, forwardCmdClientData *tcd, Tcl_Obj **out, Tcl_Obj **freeList, int *inputarg, int *mapvalue) { char *element = ObjStr(o), *p; int totalargs = objc + tcd->nr_args - 1; char c = *element; p = element; if (c == '%' && *(element+1) == '@') { char *remainder = NULL; long pos; element += 2; pos = strtol(element,&remainder, 0); /*fprintf(stderr,"strtol('%s) returned %ld '%s'\n", element, pos, remainder);*/ if (element == remainder && *element == 'e' && !strncmp(element,"end", 3)) { pos = totalargs; remainder += 3; } if (element == remainder || abs(pos) > totalargs) { return XOTclVarErrMsg(interp, "forward: invalid index specified in argument ", ObjStr(o), (char *) NULL); } if (!remainder || *remainder != ' ') { return XOTclVarErrMsg(interp, "forward: invaild syntax in '", ObjStr(o), "' use: %@ ",(char *) NULL); } element = ++remainder; if (pos<0) pos = totalargs + pos; /*fprintf(stderr,"remainder = '%s' pos = %ld\n", remainder, pos);*/ *mapvalue = pos; element = remainder; c = *element; } /*fprintf(stderr,"c==%c element = '%s'\n", c, element);*/ if (c == '%') { Tcl_Obj *list = NULL, **listElements; int nrargs = objc-1, nrElements = 0, c1; c = *++element; c1 = *(element+1); if (c == 's' && !strcmp(element,"self")) { *out = tcd->obj->cmdName; } else if (c == 'p' && !strcmp(element,"proc")) { *out = objv[0]; } else if (c == '1' && (c1 == '\0' || c1 == ' ')) { /*fprintf(stderr, " nrargs=%d, subcommands=%d inputarg=%d, objc=%d\n", nrargs, tcd->nr_subcommands, inputarg, objc);*/ if (c1 != '\0') { if (Tcl_ListObjIndex(interp, o, 1, &list) != TCL_OK) { return XOTclVarErrMsg(interp, "forward: %1 must by a valid list, given: '", ObjStr(o), "'", (char *) NULL); } if (Tcl_ListObjGetElements(interp, list, &nrElements, &listElements) != TCL_OK) { return XOTclVarErrMsg(interp, "forward: %1 contains invalid list '", ObjStr(list),"'", (char *) NULL); } } else if (tcd->subcommands) { /* deprecated part */ if (Tcl_ListObjGetElements(interp, tcd->subcommands,&nrElements,&listElements) != TCL_OK) { return XOTclVarErrMsg(interp, "forward: %1 contains invalid list '", ObjStr(list),"'", (char *) NULL); } } if (nrElements > nrargs) { /* insert default subcommand depending on number of arguments */ *out = listElements[nrargs]; } else if (objc<=1) { return XOTclObjErrArgCnt(interp, objv[0], "no argument given"); } else { *out = objv[1]; *inputarg = 2; } } else if (c == 'a' && !strncmp(element,"argcl", 4)) { if (Tcl_ListObjIndex(interp, o, 1, &list) != TCL_OK) { return XOTclVarErrMsg(interp, "forward: %argclindex must by a valid list, given: '", ObjStr(o), "'", (char *) NULL); } if (Tcl_ListObjGetElements(interp, list, &nrElements, &listElements) != TCL_OK) { return XOTclVarErrMsg(interp, "forward: %argclindex contains invalid list '", ObjStr(list),"'", (char *) NULL); } if (nrargs >= nrElements) { return XOTclVarErrMsg(interp, "forward: not enough elements in specified list of ARGC argument ", ObjStr(o), (char *) NULL); } *out = listElements[nrargs]; } else if (c == '%') { Tcl_Obj *newarg = Tcl_NewStringObj(element,-1); *out = newarg; goto add_to_freelist; } else { /* evaluating given command */ int result; /*fprintf(stderr,"evaluating '%s'\n", element);*/ if ((result = Tcl_EvalEx(interp, element, -1, 0)) != TCL_OK) return result; *out = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); /*fprintf(stderr,"result = '%s'\n", ObjStr(*out));*/ goto add_to_freelist; } } else { if (p == element) *out = o; else { Tcl_Obj *newarg = Tcl_NewStringObj(element,-1); *out = newarg; goto add_to_freelist; } } return TCL_OK; add_to_freelist: if (!*freeList) { *freeList = Tcl_NewListObj(1, out); INCR_REF_COUNT(*freeList); } else Tcl_ListObjAppendElement(interp, *freeList, *out); return TCL_OK; } static int callForwarder(forwardCmdClientData *tcd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { ClientData cd; int result; XOTcl_FrameDecls; if (tcd->verbose) { Tcl_Obj *cmd = Tcl_NewListObj(objc, objv); fprintf(stderr,"calling %s\n", ObjStr(cmd)); DECR_REF_COUNT(cmd); } if (tcd->objscope) { XOTcl_PushFrame(interp, tcd->obj); } if (tcd->objProc) { result = Tcl_NRCallObjProc(interp, tcd->objProc, tcd->cd, objc, objv); } else if (tcd->cmdName->typePtr == &XOTclObjectType && XOTclObjConvertObject(interp, tcd->cmdName, (void*)&cd) == TCL_OK) { /*fprintf(stderr, "XOTcl object %s, objc=%d\n", ObjStr(tcd->cmdName), objc);*/ result = XOTclObjDispatch(cd, interp, objc, objv); } else { /*fprintf(stderr, "no XOTcl object %s\n", ObjStr(tcd->cmdName));*/ result = Tcl_EvalObjv(interp, objc, objv, 0); } if (tcd->objscope) { XOTcl_PopFrame(interp, tcd->obj); } return result; } static int XOTclForwardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { forwardCmdClientData *tcd = (forwardCmdClientData *)cd; int result, inputarg = 1; if (!tcd || !tcd->obj) return XOTclObjErrType(interp, objv[0], "Object"); /* it is a c-method; establish a value for the currentFramePtr */ RUNTIME_STATE(interp)->cs.top->currentFramePtr = (Tcl_CallFrame *) Tcl_Interp_varFramePtr(interp); /* fprintf(stderr,"...setting currentFramePtr %p to %p (ForwardMethod)\n", RUNTIME_STATE(interp)->cs.top->currentFramePtr, (Tcl_CallFrame *) Tcl_Interp_varFramePtr(interp)); */ if (tcd->passthrough) { /* two short cuts for simple cases */ /* early binding, cmd *resolved, we have to care only for objscope */ return callForwarder(tcd, interp, objc, objv); } else if (!tcd->args && *(ObjStr(tcd->cmdName)) != '%') { /* we have ony to replace the method name with the given cmd name */ ALLOC_ON_STACK(Tcl_Obj*, objc, ov); memcpy(ov, objv, sizeof(Tcl_Obj *)*objc); ov[0] = tcd->cmdName; result = callForwarder(tcd, interp, objc, ov); FREE_ON_STACK(Tcl_Obj *, ov); return result; } else { Tcl_Obj **ov, *freeList=NULL; int totalargs = objc + tcd->nr_args + 3, outputarg = 0; ALLOC_ON_STACK(Tcl_Obj*, totalargs, OV); ALLOC_ON_STACK(int, totalargs, objvmap); ov = &OV[1]; if (tcd->needobjmap) { memset(objvmap, -1, sizeof(int)*totalargs); } #if 0 fprintf(stderr,"command %s (%p) objc=%d, subcommand=%d, args=%p, nrargs\n", ObjStr(objv[0]), tcd, objc, tcd->nr_subcommands, tcd->args ); #endif /* the first argument is always the command, to which we forward */ if ((result = forwardArg(interp, objc, objv, tcd->cmdName, tcd, &ov[outputarg], &freeList, &inputarg, &objvmap[outputarg])) != TCL_OK) { goto exitforwardmethod; } outputarg++; if (tcd->args) { /* copy argument list from definition */ Tcl_Obj **listElements; int nrElements, j; Tcl_ListObjGetElements(interp, tcd->args, &nrElements, &listElements); for (j=0; jnr_subcommands=%d size=%d\n", objc, tcd->nr_subcommands, objc+ 2 );*/ if (objc-inputarg>0) { /*fprintf(stderr, " copying remaining %d args starting at [%d]\n", objc-inputarg, outputarg);*/ memcpy(ov+outputarg, objv+inputarg, sizeof(Tcl_Obj *)*(objc-inputarg)); } else { /*fprintf(stderr, " nothing to copy, objc=%d, inputarg=%d\n", objc, inputarg);*/ } objc += outputarg - inputarg; #if 0 for(j=0; jneedobjmap) { int j; for (j=0; jpos) { for(i=j; i>pos; i--) { /*fprintf(stderr,"...moving right %d to %d\n", i-1, i);*/ ov[i] = ov[i-1]; objvmap[i] = objvmap[i-1]; } } else { for(i=j; i %s\n", pos, ObjStr(tmp)); */ ov[pos] = tmp; objvmap[pos] = -1; } } if (tcd->prefix) { /* prepend a prefix for the subcommands to avoid name clashes */ Tcl_Obj *methodName = Tcl_DuplicateObj(tcd->prefix); Tcl_AppendObjToObj(methodName, ov[1]); ov[1] = methodName; INCR_REF_COUNT(ov[1]); } #if 0 for(j=0; jcmdName; result = callForwarder(tcd, interp, objc, ov); if (tcd->prefix) {DECR_REF_COUNT(ov[1]);} exitforwardmethod: if (freeList) {DECR_REF_COUNT(freeList);} FREE_ON_STACK(int, objvmap); FREE_ON_STACK(Tcl_Obj *,OV); } return result; } static int XOTclOInstVarMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; Tcl_Obj **ov; int i, oc, result = TCL_OK; callFrameContext ctx = {0}; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "instvar ?vars?"); if (obj && (obj->filterStack || obj->mixinStack) ) { CallStackUseActiveFrames(interp, &ctx); } if (!Tcl_Interp_varFramePtr(interp)) { CallStackRestoreSavedFrames(interp, &ctx); return XOTclVarErrMsg(interp, "instvar used on ", ObjStr(obj->cmdName), ", but callstack is not in procedure scope", (char *) NULL); } for (i=1; icmdName, "vwait varname"); nameString = ObjStr(objv[1]); /* * Make sure the var table exists and the varname is in there */ if (NSRequireVariableOnObj(interp, obj, nameString, flgs) == 0) return XOTclVarErrMsg(interp, "Can't lookup (and create) variable ", nameString, " on ", ObjStr(obj->cmdName), (char *) NULL); XOTcl_PushFrame(interp, obj); /* * much of this is copied from Tcl, since we must avoid * access with flag TCL_GLOBAL_ONLY ... doesn't work on * obj->varTable vars */ if (Tcl_TraceVar(interp, nameString, flgs, (Tcl_VarTraceProc *)VwaitVarProc, (ClientData) &done) != TCL_OK) { return TCL_ERROR; } done = 0; foundEvent = 1; while (!done && foundEvent) { foundEvent = Tcl_DoOneEvent(TCL_ALL_EVENTS); } Tcl_UntraceVar(interp, nameString, flgs, (Tcl_VarTraceProc *)VwaitVarProc, (ClientData) &done); XOTcl_PopFrame(interp, obj); /* * Clear out the interpreter's result, since it may have been set * by event handlers. */ Tcl_ResetResult(interp); if (!foundEvent) { return XOTclVarErrMsg(interp, "can't wait for variable '", nameString, "': would wait forever", (char *) NULL); } return TCL_OK; } static int XOTclOInvariantsMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclObjectOpt *opt; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "invar "); opt = XOTclRequireObjectOpt(obj); if (opt->assertions) TclObjListFreeList(opt->assertions->invariants); else opt->assertions = AssertionCreateStore(); opt->assertions->invariants = AssertionNewList(interp, objv[1]); return TCL_OK; } static int XOTclOAutonameMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; int instanceOpt = 0, resetOpt = 0; Tcl_Obj *autoname; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc == 3) { instanceOpt = (strcmp(ObjStr(objv[1]), "-instance") == 0); resetOpt = (strcmp(ObjStr(objv[1]), "-reset") == 0); } if ((objc < 2 || objc > 3) || (objc == 3 && !instanceOpt && !resetOpt)) return XOTclObjErrArgCnt(interp, obj->cmdName, "autoname [-instance | -reset] name"); autoname = AutonameIncr(interp, objv[objc-1], obj, instanceOpt, resetOpt); if (autoname) { Tcl_SetObjResult(interp, autoname); DECR_REF_COUNT(autoname); } else return XOTclVarErrMsg(interp, "Autoname failed. Probably format string (with %) was not well-formed", (char *) NULL); return TCL_OK; } static int XOTclOCheckMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; int ocArgs; Tcl_Obj **ovArgs; XOTclObjectOpt *opt; /*fprintf(stderr,"checkmethod\n");*/ if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "check (?all? ?pre? ?post? ?invar? ?instinvar?)"); opt = XOTclRequireObjectOpt(obj); opt->checkoptions = CHECK_NONE; if (Tcl_ListObjGetElements(interp, objv[1], &ocArgs, &ovArgs) == TCL_OK && ocArgs > 0) { int i; for (i = 0; i < ocArgs; i++) { char *option = ObjStr(ovArgs[i]); if (option) { switch (*option) { case 'i': if (strcmp(option, "instinvar") == 0) { opt->checkoptions |= CHECK_CLINVAR; } else if (strcmp(option, "invar") == 0) { opt->checkoptions |= CHECK_OBJINVAR; } break; case 'p': if (strcmp(option, "pre") == 0) { opt->checkoptions |= CHECK_PRE; } else if (strcmp(option, "post") == 0) { opt->checkoptions |= CHECK_POST; } break; case 'a': if (strcmp(option, "all") == 0) { opt->checkoptions |= CHECK_ALL; } break; } } } } if (opt->checkoptions == CHECK_NONE && ocArgs>0) { return XOTclVarErrMsg(interp, "Unknown check option in command '", ObjStr(obj->cmdName), " ", ObjStr(objv[0]), " ", ObjStr(objv[1]), "', valid: all pre post invar instinvar", (char *) NULL); } Tcl_ResetResult(interp); return TCL_OK; } static int XOTclConfigureCommand(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int bool, opt, result = TCL_OK; static CONST char *opts[] = { "filter", "softrecreate", NULL }; enum subCmdIdx { filterIdx, softrecreateIdx }; if (objc < 2 || objc>3) return XOTclObjErrArgCnt(interp, objv[0], "::xotcl::configure filter|softrecreate ?on|off?"); if (Tcl_GetIndexFromObj(interp, objv[1], opts, "option", 0, &opt) != TCL_OK) { return TCL_ERROR; } if (objc == 3) { result = Tcl_GetBooleanFromObj(interp, objv[2], &bool); } if (result == TCL_OK) { switch (opt) { case filterIdx: Tcl_SetBooleanObj(Tcl_GetObjResult(interp), (RUNTIME_STATE(interp)->doFilters)); if (objc == 3) RUNTIME_STATE(interp)->doFilters = bool; break; case softrecreateIdx: Tcl_SetBooleanObj(Tcl_GetObjResult(interp), (RUNTIME_STATE(interp)->doSoftrecreate)); if (objc == 3) RUNTIME_STATE(interp)->doSoftrecreate = bool; break; } } return result; } static int XOTclObjscopedMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { aliasCmdClientData *tcd = (aliasCmdClientData *)cd; XOTclObject *obj = tcd->obj; int rc; XOTcl_FrameDecls; /* fprintf(stderr,"objscopedMethod obj=%p, ptr=%p\n", obj, tcd->objProc); */ XOTcl_PushFrame(interp, obj); rc = Tcl_NRCallObjProc(interp, tcd->objProc, tcd->cd, objc, objv); XOTcl_PopFrame(interp, obj); return rc; } static void aliasCmdDeleteProc(ClientData cd) { aliasCmdClientData *tcd = (aliasCmdClientData *)cd; if (tcd->cmdName) {DECR_REF_COUNT(tcd->cmdName);} /*fprintf(stderr,"aliasCmdDeleteProc\n");*/ FREE(aliasCmdClientData, tcd); } static int XOTclAliasCommand(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = NULL; XOTclClass *cl = NULL; Tcl_Command cmd = NULL; Tcl_ObjCmdProc *objProc; char allocation, *methodName; Tcl_CmdDeleteProc *dp = NULL; aliasCmdClientData *tcd = NULL; int objscope = 0, i; if (objc < 4 || objc > 6) { return XOTclObjErrArgCnt(interp, objv[0], "| ?-objscope? ?-per-object? "); } GetXOTclClassFromObj(interp, objv[1], &cl, 1); if (!cl) { XOTclObjConvertObject(interp, objv[1], &obj); if (!obj) return XOTclObjErrType(interp, objv[1], "Class|Object"); allocation = 'o'; } else { allocation = 'c'; } methodName = ObjStr(objv[2]); for (i=3; i<5; i++) { char *optionName = ObjStr(objv[i]); if (*optionName != '-') break; if (!strcmp("-objscope", optionName)) { objscope = 1; } else if (!strcmp("-per-object", optionName)) { allocation = 'o'; } else { return XOTclErrBadVal(interp, "::xotcl::alias", "option -objscope or -per-object", optionName); } } cmd = Tcl_GetCommandFromObj(interp, objv[i]); if (cmd == NULL) return XOTclVarErrMsg(interp, "cannot lookup command '", ObjStr(objv[i]), "'", (char *) NULL); objProc = Tcl_Command_objProc(cmd); if (objc>i+1) { return XOTclVarErrMsg(interp, "invalid argument '", ObjStr(objv[i+1]), "'", (char *) NULL); } if (objscope) { tcd = NEW(aliasCmdClientData); tcd->cmdName = NULL; tcd->obj = allocation == 'c' ? &cl->object : obj; tcd->objProc = objProc; tcd->cd = Tcl_Command_objClientData(cmd); objProc = XOTclObjscopedMethod; dp = aliasCmdDeleteProc; } else { tcd = Tcl_Command_objClientData(cmd); } if (allocation == 'c') { XOTclAddIMethod(interp, (XOTcl_Class*)cl, methodName, objProc, tcd, dp); } else { XOTclAddPMethod(interp, (XOTcl_Object*)obj, methodName, objProc, tcd, dp); } return TCL_OK; } static int XOTclSetInstvarCommand(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj; if (objc < 3 || objc > 4) return XOTclObjErrArgCnt(interp, objv[0], "::xotcl::instvarset obj var ?value?"); XOTclObjConvertObject(interp, objv[1], &obj); if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); return setInstVar(interp, obj , objv[2], objc == 4 ? objv[3] : NULL); } static int XOTclSetRelationCommand(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int oc; Tcl_Obj **ov; XOTclObject *obj = NULL; XOTclClass *cl = NULL; XOTclObject *nobj = NULL; XOTclObjectOpt *objopt = NULL; XOTclClassOpt *clopt = NULL; XOTclClassOpt *nclopt = NULL; int i, opt; static CONST char *opts[] = { "mixin", "instmixin", "filter", "instfilter", "class", "superclass", NULL }; enum subCmdIdx { mixinIdx, instmixinIdx, filterIdx, instfilterIdx, classIdx, superclassIdx }; if (objc < 3) return XOTclObjErrArgCnt(interp, objv[0], "::xotcl::setrelation obj reltype classes"); if (Tcl_GetIndexFromObj(interp, objv[2], opts, "relation type", 0, &opt) != TCL_OK) { return TCL_ERROR; } switch (opt) { case mixinIdx: case filterIdx: { XOTclObjConvertObject(interp, objv[1], &obj); if (!obj) return XOTclObjErrType(interp, objv[1], "Object"); if (Tcl_ListObjGetElements(interp, objv[3], &oc, &ov) != TCL_OK) return TCL_ERROR; objopt = XOTclRequireObjectOpt(obj); break; } case instmixinIdx: case instfilterIdx: { GetXOTclClassFromObj(interp, objv[1], &cl, 1); if (!cl) return XOTclObjErrType(interp, objv[1], "Class"); if (Tcl_ListObjGetElements(interp, objv[3], &oc, &ov) != TCL_OK) return TCL_ERROR; clopt = XOTclRequireClassOpt(cl); break; } case superclassIdx: { GetXOTclClassFromObj(interp, objv[1], &cl, 1); if (!cl) return XOTclObjErrType(interp, objv[1], "Class"); if (Tcl_ListObjGetElements(interp, objv[3], &oc, &ov) != TCL_OK) return TCL_ERROR; return SuperclassAdd(interp, cl, oc, ov, objv[3]); } case classIdx: { XOTclObjConvertObject(interp, objv[1], &obj); if (!obj) return XOTclObjErrType(interp, objv[1], "Object"); GetXOTclClassFromObj(interp, objv[3], &cl, 1); if (!cl) return XOTclErrBadVal(interp, "class", "a class", ObjStr(objv[1])); return changeClass(interp, obj, cl); } } switch (opt) { case mixinIdx: { if (objopt->mixins) { XOTclCmdList *cmdlist, *del; for (cmdlist = objopt->mixins; cmdlist; cmdlist = cmdlist->next) { cl = XOTclGetClassFromCmdPtr(cmdlist->cmdPtr); clopt = cl ? cl->opt : NULL; if (clopt) { del = CmdListFindCmdInList(obj->id, clopt->isObjectMixinOf); if (del) { /* fprintf(stderr,"Removing object %s from isObjectMixinOf of class %s\n", ObjStr(obj->cmdName), ObjStr(XOTclGetClassFromCmdPtr(cmdlist->cmdPtr)->object.cmdName)); */ del = CmdListRemoveFromList(&clopt->isObjectMixinOf, del); CmdListDeleteCmdListEntry(del, GuardDel); } } } CmdListRemoveList(&objopt->mixins, GuardDel); } obj->flags &= ~XOTCL_MIXIN_ORDER_VALID; /* * since mixin procs may be used as filters -> we have to invalidate */ obj->flags &= ~XOTCL_FILTER_ORDER_VALID; /* * now add the specified mixins */ for (i = 0; i < oc; i++) { Tcl_Obj *ocl = NULL; if (MixinAdd(interp, &objopt->mixins, ov[i]) != TCL_OK) { return TCL_ERROR; } /* fprintf(stderr,"Added to mixins of %s: %s\n", ObjStr(obj->cmdName), ObjStr(ov[i])); */ Tcl_ListObjIndex(interp, ov[i], 0, &ocl); XOTclObjConvertObject(interp, ocl, &nobj); if (nobj) { /* fprintf(stderr,"Registering object %s to isObjectMixinOf of class %s\n", ObjStr(obj->cmdName), ObjStr(nobj->cmdName)); */ nclopt = XOTclRequireClassOpt((XOTclClass*) nobj); CmdListAdd(&nclopt->isObjectMixinOf, obj->id, NULL, /*noDuplicates*/ 1); /*fprintf(stderr,"adding cmd %p %s (epoch %d) to isObjectMixinOf %p\n", obj->id, Tcl_GetCommandName(interp, obj->id), Tcl_Command_cmdEpoch(obj->id), nclopt->isObjectMixinOf);*/ } /* else fprintf(stderr,"Problem registering %s as a per object mixin of %s\n", ObjStr(ov[i]), ObjStr(cl->object.cmdName)); */ } MixinComputeDefined(interp, obj); FilterComputeDefined(interp, obj); break; } case filterIdx: { if (objopt->filters) CmdListRemoveList(&objopt->filters, GuardDel); obj->flags &= ~XOTCL_FILTER_ORDER_VALID; for (i = 0; i < oc; i ++) { if (FilterAdd(interp, &objopt->filters, ov[i], obj, 0) != TCL_OK) return TCL_ERROR; } /*FilterComputeDefined(interp, obj);*/ break; } case instmixinIdx: { if (clopt->instmixins) { RemoveFromClassMixinsOf(cl->object.id, clopt->instmixins); CmdListRemoveList(&clopt->instmixins, GuardDel); } MixinInvalidateObjOrders(interp, cl); /* * since mixin procs may be used as filters -> we have to invalidate */ FilterInvalidateObjOrders(interp, cl); for (i = 0; i < oc; i++) { Tcl_Obj *ocl = NULL; if (MixinAdd(interp, &clopt->instmixins, ov[i]) != TCL_OK) { return TCL_ERROR; } /* fprintf(stderr,"Added to instmixins of %s: %s\n", ObjStr(cl->object.cmdName), ObjStr(ov[i])); */ Tcl_ListObjIndex(interp, ov[i], 0, &ocl); XOTclObjConvertObject(interp, ocl, &nobj); if (nobj) { /* fprintf(stderr,"Registering class %s to isClassMixinOf of class %s\n", ObjStr(cl->object.cmdName), ObjStr(nobj->cmdName)); */ nclopt = XOTclRequireClassOpt((XOTclClass*) nobj); CmdListAdd(&nclopt->isClassMixinOf, cl->object.id, NULL, /*noDuplicates*/ 1); } /* else fprintf(stderr,"Problem registering %s as a instmixinof of %s\n", ObjStr(ov[i]), ObjStr(cl->object.cmdName)); */ } break; } case instfilterIdx: { if (clopt->instfilters) CmdListRemoveList(&clopt->instfilters, GuardDel); FilterInvalidateObjOrders(interp, cl); for (i = 0; i < oc; i ++) { if (FilterAdd(interp, &clopt->instfilters, ov[i], 0, cl) != TCL_OK) return TCL_ERROR; } break; } } return TCL_OK; } static int XOTclOMixinGuardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclObjectOpt *opt; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 3) return XOTclObjErrArgCnt(interp, obj->cmdName, "mixinguard mixin guards"); opt = obj->opt; if (opt && opt->mixins) { XOTclClass *mixinCl = XOTclpGetClass(interp, ObjStr(objv[1])); Tcl_Command mixinCmd = NULL; if (mixinCl) { mixinCmd = Tcl_GetCommandFromObj(interp, mixinCl->object.cmdName); } if (mixinCmd) { XOTclCmdList *h = CmdListFindCmdInList(mixinCmd, opt->mixins); if (h) { if (h->clientData) GuardDel((XOTclCmdList*) h); GuardAdd(interp, h, objv[2]); obj->flags &= ~XOTCL_MIXIN_ORDER_VALID; return TCL_OK; } } } return XOTclVarErrMsg(interp, "Mixinguard: can't find mixin ", ObjStr(objv[1]), " on ", ObjStr(obj->cmdName), (char *) NULL); } static int XOTclOFilterGuardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclObjectOpt *opt; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 3) return XOTclObjErrArgCnt(interp, obj->cmdName, "filterguard filtername filterGuards"); opt = obj->opt; if (opt && opt->filters) { XOTclCmdList *h = CmdListFindNameInList(interp, ObjStr(objv[1]), opt->filters); if (h) { if (h->clientData) GuardDel((XOTclCmdList*) h); GuardAdd(interp, h, objv[2]); obj->flags &= ~XOTCL_FILTER_ORDER_VALID; return TCL_OK; } } return XOTclVarErrMsg(interp, "Filterguard: can't find filter ", ObjStr(objv[1]), " on ", ObjStr(obj->cmdName), (char *) NULL); } /* * Searches for filter on [self] and returns fully qualified name * if it is not found it returns an empty string */ static int XOTclOFilterSearchMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; char *methodName; XOTclCmdList *cmdList; XOTclClass *fcl; XOTclObject *fobj; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "filtersearch name"); Tcl_ResetResult(interp); if (!(obj->flags & XOTCL_FILTER_ORDER_VALID)) FilterComputeDefined(interp, obj); if (!(obj->flags & XOTCL_FILTER_ORDER_DEFINED)) return TCL_OK; methodName = ObjStr(objv[1]); for (cmdList = obj->filterOrder; cmdList; cmdList = cmdList->next) { CONST84 char *filterName = Tcl_GetCommandName(interp, cmdList->cmdPtr); if (filterName[0] == methodName[0] && !strcmp(filterName, methodName)) break; } if (!cmdList) return TCL_OK; fcl = cmdList->clorobj; if (fcl && XOTclObjectIsClass(&fcl->object)) { fobj = NULL; } else { fobj = (XOTclObject*)fcl; fcl = NULL; } Tcl_SetObjResult(interp, getFullProcQualifier(interp, methodName, fobj, fcl, cmdList->cmdPtr)); return TCL_OK; } static int XOTclOProcSearchMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclClass *pcl = NULL; Tcl_Command cmd = NULL; char *methodName; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "procsearch name"); Tcl_ResetResult(interp); methodName = ObjStr(objv[1]); if (!(obj->flags & XOTCL_MIXIN_ORDER_VALID)) MixinComputeDefined(interp, obj); if (obj->flags & XOTCL_MIXIN_ORDER_DEFINED_AND_VALID) { XOTclCmdList *mixinList; for (mixinList = obj->mixinOrder; mixinList; mixinList = mixinList->next) { XOTclClass *mcl = XOTclpGetClass(interp, (char *)Tcl_GetCommandName(interp, mixinList->cmdPtr)); if (mcl && (pcl = SearchCMethod(mcl, methodName, &cmd))) { break; } } } if (!cmd && obj->nsPtr) { cmd = FindMethod(methodName, obj->nsPtr); } if (!cmd && obj->cl) pcl = SearchCMethod(obj->cl, methodName, &cmd); if (cmd) { XOTclObject *pobj = pcl ? NULL : obj; char *simpleName = (char *)Tcl_GetCommandName(interp, cmd); Tcl_SetObjResult(interp, getFullProcQualifier(interp, simpleName, pobj, pcl, cmd)); } return TCL_OK; } static int XOTclORequireNamespaceMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc != 1) return XOTclObjErrArgCnt(interp, obj->cmdName, "requireNamespace"); requireObjNamespace(interp, obj); return TCL_OK; } typedef enum {NO_DASH, SKALAR_DASH, LIST_DASH} dashArgType; static dashArgType isDashArg(Tcl_Interp *interp, Tcl_Obj *obj, int firstArg, char **methodName, int *objc, Tcl_Obj **objv[]) { char *flag; static Tcl_ObjType CONST86 *listType = NULL; assert(obj); /* fetch list type, if not set already; if used on more places, this should be moved into the interpreter state */ if (listType == NULL) { #if defined(PRE82) Tcl_Obj *tmp = Tcl_NewListObj(1, &obj); listType = tmp->typePtr; DECR_REF_COUNT(tmp); #else static XOTclMutex initMutex = 0; XOTclMutexLock(&initMutex); if (listType == NULL) { listType = Tcl_GetObjType("list"); /*fprintf(stderr, "fetching listType=%p\n", listType);*/ } XOTclMutexUnlock(&initMutex); #endif } if (obj->typePtr == listType) { if (Tcl_ListObjGetElements(interp, obj, objc, objv) == TCL_OK && *objc>1) { flag = ObjStr(*objv[0]); /*fprintf(stderr, "we have a list starting with '%s'\n", flag);*/ if (*flag == '-') { *methodName = flag+1; return LIST_DASH; } } } flag = ObjStr(obj); /*fprintf(stderr, "we have a scalar '%s' firstArg %d\n", flag, firstArg);*/ if ((*flag == '-') && isalpha(*((flag)+1))) { if (firstArg) { /* if the argument contains a space, try to split */ CONST char *p= flag+1; while (*p && *p != ' ') p++; if (*p == ' ') { if (Tcl_ListObjGetElements(interp, obj, objc, objv) == TCL_OK) { *methodName = ObjStr(*objv[0]); if (**methodName == '-') {(*methodName)++ ;} return LIST_DASH; } } } *methodName = flag+1; *objc = 1; return SKALAR_DASH; } return NO_DASH; } static int callConfigureMethod(Tcl_Interp *interp, XOTclObject *obj, char *methodName, int argc, Tcl_Obj *CONST argv[]) { int result; Tcl_Obj *method = Tcl_NewStringObj(methodName,-1); /*fprintf(stderr,"callConfigureMethod method %s->'%s' argc %d\n", ObjStr(obj->cmdName), methodName, argc);*/ if (isInitString(methodName)) obj->flags |= XOTCL_INIT_CALLED; INCR_REF_COUNT(method); result = callMethod((ClientData)obj, interp, method, argc, argv, XOTCL_CM_NO_UNKNOWN); DECR_REF_COUNT(method); /*fprintf(stderr, "method '%s' called args: %d o=%p, result=%d\n", methodName, argc+1, obj, result); */ if (result != TCL_OK) { Tcl_Obj *res = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); /* save the result */ INCR_REF_COUNT(res); XOTclVarErrMsg(interp, ObjStr(res), " during '", ObjStr(obj->cmdName), " ", methodName, "'", (char *) NULL); DECR_REF_COUNT(res); } return result; } static int XOTclOConfigureMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; Tcl_Obj **argv, **nextArgv; int i, argc, nextArgc, normalArgs, result = TCL_OK, isdasharg = NO_DASH; char *methodName, *nextMethodName; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 1) return XOTclObjErrArgCnt(interp, obj->cmdName, "configure ?args?"); /* find arguments without leading dash */ for (i=1; i < objc; i++) { if ((isdasharg = isDashArg(interp, objv[i], 1, &methodName, &argc, &argv))) break; } normalArgs = i-1; for( ; i < objc; argc=nextArgc, argv=nextArgv, methodName=nextMethodName) { Tcl_ResetResult(interp); switch (isdasharg) { case SKALAR_DASH: /* argument is a skalar with a leading dash, eager search for dashed arg */ { int j; for (j = i+1; j < objc; j++, argc++) { if ((isdasharg = isDashArg(interp, objv[j], 1, &nextMethodName, &nextArgc, &nextArgv))) break; } result = callConfigureMethod(interp, obj, methodName, argc+1, objv+i+1); if (result != TCL_OK) return result; i += argc; break; } case LIST_DASH: /* argument is a list with a leading dash, grouping determined by list */ { i++; if (icmdName), " configure: unexpected argument '", ObjStr(objv[i]), "' between parameters", (char *) NULL); } } } Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), normalArgs); return result; } /* * class method implementations */ static int XOTclCInstDestroyMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); XOTclObject *delobj; int rc; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "instdestroy "); if (XOTclObjConvertObject(interp, objv[1], &delobj) != TCL_OK) return XOTclVarErrMsg(interp, "Can't destroy object ", ObjStr(objv[1]), " that does not exist.", (char *) NULL); /*fprintf(stderr,"instdestroy obj=%p %s, flags %.6x opt=%p\n", delobj, ObjStr(delobj->cmdName), delobj->flags, delobj->opt);*/ rc = freeUnsetTraceVariable(interp, delobj); if (rc != TCL_OK) { return rc; } /*fprintf(stderr,"instdestroy obj=%p\n", delobj);*/ /* * latch, and call delete command if not already in progress */ delobj->flags |= XOTCL_DESTROY_CALLED; RUNTIME_STATE(interp)->callIsDestroy = 1; /*fprintf(stderr,"instDestroy: setting callIsDestroy = 1\n");*/ if (RUNTIME_STATE(interp)->exitHandlerDestroyRound != XOTCL_EXITHANDLER_ON_SOFT_DESTROY) { CallStackDestroyObject(interp, delobj); } return TCL_OK; } static Tcl_Namespace * callingNameSpace(Tcl_Interp *interp) { Tcl_Namespace *ns = NULL; XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *top = cs->top; XOTclCallStackContent *csc = XOTclCallStackFindLastInvocation(interp, 0); /*fprintf(stderr," **** use last invocation csc = %p\n", csc);*/ if (csc && csc->currentFramePtr) { /* use the callspace from the last invocation */ XOTclCallStackContent *called = csccurrentFramePtr) : NULL; /*fprintf(stderr," **** csc use frame= %p\n", f);*/ if (f) { ns = f->nsPtr; } else { Tcl_CallFrame *f = Tcl_CallFrame_callerPtr(csc->currentFramePtr); ns = Tcl_GetCurrentNamespace(interp); /* find last incovation outside ::xotcl (for things like relmgr) */ while (ns == RUNTIME_STATE(interp)->XOTclNS) { if (f) { ns = f->nsPtr; f = Tcl_CallFrame_callerPtr(f); } else { ns = Tcl_GetGlobalNamespace(interp); } } /*fprintf(stderr, "found ns %p '%s'\n", ns, ns?ns->fullName:"NULL");*/ } } if (!ns) { /* calls on xotcl toplevel */ XOTclCallStackContent *bot = cs->content + 1; /*fprintf(stderr, " **** bot=%p diff=%d\n", bot, top-bot);*/ if (top - bot >= 0 && bot->currentFramePtr) { /* get calling tcl environment */ Tcl_CallFrame *f = Tcl_CallFrame_callerPtr(bot->currentFramePtr); if (f) { ns = f->nsPtr; /*fprintf(stderr, "top=%p, bot=%p b->c=%p f=%p ns=%p\n", top, bot, bot->currentFramePtr, f, ns);*/ /*fprintf(stderr,"ns from calling tcl environment %p '%s'\n", ns, ns?ns->fullName : "" );*/ } else { /* fprintf(stderr, "nothing found, use ::\n"); */ ns = Tcl_GetGlobalNamespace(interp); } } } /*XOTclCallStackDump(interp);*/ /*XOTclStackDump(interp);*/ /*fprintf(stderr,"callingNameSpace returns %p %s\n", ns, ns?ns->fullName:"");*/ return ns; } static int XOTclCAllocMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); int result; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "alloc ?args?"); { /* * create a new object from scratch */ char *objName = ObjStr(objv[1]); Tcl_Obj *tmpName = NULL; if (!isAbsolutePath(objName)) { /*fprintf(stderr, "CallocMethod\n");*/ tmpName = NameInNamespaceObj(interp, objName, callingNameSpace(interp)); /*fprintf(stderr, "NoAbsoluteName for '%s' -> determined = '%s'\n", objName, ObjStr(tmpName));*/ objName = ObjStr(tmpName); /*fprintf(stderr," **** name is '%s'\n", objName);*/ INCR_REF_COUNT(tmpName); } if (IsMetaClass(interp, cl)) { /* * if the base class is a meta-class, we create a class */ XOTclClass *newcl = PrimitiveCCreate(interp, objName, cl); if (newcl == 0) result = XOTclVarErrMsg(interp, "Class alloc failed for '", objName, "' (possibly parent namespace does not exist)", (char *) NULL); else { Tcl_SetObjResult(interp, newcl->object.cmdName); result = TCL_OK; } } else { /* * if the base class is an ordinary class, we create an object */ XOTclObject *newobj = PrimitiveOCreate(interp, objName, cl); if (newobj == 0) result = XOTclVarErrMsg(interp, "Object alloc failed for '", objName, "' (possibly parent namespace does not exist)", (char *) NULL); else { result = TCL_OK; Tcl_SetObjResult(interp, newobj->cmdName); } } if (tmpName) { DECR_REF_COUNT(tmpName); } } return result; } static int createMethod(Tcl_Interp *interp, XOTclClass *cl, XOTclObject *obj, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *newobj = NULL; Tcl_Obj *nameObj, *tmpObj = NULL; int result; char *objName, *specifiedName; ALLOC_ON_STACK(Tcl_Obj*, objc, tov); memcpy(tov, objv, sizeof(Tcl_Obj *)*(objc)); specifiedName = objName = ObjStr(objv[1]); /* * complete the name if it is not absolute */ if (!isAbsolutePath(objName)) { tmpObj = NameInNamespaceObj(interp, objName, callingNameSpace(interp)); objName = ObjStr(tmpObj); /*fprintf(stderr," **** name is '%s'\n", objName);*/ INCR_REF_COUNT(tmpObj); tov[1] = tmpObj; } /* * Check whether we have to call recreate (i.e. when the * object exists already) */ newobj = XOTclpGetObject(interp, objName); /*fprintf(stderr,"+++ create objv[1] '%s', specifiedName '%s', newObj=%p\n", specifiedName, objName, newobj);*/ /* don't allow to - recreate an object as a class, and to - recreate a class as an object In these clases, we use destroy + create instead of recrate. */ if (newobj && (IsMetaClass(interp, cl) == IsMetaClass(interp, newobj->cl))) { /*fprintf(stderr, "%%%% recreate, call recreate method ... %s, objc=%d\n", ObjStr(tov[1]), objc+1);*/ /* call recreate --> initialization */ result = callMethod((ClientData) obj, interp, XOTclGlobalObjects[XOTE_RECREATE], objc+1, tov+1, 0); if (result != TCL_OK) goto create_method_exit; Tcl_SetObjResult(interp, newobj->cmdName); nameObj = newobj->cmdName; objTrace("RECREATE", newobj); } else { /* newobj might exist here, but will be automatically destroyed by alloc */ if (!NSCheckColons(specifiedName, 0)) { result = XOTclVarErrMsg(interp, "Cannot create object -- illegal name '", specifiedName, "'", (char *) NULL); goto create_method_exit; } /* fprintf(stderr, "alloc ... %s\n", ObjStr(tov[1]));*/ result = callMethod((ClientData) obj, interp, XOTclGlobalObjects[XOTE_ALLOC], objc+1, tov+1, 0); if (result != TCL_OK) goto create_method_exit; nameObj = Tcl_GetObjResult(interp); if (XOTclObjConvertObject(interp, nameObj, &newobj) != TCL_OK) { result = XOTclErrMsg(interp, "couldn't find result of alloc", TCL_STATIC); goto create_method_exit; } (void)RemoveInstance(newobj, newobj->cl); AddInstance(newobj, cl); objTrace("CREATE", newobj); /* in case, the object is destroyed during initialization, we incr refcount */ INCR_REF_COUNT(nameObj); result = doObjInitialization(interp, newobj, objc, objv); DECR_REF_COUNT(nameObj); } create_method_exit: /* fprintf(stderr, "create -- end ... %s\n", ObjStr(tov[1]));*/ if (tmpObj) {DECR_REF_COUNT(tmpObj);} FREE_ON_STACK(Tcl_Obj *, tov); return result; } static int XOTclCCreateMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "create ?args?"); if (RUNTIME_STATE(interp)->exitHandlerDestroyRound != XOTCL_EXITHANDLER_OFF) { fprintf(stderr,"### Can't create object %s during shutdown\n", ObjStr(objv[1])); return TCL_ERROR; } return createMethod(interp, cl, &cl->object, objc, objv); } static int XOTclCNewMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); XOTclObject *child = NULL; Tcl_Obj *fullname; int result, offset = 1, #if REFCOUNTED isrefcount = 0, #endif i, prefixLength; Tcl_DString dFullname, *dsPtr = &dFullname; XOTclStringIncrStruct *iss = &RUNTIME_STATE(interp)->iss; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 1) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "new [-childof obj] ?args?"); for (i=1; icmdName), -1); Tcl_DStringAppend(dsPtr, "::__#", 5); } else { Tcl_DStringAppend(dsPtr, "::xotcl::__#", 12); } prefixLength = dsPtr->length; while (1) { (void)XOTclStringIncr(iss); Tcl_DStringAppend(dsPtr, iss->start, iss->length); if (!Tcl_FindCommand(interp, Tcl_DStringValue(dsPtr), NULL, 0)) { break; } /* in case the value existed already, reset prefix to the original length */ Tcl_DStringSetLength(dsPtr, prefixLength); } fullname = Tcl_NewStringObj(Tcl_DStringValue(dsPtr), Tcl_DStringLength(dsPtr)); INCR_REF_COUNT(fullname); objc -= offset; { ALLOC_ON_STACK(Tcl_Obj*, objc+3, ov); ov[0] = objv[0]; ov[1] = XOTclGlobalObjects[XOTE_CREATE]; ov[2] = fullname; if (objc >= 1) memcpy(ov+3, objv+offset, sizeof(Tcl_Obj *)*objc); result = DoDispatch(cd, interp, objc+3, ov, 0); FREE_ON_STACK(Tcl_Obj *, ov); } #if REFCOUNTED if (result == TCL_OK) { if (isrefcount) { Tcl_Obj *obj = Tcl_GetObjResult(interp); XOTclObject *o = (XOTclObject*) obj->internalRep.otherValuePtr; o->flags |= XOTCL_REFCOUNTED; o->teardown = in; DECR_REF_COUNT(obj); } } #endif DECR_REF_COUNT(fullname); Tcl_DStringFree(dsPtr); return result; } static int XOTclCRecreateMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); XOTclObject *newobj; int result; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "recreate ?args?"); if (XOTclObjConvertObject(interp, objv[1], &newobj) != TCL_OK) return XOTclVarErrMsg(interp, "can't recreate not existing obj ", ObjStr(objv[1]), (char *) NULL); INCR_REF_COUNT(objv[1]); newobj->flags |= XOTCL_RECREATE; result = doCleanup(interp, newobj, &cl->object, objc, objv); if (result == TCL_OK) { result = doObjInitialization(interp, newobj, objc, objv); if (result == TCL_OK) Tcl_SetObjResult(interp, objv[1]); } DECR_REF_COUNT(objv[1]); return result; } static int XOTclCInfoMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); XOTclClassOpt *opt; char *pattern, *cmd; if (objc < 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info ?args?"); if (cl) { int modifiers = 0; Tcl_Namespace *nsp = cl->nsPtr; opt = cl->opt; cmd = ObjStr(objv[1]); pattern = (objc > 2) ? ObjStr(objv[2]) : 0; /* * check for "-" modifiers */ if (pattern && *pattern == '-') { modifiers = countModifiers(objc, objv); pattern = (objc > 2+modifiers) ? ObjStr(objv[2+modifiers]) : 0; } switch (*cmd) { case 'c': if (!strcmp(cmd, "classchildren")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info classchildren ?pattern?"); return ListChildren(interp, (XOTclObject*) cl, pattern, 1); } else if (!strcmp(cmd, "classparent")) { if (objc > 2 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info classparent"); return ListParent(interp, &cl->object); } break; case 'h': if (!strcmp(cmd, "heritage")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info heritage ?pattern?"); return ListHeritage(interp, cl, pattern); } break; case 'i': if (cmd[1] == 'n' && cmd[2] == 's' && cmd[3] == 't') { char *cmdTail = cmd + 4; switch (*cmdTail) { case 'a': if (!strcmp(cmdTail, "ances")) { int withClosure = 0, rc; XOTclObject *matchObject; Tcl_DString ds, *dsPtr = &ds; if (objc-modifiers > 3 || modifiers > 1) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instances ?-closure? ?pattern?"); if (modifiers > 0) { withClosure = checkForModifier(objv, modifiers, "-closure"); if (withClosure == 0) return XOTclVarErrMsg(interp, "info instances: unknown modifier ", ObjStr(objv[2]), (char *) NULL); } DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } rc = listInstances(interp, cl, pattern, withClosure, matchObject); if (matchObject) { Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); } DSTRING_FREE(dsPtr); return TCL_OK; } else if (!strcmp(cmdTail, "args")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instargs "); if (cl->nonposArgsTable) { XOTclNonposArgs *nonposArgs = NonposArgsGet(cl->nonposArgsTable, pattern); if (nonposArgs) { return ListArgsFromOrdinaryArgs(interp, nonposArgs); } } return ListProcArgs(interp, Tcl_Namespace_cmdTable(nsp), pattern); } break; case 'b': if (!strcmp(cmdTail, "body")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instbody "); return ListProcBody(interp, Tcl_Namespace_cmdTable(nsp), pattern); } break; case 'c': if (!strcmp(cmdTail, "commands")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instcommands ?pattern?"); return ListKeys(interp, Tcl_Namespace_cmdTable(nsp), pattern); } break; case 'd': if (!strcmp(cmdTail, "default")) { if (objc != 5 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instdefault "); if (cl->nonposArgsTable) { XOTclNonposArgs *nonposArgs = NonposArgsGet(cl->nonposArgsTable, pattern); if (nonposArgs) { return ListDefaultFromOrdinaryArgs(interp, pattern, nonposArgs, ObjStr(objv[3]), objv[4]); } } return ListProcDefault(interp, Tcl_Namespace_cmdTable(nsp), pattern, ObjStr(objv[3]), objv[4]); } break; case 'f': if (!strcmp(cmdTail, "filter")) { int withGuards = 0; if (objc-modifiers > 3) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instfilter ?-guards? ?pattern?"); if (modifiers > 0) { withGuards = checkForModifier(objv, modifiers, "-guards"); if (withGuards == 0) return XOTclVarErrMsg(interp, "info instfilter: unknown modifier ", ObjStr(objv[2]), (char *) NULL); } return opt ? FilterInfo(interp, opt->instfilters, pattern, withGuards, 0) : TCL_OK; } else if (!strcmp(cmdTail, "filterguard")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instfilterguard filter"); return opt ? GuardList(interp, opt->instfilters, pattern) : TCL_OK; } else if (!strcmp(cmdTail, "forward")) { int argc = objc-modifiers; int definition; if (argc < 2 || argc > 3) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instforward ?-definition? ?name?"); definition = checkForModifier(objv, modifiers, "-definition"); if (definition && argc < 3) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instforward ?-definition? ?name?"); if (nsp) { return forwardList(interp, Tcl_Namespace_cmdTable(nsp), pattern, definition); } else { return TCL_OK; } } break; case 'i': if (!strcmp(cmdTail, "invar")) { XOTclAssertionStore *assertions = opt ? opt->assertions : 0; if (objc != 2 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instinvar"); if (assertions && assertions->invariants) Tcl_SetObjResult(interp, AssertionList(interp, assertions->invariants)); return TCL_OK; } break; case 'm': if (!strcmp(cmdTail, "mixin")) { int withClosure = 0, withGuards = 0, rc = TCL_OK; XOTclObject *matchObject; Tcl_DString ds, *dsPtr = &ds; if (objc-modifiers > 3 || modifiers > 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instmixin ?-closure? ?-guards? ?pattern?"); if (modifiers > 0) { withGuards = checkForModifier(objv, modifiers, "-guards"); withClosure = checkForModifier(objv, modifiers, "-closure"); if ((withGuards == 0) && (withClosure == 0)) return XOTclVarErrMsg(interp, "info instfilter: unknown modifier ", ObjStr(objv[2]), (char *) NULL); } if ((opt) || (withClosure)) { DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } if (withClosure) { Tcl_HashTable objTable, *commandTable = &objTable; MEM_COUNT_ALLOC("Tcl_InitHashTable", commandTable); Tcl_InitHashTable(commandTable, TCL_ONE_WORD_KEYS); rc = getAllClassMixins(interp, commandTable, cl, withGuards, pattern, matchObject); if (matchObject && rc && !withGuards) { Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); } Tcl_DeleteHashTable(commandTable); MEM_COUNT_FREE("Tcl_InitHashTable", commandTable); } else if (opt) { MixinInfo(interp, opt->instmixins, pattern, withGuards, matchObject); } DSTRING_FREE(dsPtr); } return TCL_OK; } else if (!strcmp(cmdTail, "mixinof")) { int withClosure = 0; XOTclObject *matchObject; Tcl_DString ds, *dsPtr = &ds; if (objc-modifiers > 3 || modifiers > 1) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instmixinof ?-closure? ?class?"); if (modifiers > 0) { withClosure = checkForModifier(objv, modifiers, "-closure"); if (withClosure == 0) return XOTclVarErrMsg(interp, "info instmixinof: unknown modifier ", ObjStr(objv[2]), (char *) NULL); } if (opt) { int rc; DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } if (withClosure) { Tcl_HashTable objTable, *commandTable = &objTable; MEM_COUNT_ALLOC("Tcl_InitHashTable", commandTable); Tcl_InitHashTable(commandTable, TCL_ONE_WORD_KEYS); rc = getAllClassMixinsOf(interp, commandTable, cl, 0, 1, pattern, matchObject); Tcl_DeleteHashTable(commandTable); MEM_COUNT_FREE("Tcl_InitHashTable", commandTable); } else { rc = AppendMatchingElementsFromCmdList(interp, opt->isClassMixinOf, pattern, matchObject); } if (matchObject) { Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); } DSTRING_FREE(dsPtr); } return TCL_OK; } else if (!strcmp(cmdTail, "mixinguard")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instmixinguard mixin"); return opt ? GuardList(interp, opt->instmixins, pattern) : TCL_OK; } break; case 'n': if (!strcmp(cmdTail, "nonposargs")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instnonposargs "); if (cl->nonposArgsTable) { XOTclNonposArgs *nonposArgs = NonposArgsGet(cl->nonposArgsTable, pattern); if (nonposArgs) { Tcl_SetObjResult(interp, NonposArgsFormat(interp, nonposArgs->nonposArgs)); } } return TCL_OK; } break; case 'p': if (!strcmp(cmdTail, "procs")) { if (objc > 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instprocs ?pattern?"); return ListMethodKeys(interp, Tcl_Namespace_cmdTable(nsp), pattern, /*noProcs*/ 0, /*noCmds*/ 1, /* noDups */ 0, 0, 0); } else if (!strcmp(cmdTail, "pre")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instpre "); if (opt && opt->assertions) { XOTclProcAssertion *procs = AssertionFindProcs(opt->assertions, ObjStr(objv[2])); if (procs) Tcl_SetObjResult(interp, AssertionList(interp, procs->pre)); } return TCL_OK; } else if (!strcmp(cmdTail, "post")) { if (objc != 3 || modifiers > 0) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instpost "); if (opt && opt->assertions) { XOTclProcAssertion *procs = AssertionFindProcs(opt->assertions, ObjStr(objv[2])); if (procs) Tcl_SetObjResult(interp, AssertionList(interp, procs->post)); } return TCL_OK; } else if (!strcmp(cmdTail, "parametercmd")) { int argc = objc-modifiers; if (argc < 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info instparametercmd ?pattern?"); if (nsp) { return ListMethodKeys(interp, Tcl_Namespace_cmdTable(nsp), pattern, 1, 0, 0, 0, 1); } else { return TCL_OK; } } break; } } break; case 'm': if (!strcmp(cmd, "mixinof")) { XOTclObject *matchObject = NULL; Tcl_DString ds, *dsPtr = &ds; int rc = TCL_OK, withClosure = 0; if (objc-modifiers > 3 || modifiers > 1) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info mixinof ?-closure? ?pattern?"); if (modifiers > 0) { withClosure = checkForModifier(objv, modifiers, "-closure"); if (withClosure == 0) return XOTclVarErrMsg(interp, "info mixinof: unknown modifier ", ObjStr(objv[2]), (char *) NULL); } if (opt && !withClosure) { DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } rc = AppendMatchingElementsFromCmdList(interp, opt->isObjectMixinOf, pattern, matchObject); if (matchObject) { Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); } DSTRING_FREE(dsPtr); } else if (withClosure) { Tcl_HashTable objTable, *commandTable = &objTable; MEM_COUNT_ALLOC("Tcl_InitHashTable", commandTable); Tcl_InitHashTable(commandTable, TCL_ONE_WORD_KEYS); getAllObjectMixinsOf(interp, commandTable, cl, 0, 1, pattern, matchObject); Tcl_DeleteHashTable(commandTable); MEM_COUNT_FREE("Tcl_InitHashTable", commandTable); } return TCL_OK; } break; case 'p': if (!strcmp(cmd, "parameterclass")) { if (opt && opt->parameterClass) { Tcl_SetObjResult(interp, opt->parameterClass); } else { Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_PARAM_CL]); } return TCL_OK; } else if (!strcmp(cmd, "parameter")) { Tcl_DString ds, *dsPtr = &ds; XOTclObject *o; DSTRING_INIT(dsPtr); Tcl_DStringAppend(dsPtr, className(cl), -1); Tcl_DStringAppend(dsPtr, "::slot", 6); o = XOTclpGetObject(interp, Tcl_DStringValue(dsPtr)); if (o) { Tcl_Obj *varNameObj = Tcl_NewStringObj("__parameter",-1); Tcl_Obj *parameters = XOTclOGetInstVar2((XOTcl_Object*)o, interp, varNameObj, NULL, TCL_LEAVE_ERR_MSG); if (parameters) { Tcl_SetObjResult(interp, parameters); } else { fprintf(stderr, "info parameters: No value for %s\n", Tcl_DStringValue(dsPtr)); Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); } DECR_REF_COUNT(varNameObj); } else { Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); } DSTRING_FREE(dsPtr); #if 0 if (cl->parameters) { Tcl_SetObjResult(interp, cl->parameters); } else { Tcl_SetObjResult(interp, XOTclGlobalObjects[XOTE_EMPTY]); } #endif return TCL_OK; } break; case 's': if (!strcmp(cmd, "superclass")) { int withClosure = 0, rc; XOTclObject *matchObject; Tcl_DString ds, *dsPtr = &ds; if (objc-modifiers > 3 || modifiers > 1) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info superclass ?-closure? ?pattern?"); if (modifiers > 0) { withClosure = checkForModifier(objv, modifiers, "-closure"); if (withClosure == 0) return XOTclVarErrMsg(interp, "info superclass: unknown modifier ", ObjStr(objv[2]), (char *) NULL); } DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } if (withClosure) { XOTclClasses *pl = ComputeOrder(cl, cl->order, Super); if (pl) pl=pl->next; rc = AppendMatchingElementsFromClasses(interp, pl, pattern, matchObject); } else { XOTclClasses *clSuper = XOTclReverseClasses(cl->super); rc = AppendMatchingElementsFromClasses(interp, clSuper, pattern, matchObject); XOTclFreeClasses(clSuper); } if (matchObject) { Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); } DSTRING_FREE(dsPtr); return TCL_OK; } else if (!strcmp(cmd, "subclass")) { int withClosure = 0, rc; XOTclObject *matchObject; Tcl_DString ds, *dsPtr = &ds; if (objc-modifiers > 3 || modifiers > 1) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "info subclass ?-closure? ?pattern?"); if (modifiers > 0) { withClosure = checkForModifier(objv, modifiers, "-closure"); if (withClosure == 0) return XOTclVarErrMsg(interp, "info subclass: unknown modifier ", ObjStr(objv[2]), (char *) NULL); } DSTRING_INIT(dsPtr); if (getMatchObject(interp, &pattern, &matchObject, dsPtr) == -1) { return TCL_OK; } if (withClosure) { XOTclClasses *saved = cl->order, *subclasses; cl->order = NULL; subclasses = ComputeOrder(cl, cl->order, Sub); cl->order = saved; rc = AppendMatchingElementsFromClasses(interp, subclasses ? subclasses->next : NULL, pattern, matchObject); XOTclFreeClasses(subclasses); } else { rc = AppendMatchingElementsFromClasses(interp, cl->sub, pattern, matchObject); } if (matchObject) { Tcl_SetObjResult(interp, rc ? matchObject->cmdName : XOTclGlobalObjects[XOTE_EMPTY]); } DSTRING_FREE(dsPtr); return TCL_OK; } else if (!strcmp(cmd, "slots")) { Tcl_DString ds, *dsPtr = &ds; XOTclObject *o; int rc; DSTRING_INIT(dsPtr); Tcl_DStringAppend(dsPtr, className(cl), -1); Tcl_DStringAppend(dsPtr, "::slot", 6); o = XOTclpGetObject(interp, Tcl_DStringValue(dsPtr)); if (o) { rc = ListChildren(interp, o, NULL, 0); } else { rc = TCL_OK; } DSTRING_FREE(dsPtr); return rc; } break; } } return XOTclOInfoMethod(cd, interp, objc, (Tcl_Obj **)objv); } static int XOTclCParameterMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); Tcl_Obj **pv; int pc, result; char * params; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc != 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "parameter ?params?"); if (cl->parameters) { DECR_REF_COUNT(cl->parameters); } /* did we delete the parameters ? */ params = ObjStr(objv[1]); if ((params == NULL) || (*params == '\0')) { cl->parameters = NULL; return TCL_OK; } /* ok, remember the params */ cl->parameters = objv[1]; INCR_REF_COUNT(cl->parameters); /* call getter/setter methods in params */ result = Tcl_ListObjGetElements(interp, objv[1], &pc, &pv); if (result == TCL_OK) { int elts; for (elts = 0; elts < pc; elts++) { result = callParameterMethodWithArg(&cl->object, interp, XOTclGlobalObjects[XOTE_MKGETTERSETTER], cl->object.cmdName, 3+1, &pv[elts], 0); if (result != TCL_OK) break; } } return result; } static int XOTclCParameterClassMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); char *paramClStr; XOTclClassOpt *opt; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc != 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "parameterclass cl"); paramClStr = ObjStr(objv[1]); opt = cl->opt; if (opt && opt->parameterClass) { DECR_REF_COUNT(opt->parameterClass); } if ((paramClStr == NULL) || (*paramClStr == '\0')) { if (opt) opt->parameterClass = NULL; } else { opt = XOTclRequireClassOpt(cl); opt->parameterClass = objv[1]; INCR_REF_COUNT(opt->parameterClass); } return TCL_OK; } static int XOTclCInstParameterCmdMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "instparametercmd name"); XOTclAddIMethod(interp, (XOTcl_Class*) cl, ObjStr(objv[1]), (Tcl_ObjCmdProc*)XOTclSetterMethod, 0, 0); return TCL_OK; } static int XOTclCParameterCmdMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclObject *obj = (XOTclObject*) cd; if (objc < 2) return XOTclObjErrArgCnt(interp, obj->cmdName, "parametercmd name"); XOTclAddPMethod(interp, (XOTcl_Object*) obj, ObjStr(objv[1]), (Tcl_ObjCmdProc*)XOTclSetterMethod, 0, 0); return TCL_OK; } static void forwardCmdDeleteProc(ClientData cd) { forwardCmdClientData *tcd = (forwardCmdClientData *)cd; if (tcd->cmdName) {DECR_REF_COUNT(tcd->cmdName);} if (tcd->subcommands) {DECR_REF_COUNT(tcd->subcommands);} if (tcd->prefix) {DECR_REF_COUNT(tcd->prefix);} if (tcd->args) {DECR_REF_COUNT(tcd->args);} FREE(forwardCmdClientData, tcd); } static int forwardProcessOptions(Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[], forwardCmdClientData **tcdp) { forwardCmdClientData *tcd; int i, rc = 0, earlybinding = 0; tcd = NEW(forwardCmdClientData); memset(tcd, 0, sizeof(forwardCmdClientData)); for (i=2; isubcommands = objv[i+1]; rc = Tcl_ListObjLength(interp, objv[i+1],&tcd->nr_subcommands); if (rc != TCL_OK) break; INCR_REF_COUNT(tcd->subcommands); i++; } else if (!strcmp(ObjStr(objv[i]),"-methodprefix")) { if (objc <= i+1) {rc = TCL_ERROR; break;} tcd->prefix = objv[i+1]; INCR_REF_COUNT(tcd->prefix); i++; } else if (!strcmp(ObjStr(objv[i]),"-objscope")) { tcd->objscope = 1; } else if (!strcmp(ObjStr(objv[i]),"-earlybinding")) { earlybinding = 1; } else if (!strcmp(ObjStr(objv[i]),"-verbose")) { tcd->verbose = 1; } else { break; } } tcd->needobjmap = 0; for (; ineedobjmap |= (*element == '%' && *(element+1) == '@'); if (tcd->cmdName == NULL) { tcd->cmdName = objv[i]; } else if (tcd->args == NULL) { tcd->args = Tcl_NewListObj(1, &objv[i]); tcd->nr_args++; INCR_REF_COUNT(tcd->args); } else { Tcl_ListObjAppendElement(interp, tcd->args, objv[i]); tcd->nr_args++; } } if (!tcd->cmdName) { tcd->cmdName = objv[1]; } if (tcd->objscope) { /* when we evaluating objscope, and define ... o forward append -objscope append a call to o append ... would lead to a recursive call; so we add the appropriate namespace */ char *name = ObjStr(tcd->cmdName); if (!isAbsolutePath(name)) { tcd->cmdName = NameInNamespaceObj(interp, name, callingNameSpace(interp)); /*fprintf(stderr,"name %s not absolute, therefore qualifying %s\n", name, ObjStr(tcd->cmdName));*/ } } INCR_REF_COUNT(tcd->cmdName); if (earlybinding) { Tcl_Command cmd = Tcl_GetCommandFromObj(interp, tcd->cmdName); if (cmd == NULL) return XOTclVarErrMsg(interp, "cannot lookup command '", ObjStr(tcd->cmdName), "'", (char *) NULL); tcd->objProc = Tcl_Command_objProc(cmd); if (tcd->objProc == XOTclObjDispatch /* don't do direct invoke on xotcl objects */ || tcd->objProc == TclObjInterpProc /* don't do direct invoke on tcl procs */ ) { /* silently ignore earlybinding flag */ tcd->objProc = NULL; } else { tcd->cd = Tcl_Command_objClientData(cmd); } } tcd->passthrough = !tcd->args && *(ObjStr(tcd->cmdName)) != '%' && tcd->objProc; /*fprintf(stderr, "forward args = %p, name = '%s'\n", tcd->args, ObjStr(tcd->cmdName));*/ if (rc == TCL_OK) { *tcdp = tcd; } else { forwardCmdDeleteProc((ClientData)tcd); } return rc; } static int XOTclCInstForwardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); forwardCmdClientData *tcd; int rc; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 2) goto forward_argc_error; rc = forwardProcessOptions(interp, objc, objv, &tcd); if (rc == TCL_OK) { tcd->obj = &cl->object; XOTclAddIMethod(interp, (XOTcl_Class*) cl, NSTail(ObjStr(objv[1])), (Tcl_ObjCmdProc*)XOTclForwardMethod, (ClientData)tcd, forwardCmdDeleteProc); return TCL_OK; } else { forwardCmdDeleteProc((ClientData)tcd); forward_argc_error: return XOTclObjErrArgCnt(interp, cl->object.cmdName, "instforward method ?target? ?-default name? ?-objscope? ?-methodprefix string? ?args?"); } } static int XOTclOForwardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTcl_Object *obj = (XOTcl_Object*) cd; forwardCmdClientData *tcd; int rc; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); if (objc < 2) goto forward_argc_error; rc = forwardProcessOptions(interp, objc, objv, &tcd); if (rc == TCL_OK) { tcd->obj = (XOTclObject*)obj; XOTclAddPMethod(interp, obj, NSTail(ObjStr(objv[1])), (Tcl_ObjCmdProc*)XOTclForwardMethod, (ClientData)tcd, forwardCmdDeleteProc); return TCL_OK; } else { forwardCmdDeleteProc((ClientData)tcd); forward_argc_error: return XOTclObjErrArgCnt(interp, obj->cmdName, "forward method ?target? ?-default name? ?-objscope? ?-methodprefix string? ?args?"); } } static int XOTclOVolatileMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[]) { XOTclObject *obj = (XOTclObject*) cd; Tcl_Obj *o = obj->cmdName; int result = TCL_ERROR; CONST char *fullName = ObjStr(o); CONST char *vn; callFrameContext ctx = {0}; if (objc != 1) return XOTclObjErrArgCnt(interp, obj->cmdName, "volatile"); if (RUNTIME_STATE(interp)->exitHandlerDestroyRound != XOTCL_EXITHANDLER_OFF) { fprintf(stderr,"### Can't make objects volatile during shutdown\n"); return XOTclVarErrMsg(interp, "Can't make objects volatile during shutdown\n", NULL); } CallStackUseActiveFrames(interp, &ctx); vn = NSTail(fullName); if (Tcl_SetVar2(interp, vn, NULL, fullName, 0)) { XOTclObjectOpt *opt = XOTclRequireObjectOpt(obj); /*fprintf(stderr,"### setting trace for %s\n", fullName);*/ result = Tcl_TraceVar(interp, vn, TCL_TRACE_UNSETS, (Tcl_VarTraceProc*)XOTclUnsetTrace, (ClientData)o); opt->volatileVarName = vn; } CallStackRestoreSavedFrames(interp, &ctx); if (result == TCL_OK) { INCR_REF_COUNT(o); } return result; } static int XOTclCInstProcMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); char *argStr, *bdyStr, *name; XOTclClassOpt *opt; int incr = 0, result = TCL_OK; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc < 4 || objc > 7) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "instproc name ?non-positional-args? args body ?preAssertion postAssertion?"); if (objc == 5 || objc == 7) { incr = 1; } argStr = ObjStr(objv[2 + incr]); bdyStr = ObjStr(objv[3 + incr]); name = ObjStr(objv[1 + incr]); if ((cl == RUNTIME_STATE(interp)->theObject && isDestroyString(name)) || (cl == RUNTIME_STATE(interp)->theClass && isInstDestroyString(name)) || (cl == RUNTIME_STATE(interp)->theClass && isAllocString(name)) || (cl == RUNTIME_STATE(interp)->theClass && isCreateString(name))) return XOTclVarErrMsg(interp, className(cl), " instproc: '", name, "' of ", className(cl), " can not be overwritten. Derive a ", "sub-class", (char *) NULL); if (*argStr == 0 && *bdyStr == 0) { int rc; opt = cl->opt; if (opt && opt->assertions) AssertionRemoveProc(opt->assertions, name); rc = NSDeleteCmd(interp, cl->nsPtr, name); if (rc < 0) return XOTclVarErrMsg(interp, className(cl), " cannot delete instproc: '", name, "' of class ", className(cl), (char *) NULL); } else { XOTclAssertionStore *aStore = NULL; if (objc > 5) { opt = XOTclRequireClassOpt(cl); if (!opt->assertions) opt->assertions = AssertionCreateStore(); aStore = opt->assertions; } result = MakeProc(cl->nsPtr, aStore, &(cl->nonposArgsTable), interp, objc, (Tcl_Obj **) objv, &cl->object); } /* could be a filter or filter inheritance ... update filter orders */ FilterInvalidateObjOrders(interp, cl); return result; } static int XOTclCInstFilterGuardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); XOTclClassOpt *opt; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc != 3) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "instfilterguard filtername filterGuard"); opt = cl->opt; if (opt && opt->instfilters) { XOTclCmdList *h = CmdListFindNameInList(interp, ObjStr(objv[1]), opt->instfilters); if (h) { if (h->clientData) GuardDel(h); GuardAdd(interp, h, objv[2]); FilterInvalidateObjOrders(interp, cl); return TCL_OK; } } return XOTclVarErrMsg(interp, "Instfilterguard: can't find filter ", ObjStr(objv[1]), " on ", ObjStr(cl->object.cmdName), (char *) NULL); } static int XOTclCInstMixinGuardMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc != 3) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "instmixinguard mixin guard"); if (cl->opt && cl->opt->instmixins) { XOTclClass *mixinCl = XOTclpGetClass(interp, ObjStr(objv[1])); Tcl_Command mixinCmd = NULL; if (mixinCl) { mixinCmd = Tcl_GetCommandFromObj(interp, mixinCl->object.cmdName); } if (mixinCmd) { XOTclCmdList *h = CmdListFindCmdInList(mixinCmd, cl->opt->instmixins); if (h) { if (h->clientData) GuardDel((XOTclCmdList*) h); GuardAdd(interp, h, objv[2]); MixinInvalidateObjOrders(interp, cl); return TCL_OK; } } } return XOTclVarErrMsg(interp, "Instmixinguard: can't find mixin ", ObjStr(objv[1]), " on ", ObjStr(cl->object.cmdName), (char *) NULL); } static int XOTclCInvariantsMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclClass *cl = XOTclObjectToClass(cd); XOTclClassOpt *opt; if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (objc != 2) return XOTclObjErrArgCnt(interp, cl->object.cmdName, "instinvar "); opt = XOTclRequireClassOpt(cl); if (opt->assertions) TclObjListFreeList(opt->assertions->invariants); else opt->assertions = AssertionCreateStore(); opt->assertions->invariants = AssertionNewList(interp, objv[1]); return TCL_OK; } static int XOTclCUnknownMethod(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*) cd; char *self = ObjStr(obj->cmdName); int rc; if (objc < 2) return XOTclObjErrArgCnt(interp, objv[0], "message ?args .. args?"); if (isCreateString(self)) return XOTclVarErrMsg(interp, "error ", self, ": unable to dispatch '", ObjStr(objv[1]), "'", (char *) NULL); rc = callMethod(cd, interp, XOTclGlobalObjects[XOTE_CREATE], objc+1, objv+1, 0); return rc; } /* * New Tcl Commands */ static int XOTcl_NSCopyCmds(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Command cmd; char *name; Tcl_Namespace *ns, *newNs; Tcl_HashTable *cmdTable, *nonposArgsTable; Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; XOTclObject *obj; XOTclClass *cl; if (objc != 3) return XOTclObjErrArgCnt(interp, NULL, "namespace_copycmds fromNs toNs"); ns = ObjFindNamespace(interp, objv[1]); if (!ns) return TCL_OK; name = ObjStr(objv[1]); /* check, if we work on an object or class namespace */ if (isClassName(name)) { cl = XOTclpGetClass(interp, NSCutXOTclClasses(name)); obj = (XOTclObject *)cl; nonposArgsTable = cl->nonposArgsTable; } else { cl = NULL; obj = XOTclpGetObject(interp, name); nonposArgsTable = obj->nonposArgsTable; } if (obj == NULL) { return XOTclVarErrMsg(interp, "CopyCmds argument 1 (",ObjStr(objv[1]),") is not an object", NULL); } /* obj = XOTclpGetObject(interp, ObjStr(objv[1]));*/ newNs = ObjFindNamespace(interp, objv[2]); if (!newNs) return XOTclVarErrMsg(interp, "CopyCmds: Destination namespace ", ObjStr(objv[2]), " does not exist", (char *) NULL); /* * copy all procs & commands in the ns */ cmdTable = Tcl_Namespace_cmdTable(ns); hPtr = Tcl_FirstHashEntry(cmdTable, &hSrch); while (hPtr) { Tcl_Obj *newFullCmdName, *oldFullCmdName; char *newName, *oldName; name = Tcl_GetHashKey(cmdTable, hPtr); /* * construct full cmd names */ newFullCmdName = Tcl_NewStringObj(newNs->fullName,-1); oldFullCmdName = Tcl_NewStringObj(ns->fullName,-1); INCR_REF_COUNT(newFullCmdName); INCR_REF_COUNT(oldFullCmdName); Tcl_AppendStringsToObj(newFullCmdName, "::", name, (char *) NULL); Tcl_AppendStringsToObj(oldFullCmdName, "::", name, (char *) NULL); newName = ObjStr(newFullCmdName); oldName = ObjStr(oldFullCmdName); /* * Make sure that the destination command does not already exist. * Otherwise: do not copy */ cmd = Tcl_FindCommand(interp, newName, 0, 0); if (cmd) { /*fprintf(stderr, "%s already exists\n", newName);*/ if (!XOTclpGetObject(interp, newName)) { /* command or instproc will be deleted & then copied */ Tcl_DeleteCommandFromToken(interp, cmd); } else { /* don't overwrite objects -> will be recreated */ hPtr = Tcl_NextHashEntry(&hSrch); DECR_REF_COUNT(newFullCmdName); DECR_REF_COUNT(oldFullCmdName); continue; } } /* * Find the existing command. An error is returned if simpleName can't * be found */ cmd = Tcl_FindCommand(interp, oldName, 0, 0); if (cmd == NULL) { Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), "can't copy ", " \"", oldName, "\": command doesn't exist", (char *) NULL); DECR_REF_COUNT(newFullCmdName); DECR_REF_COUNT(oldFullCmdName); return TCL_ERROR; } /* * Do not copy Objects or Classes */ if (!XOTclpGetObject(interp, oldName)) { if (TclIsProc((Command*)cmd)) { Proc *procPtr = TclFindProc((Interp *)interp, oldName); Tcl_Obj *arglistObj = NULL; CompiledLocal *localPtr; /* * Build a list containing the arguments of the proc */ if (nonposArgsTable) { XOTclNonposArgs *nonposArgs = NonposArgsGet(nonposArgsTable, name); if (nonposArgs) { arglistObj = NonposArgsFormat(interp, nonposArgs->nonposArgs); INCR_REF_COUNT(arglistObj); AppendOrdinaryArgsFromNonposArgs(interp, nonposArgs, 0, arglistObj); } } if (!arglistObj) { arglistObj = Tcl_NewListObj(0, NULL); INCR_REF_COUNT(arglistObj); for (localPtr = procPtr->firstLocalPtr; localPtr; localPtr = localPtr->nextPtr) { if (TclIsCompiledLocalArgument(localPtr)) { Tcl_Obj *defVal, *defStringObj = Tcl_NewStringObj(localPtr->name, -1); INCR_REF_COUNT(defStringObj); /* check for default values */ if ((GetProcDefault(interp, cmdTable, name, localPtr->name, &defVal) == TCL_OK) && defVal) { Tcl_AppendStringsToObj(defStringObj, " ", ObjStr(defVal), (char *) NULL); } Tcl_ListObjAppendElement(interp, arglistObj, defStringObj); DECR_REF_COUNT(defStringObj); } } } if (Tcl_Command_objProc(cmd) == RUNTIME_STATE(interp)->objInterpProc) { Tcl_DString ds, *dsPtr = &ds; if (cl) { /* we have a class */ XOTclProcAssertion *procs; if (cl) { procs = cl->opt ? AssertionFindProcs(cl->opt->assertions, name) : 0; } else { DECR_REF_COUNT(newFullCmdName); DECR_REF_COUNT(oldFullCmdName); DECR_REF_COUNT(arglistObj); return XOTclVarErrMsg(interp, "No class for inst - assertions", (char *) NULL); } /* XOTcl InstProc */ DSTRING_INIT(dsPtr); Tcl_DStringAppendElement(dsPtr, NSCutXOTclClasses(newNs->fullName)); Tcl_DStringAppendElement(dsPtr, "instproc"); Tcl_DStringAppendElement(dsPtr, name); Tcl_DStringAppendElement(dsPtr, ObjStr(arglistObj)); Tcl_DStringAppendElement(dsPtr, StripBodyPrefix(ObjStr(procPtr->bodyPtr))); if (procs) { XOTclRequireClassOpt(cl); AssertionAppendPrePost(interp, dsPtr, procs); } Tcl_EvalEx(interp, Tcl_DStringValue(dsPtr), Tcl_DStringLength(dsPtr), 0); DSTRING_FREE(dsPtr); } else { XOTclObject *obj = XOTclpGetObject(interp, ns->fullName); XOTclProcAssertion *procs; if (obj) { procs = obj->opt ? AssertionFindProcs(obj->opt->assertions, name) : 0; } else { DECR_REF_COUNT(newFullCmdName); DECR_REF_COUNT(oldFullCmdName); DECR_REF_COUNT(arglistObj); return XOTclVarErrMsg(interp, "No object for assertions", (char *) NULL); } /* XOTcl Proc */ DSTRING_INIT(dsPtr); Tcl_DStringAppendElement(dsPtr, newNs->fullName); Tcl_DStringAppendElement(dsPtr, "proc"); Tcl_DStringAppendElement(dsPtr, name); Tcl_DStringAppendElement(dsPtr, ObjStr(arglistObj)); Tcl_DStringAppendElement(dsPtr, StripBodyPrefix(ObjStr(procPtr->bodyPtr))); if (procs) { XOTclRequireObjectOpt(obj); AssertionAppendPrePost(interp, dsPtr, procs); } Tcl_EvalEx(interp, Tcl_DStringValue(dsPtr), Tcl_DStringLength(dsPtr), 0); DSTRING_FREE(dsPtr); } DECR_REF_COUNT(arglistObj); } else { /* Tcl Proc */ Tcl_VarEval(interp, "proc ", newName, " {", ObjStr(arglistObj),"} {\n", ObjStr(procPtr->bodyPtr), "}", (char *) NULL); } } else { /* * Otherwise copy command */ Tcl_ObjCmdProc *objProc = Tcl_Command_objProc(cmd); Tcl_CmdDeleteProc *deleteProc = Tcl_Command_deleteProc(cmd); ClientData cd; if (objProc) { cd = Tcl_Command_objClientData(cmd); if (cd == NULL || cd == XOTCL_NONLEAF_METHOD) { /* if client data not null, we would have to copy the client data; we don't know its size...., so rely on introspection for copying */ Tcl_CreateObjCommand(interp, newName, objProc, Tcl_Command_objClientData(cmd), deleteProc); } } else { cd = Tcl_Command_clientData(cmd); if (cd == NULL || cd == XOTCL_NONLEAF_METHOD) { Tcl_CreateCommand(interp, newName, Tcl_Command_proc(cmd), Tcl_Command_clientData(cmd), deleteProc); } } } } hPtr = Tcl_NextHashEntry(&hSrch); DECR_REF_COUNT(newFullCmdName); DECR_REF_COUNT(oldFullCmdName); } return TCL_OK; } static int XOTcl_NSCopyVars(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Namespace *ns, *newNs; Var *varPtr = NULL; Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; TclVarHashTable *varTable; int rc = TCL_OK; XOTclObject *obj; char *destFullName; Tcl_Obj *destFullNameObj; TclCallFrame frame, *framePtr = &frame; Tcl_Obj *varNameObj = NULL; Tcl_Obj *nobjv[4]; int nobjc; Tcl_Obj *setObj; if (objc != 3) return XOTclObjErrArgCnt(interp, NULL, "namespace_copyvars fromNs toNs"); ns = ObjFindNamespace(interp, objv[1]); if (ns) { newNs = ObjFindNamespace(interp, objv[2]); if (!newNs) return XOTclVarErrMsg(interp, "CopyVars: Destination namespace ", ObjStr(objv[2]), " does not exist", (char *) NULL); obj = XOTclpGetObject(interp, ObjStr(objv[1])); destFullName = newNs->fullName; destFullNameObj = Tcl_NewStringObj(destFullName, -1); INCR_REF_COUNT(destFullNameObj); varTable = Tcl_Namespace_varTable(ns); Tcl_PushCallFrame(interp,(Tcl_CallFrame *)framePtr, newNs, 0); } else { XOTclObject *newObj; if (XOTclObjConvertObject(interp, objv[1], &obj) != TCL_OK) { return XOTclVarErrMsg(interp, "CopyVars: Origin object/namespace ", ObjStr(objv[1]), " does not exist", (char *) NULL); } if (XOTclObjConvertObject(interp, objv[2], &newObj) != TCL_OK) { return XOTclVarErrMsg(interp, "CopyVars: Destination object/namespace ", ObjStr(objv[2]), " does not exist", (char *) NULL); } varTable = obj->varTable; destFullNameObj = newObj->cmdName; destFullName = ObjStr(destFullNameObj); } setObj= Tcl_NewStringObj("set", 3); INCR_REF_COUNT(setObj); nobjc = 4; nobjv[0] = destFullNameObj; nobjv[1] = setObj; /* copy all vars in the namespace */ hPtr = varTable ? Tcl_FirstHashEntry(VarHashTable(varTable), &hSrch) : 0; while (hPtr) { getVarAndNameFromHash(hPtr, &varPtr, &varNameObj); INCR_REF_COUNT(varNameObj); if (!TclIsVarUndefined(varPtr) && !TclIsVarLink(varPtr)) { if (TclIsVarScalar(varPtr)) { /* it may seem odd that we do not copy obj vars with the * same SetVar2 as normal vars, but we want to dispatch it in order to * be able to intercept the copying */ if (obj) { nobjv[2] = varNameObj; nobjv[3] = valueOfVar(Tcl_Obj, varPtr, objPtr); rc = Tcl_EvalObjv(interp, nobjc, nobjv, 0); } else { Tcl_ObjSetVar2(interp, varNameObj, NULL, valueOfVar(Tcl_Obj, varPtr, objPtr), TCL_NAMESPACE_ONLY); } } else { if (TclIsVarArray(varPtr)) { /* HERE!! PRE85 Why not [array get/set] based? Let the core iterate*/ TclVarHashTable *aTable = valueOfVar(TclVarHashTable, varPtr, tablePtr); Tcl_HashSearch ahSrch; Tcl_HashEntry *ahPtr = aTable ? Tcl_FirstHashEntry(VarHashTable(aTable), &ahSrch) :0; for (; ahPtr; ahPtr = Tcl_NextHashEntry(&ahSrch)) { Tcl_Obj *eltNameObj; Var *eltVar; getVarAndNameFromHash(ahPtr, &eltVar, &eltNameObj); INCR_REF_COUNT(eltNameObj); if (TclIsVarScalar(eltVar)) { if (obj) { Tcl_Obj *fullVarNameObj = Tcl_DuplicateObj(varNameObj); INCR_REF_COUNT(fullVarNameObj); Tcl_AppendStringsToObj(fullVarNameObj, "(", ObjStr(eltNameObj), ")", NULL); nobjv[2] = fullVarNameObj; nobjv[3] = valueOfVar(Tcl_Obj, eltVar, objPtr); rc = Tcl_EvalObjv(interp, nobjc, nobjv, 0); DECR_REF_COUNT(fullVarNameObj); } else { Tcl_ObjSetVar2(interp, varNameObj, eltNameObj, valueOfVar(Tcl_Obj, eltVar, objPtr), TCL_NAMESPACE_ONLY); } } DECR_REF_COUNT(eltNameObj); } } } } DECR_REF_COUNT(varNameObj); hPtr = Tcl_NextHashEntry(&hSrch); } if (ns) { DECR_REF_COUNT(destFullNameObj); Tcl_PopCallFrame(interp); } DECR_REF_COUNT(setObj); return rc; } int XOTclSelfDispatchCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *self; int result; if (objc < 2) return XOTclObjErrArgCnt(interp, objv[0], "::xotcl::my method ?args?"); if ((self = GetSelfObj(interp))) { result = DoDispatch((ClientData)self, interp, objc, objv, 0); } else { result = XOTclVarErrMsg(interp, "Cannot resolve 'self', probably called outside the context of an XOTcl Object", (char *) NULL); } return result; } #if defined(PRE85) || defined(NRE) int XOTclInitProcNSCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_CallFrame *varFramePtr = (Tcl_CallFrame *) Tcl_Interp_varFramePtr(interp); /*RUNTIME_STATE(interp)->varFramePtr = varFramePtr;*/ #if 0 Tcl_Namespace *nsPtr = Tcl_Command_nsPtr(RUNTIME_STATE(interp)->cs.top->cmdPtr); fprintf(stderr,"initProcNS self=%s cmd=%p, '%s'\n", ObjStr(RUNTIME_STATE(interp)->cs.top->self->cmdName), nsPtr, nsPtr->fullName); fprintf(stderr,"\tsetting currentFramePtr in %p to %p in initProcNS\n", RUNTIME_STATE(interp)->cs.top->currentFramePtr, varFramePtr); XOTclCallStackDump(interp); #endif if (RUNTIME_STATE(interp)->cs.top->currentFramePtr == NULL) { RUNTIME_STATE(interp)->cs.top->currentFramePtr = varFramePtr; } /* else { fprintf(stderr,"not overwriting currentFramePtr in %p from %p to %p\n", RUNTIME_STATE(interp)->cs.top, RUNTIME_STATE(interp)->cs.top->currentFramePtr, varFramePtr); } */ #if !defined(NAMESPACEINSTPROCS) if (varFramePtr) { varFramePtr->nsPtr = GetCallerVarFrame(interp, varFramePtr); } #endif return TCL_OK; } #endif /* * Interpretation of Non-Positional Args */ int isNonposArg(Tcl_Interp *interp, char * argStr, int nonposArgsDefc, Tcl_Obj **nonposArgsDefv, Tcl_Obj **var, char **type) { int npac; Tcl_Obj **npav; if (argStr[0] == '-') { int i; for (i=0; i < nonposArgsDefc; i++) { if (Tcl_ListObjGetElements(interp, nonposArgsDefv[i], &npac, &npav) == TCL_OK && npac > 0) { char *varName = argStr+1; if (!strcmp(varName, ObjStr(npav[0]))) { *var = npav[0]; *type = ObjStr(npav[1]); return 1; } } } } return 0; } int XOTclCheckBooleanArgs(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int result, bool; Tcl_Obj *boolean; if (objc == 2) { /* the variable is not yet defined (set), so we cannot check whether it is boolean or not */ return TCL_OK; } else if (objc != 3) { return XOTclObjErrArgCnt(interp, NULL, "::xotcl::nonposArgs boolean name ?value?"); } boolean = Tcl_DuplicateObj(objv[2]); INCR_REF_COUNT(boolean); result = Tcl_GetBooleanFromObj(interp, boolean, &bool); DECR_REF_COUNT(boolean); /* result = TCL_OK; */ if (result != TCL_OK) return XOTclVarErrMsg(interp, "non-positional argument: '", ObjStr(objv[1]), "' with value '", ObjStr(objv[2]), "' is not of type boolean", (char *) NULL); return TCL_OK; } int XOTclCheckRequiredArgs(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if (objc != 2 && objc != 3) return XOTclObjErrArgCnt(interp, NULL, "::xotcl::nonposArgs required ?currentValue?"); if (objc != 3) return XOTclVarErrMsg(interp, "required arg: '", ObjStr(objv[1]), "' missing", (char *) NULL); return TCL_OK; } int XOTclInterpretNonpositionalArgsCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Obj **npav, **checkv, **checkArgv, **argsv, **nonposArgsDefv, *invocation[4], **ordinaryArgsDefv, **defaultValueObjv, *list, *checkObj, *ordinaryArg; int npac, checkc, checkArgc, argsc, nonposArgsDefc, ordinaryArgsDefc, defaultValueObjc, argsDefined = 0, ordinaryArgsCounter = 0, i, j, result, ic, endOfNonposArgsReached = 0; char *argStr; Var *varPtr; XOTclClass *selfClass = GetSelfClass(interp); char *methodName = (char *) GetSelfProc(interp); Tcl_HashTable *nonposArgsTable; XOTclNonposArgs *nonposArgs; XOTclObject *selfObj; int r1, r2, r3, r4; if (objc != 2) return XOTclObjErrArgCnt(interp, NULL, "::xotcl::interpretNonpositionalArgs "); if (selfClass) { nonposArgsTable = selfClass->nonposArgsTable; } else if ((selfObj = GetSelfObj(interp))) { nonposArgsTable = selfObj->nonposArgsTable; } else { return XOTclVarErrMsg(interp, "Non positional args: can't find self/self class", (char *) NULL); } nonposArgs = NonposArgsGet(nonposArgsTable, methodName); if (nonposArgs == 0) { return XOTclVarErrMsg(interp, "Non positional args: can't find hash entry for: ", methodName, (char *) NULL); } r1 = Tcl_ListObjGetElements(interp, nonposArgs->nonposArgs, &nonposArgsDefc, &nonposArgsDefv); r2 = Tcl_ListObjGetElements(interp, nonposArgs->ordinaryArgs, &ordinaryArgsDefc, &ordinaryArgsDefv); r3 = Tcl_ListObjGetElements(interp, objv[1], &argsc, &argsv); if (r1 != TCL_OK || r2 != TCL_OK || r3 != TCL_OK) { return XOTclVarErrMsg(interp, "Cannot split non positional args list: ", methodName, (char *) NULL); } /* setting variables to default values */ for (i=0; i < nonposArgsDefc; i++) { r1 = Tcl_ListObjGetElements(interp, nonposArgsDefv[i], &npac, &npav); if (r1 == TCL_OK) { if (npac == 3) { Tcl_SetVar2Ex(interp, ObjStr(npav[0]), NULL, npav[2], 0); /* for unknown reasons, we can't use Tcl_ObjSetVar2 here in case the variable is referenced via eval (sample murr6) */ /* Tcl_ObjSetVar2(interp, npav[0], NULL, npav[2], 0); */ } else if (npac == 2 && !strcmp(ObjStr(npav[1]), "switch")) { Tcl_SetVar2Ex(interp, ObjStr(npav[0]), NULL, Tcl_NewBooleanObj(0), 0); } } } if (ordinaryArgsDefc > 0) { char *lastDefArg = ObjStr(ordinaryArgsDefv[ordinaryArgsDefc-1]); if (isArgsString(lastDefArg)) { argsDefined = 1; } } /* setting specified variables */ for (i=0; i < argsc; i++) { if (!endOfNonposArgsReached) { char *type; Tcl_Obj *var; argStr = ObjStr(argsv[i]); if (isDoubleDashString(argStr)) { endOfNonposArgsReached = 1; i++; } if (isNonposArg(interp, argStr, nonposArgsDefc, nonposArgsDefv, &var,&type)) { if (*type == 's' && !strcmp(type, "switch")) { int bool; Tcl_Obj *boolObj = Tcl_ObjGetVar2(interp, var, 0, 0); if (Tcl_GetBooleanFromObj(interp, boolObj, &bool) != TCL_OK) { return XOTclVarErrMsg(interp, "Non positional arg '", argStr, "': no boolean value", (char *) NULL); } Tcl_SetVar2Ex(interp, ObjStr(var), NULL, Tcl_NewBooleanObj(!bool), 0); /*Tcl_ObjSetVar2(interp, var, NULL, Tcl_NewBooleanObj(!bool), 0); */ } else { i++; if (i >= argsc) return XOTclVarErrMsg(interp, "Non positional arg '", argStr, "': value missing", (char *) NULL); Tcl_SetVar2Ex(interp, ObjStr(var), NULL, argsv[i], 0); /* Tcl_ObjSetVar2(interp, var, NULL, argsv[i], 0);*/ } } else { endOfNonposArgsReached = 1; } } if (endOfNonposArgsReached && i < argsc) { if (ordinaryArgsCounter >= ordinaryArgsDefc) { Tcl_Obj *tmp = NonposArgsFormat(interp, nonposArgs->nonposArgs); XOTclVarErrMsg(interp, "unknown argument '", ObjStr(argsv[i]), "' for method '", methodName, "': valid arguments ", ObjStr(tmp), " ", ObjStr(nonposArgs->ordinaryArgs), (char *) NULL); DECR_REF_COUNT(tmp); return TCL_ERROR; } /* this is the last arg and 'args' is defined */ if (argsDefined && ordinaryArgsCounter+1 == ordinaryArgsDefc) { list = Tcl_NewListObj(0, NULL); INCR_REF_COUNT(list); for(; i < argsc; i++) Tcl_ListObjAppendElement(interp, list, argsv[i]); Tcl_ObjSetVar2(interp, ordinaryArgsDefv[ordinaryArgsCounter], NULL, list, 0); DECR_REF_COUNT(list); } else { /* break down this argument, if it has a default value, use only the first part */ ordinaryArg = ordinaryArgsDefv[ordinaryArgsCounter]; r4 = Tcl_ListObjGetElements(interp, ordinaryArg, &defaultValueObjc, &defaultValueObjv); if (r4 == TCL_OK && defaultValueObjc == 2) { ordinaryArg = defaultValueObjv[0]; } Tcl_ObjSetVar2(interp, ordinaryArg, NULL, argsv[i], 0); } ordinaryArgsCounter++; } } /*fprintf(stderr,"... args defined %d argsc=%d oa %d oad %d\n", argsDefined, argsc, ordinaryArgsCounter, ordinaryArgsDefc); */ if ((!argsDefined && ordinaryArgsCounter != ordinaryArgsDefc) || (argsDefined && ordinaryArgsCounter < ordinaryArgsDefc-1)) { /* we do not have enough arguments, maybe there are default arguments for the missing args */ while (ordinaryArgsCounter != ordinaryArgsDefc) { if (argsDefined && ordinaryArgsCounter+1 == ordinaryArgsDefc) break; r4 = Tcl_ListObjGetElements(interp, ordinaryArgsDefv[ordinaryArgsCounter], &defaultValueObjc, &defaultValueObjv); /*fprintf(stderr,"... try to get default for '%s', rc %d, objc %d\n", ObjStr(ordinaryArgsDefv[ordinaryArgsCounter]), r4, defaultValueObjc);*/ if (r4 == TCL_OK && defaultValueObjc == 2) { Tcl_ObjSetVar2(interp, defaultValueObjv[0], NULL, defaultValueObjv[1], 0); } else { Tcl_Obj *tmp = NonposArgsFormat(interp, nonposArgs->nonposArgs); XOTclVarErrMsg(interp, "wrong # args for method '", methodName, "': valid arguments ", ObjStr(tmp), " ", ObjStr(nonposArgs->ordinaryArgs), (char *) NULL); DECR_REF_COUNT(tmp); return TCL_ERROR; } ordinaryArgsCounter++; } if (argsDefined) { Tcl_SetVar2(interp, "args", NULL, "", 0); } } else if (argsDefined && ordinaryArgsCounter == ordinaryArgsDefc-1) { Tcl_SetVar2(interp, "args", NULL, "", 0); } if (!argsDefined) { Tcl_UnsetVar2(interp, "args", NULL, 0); } /* checking vars */ for (i=0; i < nonposArgsDefc; i++) { r1 = Tcl_ListObjGetElements(interp, nonposArgsDefv[i], &npac, &npav); if (r1 == TCL_OK && npac > 1 && *(ObjStr(npav[1])) != '\0') { r1 = Tcl_ListObjGetElements(interp, npav[1], &checkc, &checkv); if (r1 == TCL_OK) { checkObj = XOTclGlobalObjects[XOTE_NON_POS_ARGS_OBJ]; for (j=0; j < checkc; j++) { r1 = Tcl_ListObjGetElements(interp, checkv[j], &checkArgc, &checkArgv); if (r1 == TCL_OK && checkArgc > 1) { if (isCheckObjString((ObjStr(checkArgv[0]))) && checkArgc == 2) { checkObj = checkArgv[1]; continue; } } invocation[0] = checkObj; invocation[1] = checkv[j]; varPtr = TclVarTraceExists(interp, ObjStr(npav[0])); invocation[2] = npav[0]; ic = 3; if (varPtr && !TclIsVarUndefined(varPtr)) { invocation[3] = Tcl_ObjGetVar2(interp, npav[0], 0, 0); ic = 4; } result = Tcl_EvalObjv(interp, ic, invocation, 0); /* objPtr = Tcl_ConcatObj(ic, invocation); fprintf(stderr,"eval on <%s>\n", ObjStr(objPtr)); result = Tcl_EvalObjEx(interp, objPtr, TCL_EVAL_DIRECT); */ if (result != TCL_OK) { return result; } } } } } return TCL_OK; } /* create a slave interp that calls XOTcl Init */ static int XOTcl_InterpObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Interp *slave; char *subCmd; ALLOC_ON_STACK(Tcl_Obj*, objc, ov); memcpy(ov, objv, sizeof(Tcl_Obj *)*objc); if (objc < 1) { XOTclObjErrArgCnt(interp, NULL, "::xotcl::interp name ?args?"); goto interp_error; } ov[0] = XOTclGlobalObjects[XOTE_INTERP]; if (Tcl_EvalObjv(interp, objc, ov, TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) != TCL_OK) { goto interp_error; } subCmd = ObjStr(ov[1]); if (isCreateString(subCmd)) { slave = Tcl_GetSlave(interp, ObjStr(ov[2])); if (!slave) { XOTclVarErrMsg(interp, "Creation of slave interpreter failed", (char *) NULL); goto interp_error; } if (Xotcl_Init(slave) == TCL_ERROR) { goto interp_error; } #ifdef XOTCL_MEM_COUNT xotclMemCountInterpCounter++; #endif } FREE_ON_STACK(Tcl_Obj *, ov); return TCL_OK; interp_error: FREE_ON_STACK(Tcl_Obj *, ov); return TCL_ERROR; } extern Tcl_Obj* XOTclOGetInstVar2(XOTcl_Object *obj, Tcl_Interp *interp, Tcl_Obj *name1, Tcl_Obj *name2, int flgs) { Tcl_Obj *result; XOTcl_FrameDecls; XOTcl_PushFrame(interp, (XOTclObject*)obj); if (((XOTclObject*)obj)->nsPtr) flgs |= TCL_NAMESPACE_ONLY; result = Tcl_ObjGetVar2(interp, name1, name2, flgs); XOTcl_PopFrame(interp, (XOTclObject*)obj); return result; } #if !defined(NDEBUG) static void checkAllInstances(Tcl_Interp *interp, XOTclClass *cl, int lvl) { Tcl_HashSearch search; Tcl_HashEntry *hPtr; if (cl && cl->object.refCount>0) { /*fprintf(stderr,"checkallinstances %d cl=%p '%s'\n", lvl, cl, ObjStr(cl->object.cmdName));*/ for (hPtr = Tcl_FirstHashEntry(&cl->instances, &search); hPtr; hPtr = Tcl_NextHashEntry(&search)) { XOTclObject *inst = (XOTclObject*) Tcl_GetHashKey(&cl->instances, hPtr); assert(inst); assert(inst->refCount>0); assert(inst->cmdName->refCount>0); if (XOTclObjectIsClass(inst) && (XOTclClass*)inst != RUNTIME_STATE(interp)->theClass) { checkAllInstances(interp, (XOTclClass*) inst, lvl+1); } } } } #endif #ifdef DO_FULL_CLEANUP /* delete global variables and procs */ static void deleteProcsAndVars(Tcl_Interp *interp) { Tcl_Namespace *ns = Tcl_GetGlobalNamespace(interp); Tcl_HashTable *varTable = ns ? Tcl_Namespace_varTable(ns) : NULL; Tcl_HashTable *cmdTable = ns ? Tcl_Namespace_cmdTable(ns) : NULL; Tcl_HashSearch search; Var *varPtr; Tcl_Command cmd; register Tcl_HashEntry *entryPtr; char *varName; for (entryPtr = Tcl_FirstHashEntry(varTable, &search); entryPtr; entryPtr = Tcl_NextHashEntry(&search)) { Tcl_Obj *nameObj; getVarAndNameFromHash(entryPtr, &varPtr, &nameObj); if (!TclIsVarUndefined(varPtr) || TclIsVarNamespaceVar(varPtr)) { /* fprintf(stderr, "unsetting var %s\n", ObjStr(nameObj));*/ Tcl_UnsetVar2(interp, ObjStr(nameObj), (char *)NULL, TCL_GLOBAL_ONLY); } } for (entryPtr = Tcl_FirstHashEntry(cmdTable, &search); entryPtr; entryPtr = Tcl_NextHashEntry(&search)) { cmd = (Tcl_Command)Tcl_GetHashValue(entryPtr); if (Tcl_Command_objProc(cmd) == RUNTIME_STATE(interp)->objInterpProc) { char *key = Tcl_GetHashKey(cmdTable, entryPtr); /*fprintf(stderr, "cmdname = %s cmd %p proc %p objProc %p %d\n", key, cmd, Tcl_Command_proc(cmd), Tcl_Command_objProc(cmd), Tcl_Command_proc(cmd)==RUNTIME_STATE(interp)->objInterpProc);*/ Tcl_DeleteCommandFromToken(interp, cmd); } } } #endif #ifdef DO_CLEANUP static int ClassHasSubclasses(XOTclClass *cl) { return (cl->sub != NULL); } static int ClassHasInstances(XOTclClass *cl) { Tcl_HashSearch hSrch; return (Tcl_FirstHashEntry(&cl->instances, &hSrch) != NULL); } static int ObjectHasChildren(Tcl_Interp *interp, XOTclObject *obj) { Tcl_Namespace *ns = obj->nsPtr; int result = 0; if (ns) { Tcl_HashEntry *hPtr; Tcl_HashSearch hSrch; Tcl_HashTable *cmdTable = Tcl_Namespace_cmdTable(ns); XOTcl_FrameDecls; XOTcl_PushFrame(interp, obj); for (hPtr = Tcl_FirstHashEntry(cmdTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(cmdTable, hPtr); if (XOTclpGetObject(interp, key)) { /*fprintf(stderr,"child = %s\n", key);*/ result = 1; break; } } XOTcl_PopFrame(interp, obj); } return result; } static void freeAllXOTclObjectsAndClasses(Tcl_Interp *interp, Tcl_HashTable *commandNameTable) { Tcl_HashEntry *hPtr, *hPtr2; Tcl_HashSearch hSrch, hSrch2; XOTclObject *object; XOTclClass *thecls, *theobj, *cl; int deleted = 0; /* fprintf(stderr,"??? freeAllXOTclObjectsAndClasses in %p\n", in); */ thecls = RUNTIME_STATE(interp)->theClass; theobj = RUNTIME_STATE(interp)->theObject; /***** PHYSICAL DESTROY *****/ RUNTIME_STATE(interp)->exitHandlerDestroyRound = XOTCL_EXITHANDLER_ON_PHYSICAL_DESTROY; /* * First delete all child commands of all objects, which are not * objects themselves. This will for example delete namespace * imprted commands and objects and will resolve potential loops in * the dependency graph. The result is a plain object/class tree. */ for (hPtr = Tcl_FirstHashEntry(commandNameTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(commandNameTable, hPtr); object = XOTclpGetObject(interp, key); if (object && object->nsPtr) { for (hPtr2 = Tcl_FirstHashEntry(Tcl_Namespace_cmdTable(object->nsPtr), &hSrch2); hPtr2; hPtr2 = Tcl_NextHashEntry(&hSrch2)) { Tcl_Command cmd = Tcl_GetHashValue(hPtr2); if (cmd && Tcl_Command_objProc(cmd) != XOTclObjDispatch) { Tcl_DeleteCommandFromToken(interp, cmd); deleted ++; } } } } /*fprintf(stderr, "deleted %d cmds\n", deleted);*/ while (1) { deleted = 0; for (hPtr = Tcl_FirstHashEntry(commandNameTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(commandNameTable, hPtr); object = XOTclpGetObject(interp, key); if (object && !XOTclObjectIsClass(object) && !ObjectHasChildren(interp, object)) { /* fprintf(stderr," ... delete object %s %p, class=%s\n", key, object, ObjStr(object->cl->object.cmdName));*/ freeUnsetTraceVariable(interp, object); Tcl_DeleteCommandFromToken(interp, object->id); Tcl_DeleteHashEntry(hPtr); deleted++; } } /* fprintf(stderr, "deleted %d Objects\n", deleted);*/ if (deleted > 0) { continue; } for (hPtr = Tcl_FirstHashEntry(commandNameTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(commandNameTable, hPtr); cl = XOTclpGetClass(interp, key); /* fprintf(stderr,"cl key = %s %p\n", key, cl); */ if (cl && !ObjectHasChildren(interp, (XOTclObject*)cl) && !ClassHasInstances(cl) && !ClassHasSubclasses(cl) && cl != RUNTIME_STATE(interp)->theClass && cl != RUNTIME_STATE(interp)->theObject ) { /* fprintf(stderr," ... delete class %s %p\n", key, cl); */ freeUnsetTraceVariable(interp, &cl->object); Tcl_DeleteCommandFromToken(interp, cl->object.id); Tcl_DeleteHashEntry(hPtr); deleted++; } } /* fprintf(stderr, "deleted %d Classes\n", deleted);*/ if (deleted == 0) { break; } } #ifdef DO_FULL_CLEANUP deleteProcsAndVars(interp); #endif RUNTIME_STATE(interp)->callDestroy = 0; RemoveSuper(thecls, theobj); RemoveInstance((XOTclObject*)thecls, thecls); RemoveInstance((XOTclObject*)theobj, thecls); Tcl_DeleteCommandFromToken(interp, theobj->object.id); RUNTIME_STATE(interp)->theObject = NULL; Tcl_DeleteCommandFromToken(interp, thecls->object.id); RUNTIME_STATE(interp)->theClass = NULL; XOTcl_DeleteNamespace(interp, RUNTIME_STATE(interp)->fakeNS); XOTcl_DeleteNamespace(interp, RUNTIME_STATE(interp)->XOTclClassesNS); XOTcl_DeleteNamespace(interp, RUNTIME_STATE(interp)->XOTclNS); } #endif /* DO_CLEANUP */ /* * ::xotcl::finalize command */ static int XOTclFinalizeObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int result; Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr; Tcl_HashTable objTable, *commandNameTable = &objTable; /* fprintf(stderr,"+++ call EXIT handler\n"); */ #if defined(PROFILE) XOTclProfilePrintData(interp); #endif /* * evaluate user-defined exit handler */ result = callMethod((ClientData)RUNTIME_STATE(interp)->theObject, interp, XOTclGlobalObjects[XOTE_EXIT_HANDLER], 2, 0, 0); if (result != TCL_OK) { fprintf(stderr,"User defined exit handler contains errors!\n" "Error in line %d: %s\nExecution interrupted.\n", Tcl_GetErrorLine(interp), ObjStr(Tcl_GetObjResult(interp))); } /* deleting in two rounds: * (a) SOFT DESTROY: call all user-defined destroys * (b) PHYSICAL DESTROY: delete the commands, user-defined * destroys are not executed anymore * * this is to prevent user-defined destroys from overriding physical * destroy during exit handler, but still ensure that all * user-defined destroys are called. */ Tcl_InitHashTable(commandNameTable, TCL_STRING_KEYS); MEM_COUNT_ALLOC("Tcl_InitHashTable", commandNameTable); getAllInstances(interp, commandNameTable, RUNTIME_STATE(interp)->theObject); /***** SOFT DESTROY *****/ RUNTIME_STATE(interp)->exitHandlerDestroyRound = XOTCL_EXITHANDLER_ON_SOFT_DESTROY; for (hPtr = Tcl_FirstHashEntry(commandNameTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(commandNameTable, hPtr); XOTclObject *obj = XOTclpGetObject(interp, key); /* fprintf(stderr,"key = %s %p %d\n", key, obj, obj && !XOTclObjectIsClass(obj)); */ if (obj && !XOTclObjectIsClass(obj) && !(obj->flags & XOTCL_DESTROY_CALLED)) { callDestroyMethod((ClientData)obj, interp, obj, 0); } } for (hPtr = Tcl_FirstHashEntry(commandNameTable, &hSrch); hPtr; hPtr = Tcl_NextHashEntry(&hSrch)) { char *key = Tcl_GetHashKey(commandNameTable, hPtr); XOTclClass *cl = XOTclpGetClass(interp, key); if (cl && !(cl->object.flags & XOTCL_DESTROY_CALLED)) { callDestroyMethod((ClientData)cl, interp, (XOTclObject *)cl, 0); } } #ifdef DO_CLEANUP freeAllXOTclObjectsAndClasses(interp, commandNameTable); #endif MEM_COUNT_FREE("Tcl_InitHashTable", commandNameTable); Tcl_DeleteHashTable(commandNameTable); return TCL_OK; } /* * Exit Handler */ static void ExitHandler(ClientData cd) { Tcl_Interp *interp = (Tcl_Interp *) cd; int i, flags; XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; /* * Don't use exit handler, if the interpreted is destroyed already * Call to exit handler comes after freeing namespaces, commands, etc. * e.g. TK calls Tcl_DeleteInterp directly, if Window is killed */ /* * Ahem ... * * Since we *must* be sure that our destroy methods will run * we must *cheat* (I mean CHEAT) here: we flip the interp * flag, saying, "hey boy, you're not deleted any more". * After our handlers are done, we restore the old state... * All this is needed so we can do an eval in the interp which * is potentially marked for delete when we start working here. * * I know, I know, this is not really elegant. But... I'd need a * standard way of invoking some code at interpreter delete time * but JUST BEFORE the actual deletion process starts. Sadly, * there is no such hook in Tcl as of Tcl8.3.2, that I know of. * * So, for the rest of procedure, assume the interp is alive ! */ flags = Tcl_Interp_flags(interp); Tcl_Interp_flags(interp) &= ~DELETED; if (RUNTIME_STATE(interp)->exitHandlerDestroyRound == XOTCL_EXITHANDLER_OFF) { XOTclFinalizeObjCmd(NULL, interp, 0, NULL); } /* * Pop any callstack entry that is still alive (e.g. * if "exit" is called and we were jumping out of the * callframe */ while (cs->top > cs->content) CallStackPop(interp); while (1) { Tcl_CallFrame *f = Tcl_Interp_framePtr(interp); if (!f) break; if (Tcl_CallFrame_level(f) == 0) break; Tcl_PopCallFrame(interp); } /* must be before freeing of XOTclGlobalObjects */ XOTclShadowTclCommands(interp, SHADOW_UNLOAD); /* free global objects */ for (i = 0; i < nr_elements(XOTclGlobalStrings); i++) { DECR_REF_COUNT(XOTclGlobalObjects[i]); } XOTclStringIncrFree(&RUNTIME_STATE(interp)->iss); #if defined(TCL_MEM_DEBUG) TclDumpMemoryInfo (stderr); Tcl_DumpActiveMemory ("./xotclActiveMem"); /* Tcl_GlobalEval(interp, "puts {checkmem to checkmemFile}; checkmem checkmemFile"); */ #endif MEM_COUNT_DUMP(); FREE(Tcl_Obj**, XOTclGlobalObjects); FREE(XOTclRuntimeState, RUNTIME_STATE(interp)); Tcl_Interp_flags(interp) = flags; Tcl_Release((ClientData) interp); } #if defined(TCL_THREADS) /* * Gets activated at thread-exit */ static void XOTcl_ThreadExitProc(ClientData cd) { /*fprintf(stderr,"+++ XOTcl_ThreadExitProc\n");*/ #if !defined(PRE83) void XOTcl_ExitProc(ClientData cd); Tcl_DeleteExitHandler(XOTcl_ExitProc, cd); #endif ExitHandler(cd); } #endif /* * Gets activated at application-exit */ void XOTcl_ExitProc(ClientData cd) { /*fprintf(stderr,"+++ XOTcl_ExitProc\n");*/ #if !defined(PRE83) && defined(TCL_THREADS) Tcl_DeleteThreadExitHandler(XOTcl_ThreadExitProc, cd); #endif ExitHandler(cd); } /* * Registers thread/appl exit handlers. */ static void RegisterExitHandlers(ClientData cd) { Tcl_Preserve(cd); #if !defined(PRE83) && defined(TCL_THREADS) Tcl_CreateThreadExitHandler(XOTcl_ThreadExitProc, cd); #endif Tcl_CreateExitHandler(XOTcl_ExitProc, cd); } /* * Tcl extension initialization routine */ extern int Xotcl_Init(Tcl_Interp *interp) { XOTclClass *theobj = NULL; XOTclClass *thecls = NULL; XOTclClass *paramCl = NULL; XOTclClass *nonposArgsCl = NULL; ClientData runtimeState; int result, i; #ifdef XOTCL_BYTECODE XOTclCompEnv *instructions = XOTclGetCompEnv(); #endif #ifndef PRE81 # ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { return TCL_ERROR; } # endif #endif #if defined(TCL_MEM_DEBUG) TclDumpMemoryInfo(stderr); #endif MEM_COUNT_INIT(); /* fprintf(stderr, "SIZES: obj=%d, tcl_obj=%d, DString=%d, class=%d, namespace=%d, command=%d, HashTable=%d\n", sizeof(XOTclObject), sizeof(Tcl_Obj), sizeof(Tcl_DString), sizeof(XOTclClass), sizeof(Namespace), sizeof(Command), sizeof(Tcl_HashTable)); */ #if FORWARD_COMPATIBLE { int major, minor, patchlvl, type; Tcl_GetVersion(&major, &minor, &patchlvl, &type); if ((major == 8) && (minor < 5)) { /* * loading a version of xotcl compiled for 8.4 version * into a 8.4 Tcl */ /* fprintf(stderr, "loading a version of xotcl compiled for 8.4 version into a 8.4 Tcl\n"); */ forwardCompatibleMode = 0; lookupVarFromTable = LookupVarFromTable84; tclVarHashCreateVar = VarHashCreateVar84; tclInitVarHashTable = InitVarHashTable84; tclCleanupVar = TclCleanupVar84; varRefCountOffset = TclOffset(Var, refCount); varHashTableSize = sizeof(Tcl_HashTable); } else { /* * loading a version of xotcl compiled for 8.4 version * into a 8.5 Tcl */ /* fprintf(stderr, "loading a version of xotcl compiled for 8.4 version into a 8.5 Tcl\n"); */ forwardCompatibleMode = 1; lookupVarFromTable = LookupVarFromTable85; tclVarHashCreateVar = VarHashCreateVar85; tclInitVarHashTable = (Tcl_InitVarHashTableFunction*)*((&tclIntStubsPtr->reserved0)+235); tclCleanupVar = (Tcl_CleanupVarFunction*)*((&tclIntStubsPtr->reserved0)+176); varRefCountOffset = TclOffset(VarInHash, refCount); varHashTableSize = sizeof(TclVarHashTable85); } } #endif /* * Runtime State stored in the client data of the Interp's global * Namespace in order to avoid global state information */ runtimeState = (ClientData) NEW(XOTclRuntimeState); #if USE_ASSOC_DATA Tcl_SetAssocData(interp, "XOTclRuntimeState", NULL, runtimeState); #else Tcl_Interp_globalNsPtr(interp)->clientData = runtimeState; #endif /* CallStack initialization */ memset(RUNTIME_STATE(interp), 0, sizeof(XOTclRuntimeState)); memset(RUNTIME_STATE(interp)->cs.content, 0, sizeof(XOTclCallStackContent)); RUNTIME_STATE(interp)->cs.top = RUNTIME_STATE(interp)->cs.content; RUNTIME_STATE(interp)->doFilters = 1; RUNTIME_STATE(interp)->callDestroy = 1; /* create xotcl namespace */ RUNTIME_STATE(interp)->XOTclNS = Tcl_CreateNamespace(interp, "::xotcl", (ClientData)NULL, (Tcl_NamespaceDeleteProc*)NULL); MEM_COUNT_ALLOC("TclNamespace", RUNTIME_STATE(interp)->XOTclNS); /* * init an empty, faked proc structure in the RUNTIME state */ RUNTIME_STATE(interp)->fakeProc.iPtr = (Interp *)interp; RUNTIME_STATE(interp)->fakeProc.refCount = 1; RUNTIME_STATE(interp)->fakeProc.cmdPtr = NULL; RUNTIME_STATE(interp)->fakeProc.bodyPtr = NULL; RUNTIME_STATE(interp)->fakeProc.numArgs = 0; RUNTIME_STATE(interp)->fakeProc.numCompiledLocals = 0; RUNTIME_STATE(interp)->fakeProc.firstLocalPtr = NULL; RUNTIME_STATE(interp)->fakeProc.lastLocalPtr = NULL; RUNTIME_STATE(interp)->fakeNS = Tcl_CreateNamespace(interp, "::xotcl::fakeNS", (ClientData)NULL, (Tcl_NamespaceDeleteProc*)NULL); MEM_COUNT_ALLOC("TclNamespace", RUNTIME_STATE(interp)->fakeNS); /* XOTclClasses in separate Namespace / Objects */ RUNTIME_STATE(interp)->XOTclClassesNS = Tcl_CreateNamespace(interp, "::xotcl::classes", (ClientData)NULL, (Tcl_NamespaceDeleteProc*)NULL); MEM_COUNT_ALLOC("TclNamespace", RUNTIME_STATE(interp)->XOTclClassesNS); /* cache interpreters proc interpretation functions */ RUNTIME_STATE(interp)->objInterpProc = TclGetObjInterpProc(); #if USE_INTERP_PROC RUNTIME_STATE(interp)->interpProc = TclGetInterpProc(); #endif RUNTIME_STATE(interp)->exitHandlerDestroyRound = XOTCL_EXITHANDLER_OFF; RegisterObjTypes(); RegisterExitHandlers((ClientData)interp); XOTclStringIncrInit(&RUNTIME_STATE(interp)->iss); /* initialize global Tcl_Obj*/ XOTclGlobalObjects = NEW_ARRAY(Tcl_Obj*, nr_elements(XOTclGlobalStrings)); for (i = 0; i < nr_elements(XOTclGlobalStrings); i++) { XOTclGlobalObjects[i] = Tcl_NewStringObj(XOTclGlobalStrings[i],-1); INCR_REF_COUNT(XOTclGlobalObjects[i]); } /* create Object and Class, and store them in the RUNTIME STATE */ theobj = PrimitiveCCreate(interp, "::xotcl::Object", 0); RUNTIME_STATE(interp)->theObject = theobj; if (!theobj) Tcl_Panic("Cannot create ::xotcl::Object", NULL); thecls = PrimitiveCCreate(interp, "::xotcl::Class", 0); RUNTIME_STATE(interp)->theClass = thecls; if (!thecls) Tcl_Panic("Cannot create ::xotcl::Class", NULL); Tcl_Export(interp, RUNTIME_STATE(interp)->XOTclNS, "Object", 0); Tcl_Export(interp, RUNTIME_STATE(interp)->XOTclNS, "Class", 0); /*Tcl_AddInterpResolvers(interp, "XOTcl", XOTclResolveCmd, 0, 0);*/ #if defined(PROFILE) XOTclProfileInit(interp); #endif /* test Object and Class creation */ if (!theobj || !thecls) { RUNTIME_STATE(interp)->callDestroy = 0; if (thecls) PrimitiveCDestroy((ClientData) thecls); if (theobj) PrimitiveCDestroy((ClientData) theobj); for (i = 0; i < nr_elements(XOTclGlobalStrings); i++) { DECR_REF_COUNT(XOTclGlobalObjects[i]); } FREE(Tcl_Obj**, XOTclGlobalObjects); FREE(XOTclRuntimeState, RUNTIME_STATE(interp)); return XOTclErrMsg(interp, "Object/Class failed", TCL_STATIC); } AddInstance((XOTclObject*)theobj, thecls); AddInstance((XOTclObject*)thecls, thecls); AddSuper(thecls, theobj); { typedef struct methodDefinition { char *methodName; Tcl_ObjCmdProc *proc; } methodDefinition; methodDefinition objInstcmds[] = { {"autoname", XOTclOAutonameMethod}, {"check", XOTclOCheckMethod}, {"cleanup", XOTclOCleanupMethod}, {"configure", XOTclOConfigureMethod}, {"destroy", XOTclODestroyMethod}, {"exists", XOTclOExistsMethod}, {"filterguard", XOTclOFilterGuardMethod}, {"filtersearch", XOTclOFilterSearchMethod}, {"info", XOTclOInfoMethod}, {"instvar", XOTclOInstVarMethod}, {"invar", XOTclOInvariantsMethod}, {"isclass", XOTclOIsClassMethod}, {"ismetaclass", XOTclOIsMetaClassMethod}, {"isobject", XOTclOIsObjectMethod}, {"istype", XOTclOIsTypeMethod}, {"ismixin", XOTclOIsMixinMethod}, #ifdef XOTCL_METADATA {"metadata", XOTclOMetaDataMethod}, #endif {"mixinguard", XOTclOMixinGuardMethod}, {"__next", XOTclONextMethod}, /* {"next", XOTclONextMethod2},*/ {"noinit", XOTclONoinitMethod}, {"parametercmd", XOTclCParameterCmdMethod}, { "proc", XOTclOProcMethod}, {"procsearch", XOTclOProcSearchMethod}, {"requireNamespace", XOTclORequireNamespaceMethod}, {"set", XOTclOSetMethod}, /***??**/ {"forward", XOTclOForwardMethod}, {"uplevel", XOTclOUplevelMethod}, {"upvar", XOTclOUpvarMethod}, {"volatile", XOTclOVolatileMethod}, {"vwait", XOTclOVwaitMethod} }; methodDefinition classInstcmds[] = { {"autoname", XOTclOAutonameMethod}, {"alloc", XOTclCAllocMethod}, {"create", XOTclCCreateMethod}, {"new", XOTclCNewMethod}, {"info", XOTclCInfoMethod}, {"instdestroy", XOTclCInstDestroyMethod}, {"instfilterguard", XOTclCInstFilterGuardMethod}, {"instinvar", XOTclCInvariantsMethod}, {"instmixinguard", XOTclCInstMixinGuardMethod}, {"instparametercmd", XOTclCInstParameterCmdMethod}, {"instproc", XOTclCInstProcMethod}, {"instforward", XOTclCInstForwardMethod}, {"parameter", XOTclCParameterMethod}, {"parameterclass", XOTclCParameterClassMethod}, {"recreate", XOTclCRecreateMethod}, {"unknown", XOTclCUnknownMethod} }; int namespacelength; Tcl_DString ds, *dsPtr = &ds; DSTRING_INIT(dsPtr); Tcl_DStringAppend(dsPtr,"::xotcl::Object::instcmd", -1); Tcl_CreateNamespace(interp, Tcl_DStringValue(dsPtr), 0, (Tcl_NamespaceDeleteProc*)NULL); Tcl_DStringAppend(dsPtr,"::", 2); namespacelength = Tcl_DStringLength(dsPtr); for (i = 0; i < nr_elements(objInstcmds); i++) { Tcl_DStringAppend(dsPtr, objInstcmds[i].methodName, -1); Tcl_CreateObjCommand(interp, Tcl_DStringValue(dsPtr), objInstcmds[i].proc, 0, 0); Tcl_DStringSetLength(dsPtr, namespacelength); } Tcl_DStringSetLength(dsPtr, 0); Tcl_DStringAppend(dsPtr,"::xotcl::Class::instcmd", -1); Tcl_CreateNamespace(interp, Tcl_DStringValue(dsPtr), 0, (Tcl_NamespaceDeleteProc*)NULL); Tcl_DStringAppend(dsPtr,"::", 2); namespacelength = Tcl_DStringLength(dsPtr); for (i = 0; i < nr_elements(classInstcmds); i++) { Tcl_DStringAppend(dsPtr, classInstcmds[i].methodName, -1); Tcl_CreateObjCommand(interp, Tcl_DStringValue(dsPtr), classInstcmds[i].proc, 0, 0); Tcl_DStringSetLength(dsPtr, namespacelength); } DSTRING_FREE(dsPtr); } /* * overwritten tcl objs */ result = XOTclShadowTclCommands(interp, SHADOW_LOAD); if (result != TCL_OK) return result; /* * new tcl cmds */ #ifdef XOTCL_BYTECODE instructions[INST_SELF_DISPATCH].cmdPtr = (Command *) #endif Tcl_CreateObjCommand(interp, "::xotcl::my", XOTclSelfDispatchCmd, 0, 0); #ifdef XOTCL_BYTECODE instructions[INST_NEXT].cmdPtr = (Command *) #endif Tcl_CreateObjCommand(interp, "::xotcl::next", XOTclNextObjCmd, 0, 0); #ifdef XOTCL_BYTECODE instructions[INST_SELF].cmdPtr = (Command *) #endif Tcl_CreateObjCommand(interp, "::xotcl::self", XOTclGetSelfObjCmd, 0, 0); /*Tcl_CreateObjCommand(interp, "::xotcl::K", XOTclKObjCmd, 0, 0);*/ Tcl_CreateObjCommand(interp, "::xotcl::alias", XOTclAliasCommand, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::configure", XOTclConfigureCommand, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::deprecated", XOTcl_DeprecatedCmd, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::finalize", XOTclFinalizeObjCmd, 0, 0); #if defined(PRE85) || defined(NRE) #ifdef XOTCL_BYTECODE instructions[INST_INITPROC].cmdPtr = (Command *) #endif Tcl_CreateObjCommand(interp, "::xotcl::initProcNS", XOTclInitProcNSCmd, 0, 0); #endif Tcl_CreateObjCommand(interp, "::xotcl::interpretNonpositionalArgs", XOTclInterpretNonpositionalArgsCmd, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::interp", XOTcl_InterpObjCmd, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::namespace_copyvars", XOTcl_NSCopyVars, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::namespace_copycmds", XOTcl_NSCopyCmds, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::__qualify", XOTclQualifyObjCmd, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::setinstvar", XOTclSetInstvarCommand, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::setrelation", XOTclSetRelationCommand, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::trace", XOTcl_TraceObjCmd, 0, 0); Tcl_Export(interp, RUNTIME_STATE(interp)->XOTclNS, "self", 0); Tcl_Export(interp, RUNTIME_STATE(interp)->XOTclNS, "next", 0); Tcl_Export(interp, RUNTIME_STATE(interp)->XOTclNS, "my", 0); #ifdef XOTCL_BYTECODE XOTclBytecodeInit(); #endif /* * Non-Positional Args Object */ nonposArgsCl = PrimitiveCCreate(interp, XOTclGlobalStrings[XOTE_NON_POS_ARGS_CL], thecls); XOTclAddIMethod(interp, (XOTcl_Class*) nonposArgsCl, "required", (Tcl_ObjCmdProc*) XOTclCheckRequiredArgs, 0, 0); XOTclAddIMethod(interp, (XOTcl_Class*) nonposArgsCl, "switch", (Tcl_ObjCmdProc*) XOTclCheckBooleanArgs, 0, 0); XOTclAddIMethod(interp, (XOTcl_Class*) nonposArgsCl, "boolean", (Tcl_ObjCmdProc*) XOTclCheckBooleanArgs, 0, 0); PrimitiveOCreate(interp, XOTclGlobalStrings[XOTE_NON_POS_ARGS_OBJ], nonposArgsCl); /* * Parameter Class */ { XOTclObject *paramObject; paramCl = PrimitiveCCreate(interp, XOTclGlobalStrings[XOTE_PARAM_CL], thecls); paramObject = ¶mCl->object; XOTclAddPMethod(interp, (XOTcl_Object*) paramObject, XOTclGlobalStrings[XOTE_SEARCH_DEFAULTS], (Tcl_ObjCmdProc*) ParameterSearchDefaultsMethod, 0, 0); } /* * set runtime version information in Tcl variable */ Tcl_SetVar(interp, "::xotcl::version", XOTCLVERSION, TCL_GLOBAL_ONLY); Tcl_SetVar(interp, "::xotcl::patchlevel", XOTCLPATCHLEVEL, TCL_GLOBAL_ONLY); /* * with some methods and library procs in tcl - they could go in a * xotcl.tcl file, but they're embedded here with Tcl_GlobalEval * to avoid the need to carry around a separate file at runtime. */ { #include "predefined.h" /* fprintf(stderr, "predefined=<<%s>>\n", cmd);*/ if (Tcl_GlobalEval(interp, cmd) != TCL_OK) { static char cmd[] = "puts stderr \"Error in predefined code\n\ $::errorInfo\""; Tcl_EvalEx(interp, cmd, -1, 0); return TCL_ERROR; } } #ifndef AOL_SERVER /* the AOL server uses a different package loading mechanism */ # ifdef COMPILE_XOTCL_STUBS Tcl_PkgProvideEx(interp, "XOTcl", PACKAGE_VERSION, (ClientData)&xotclStubs); # else Tcl_PkgProvide(interp, "XOTcl", PACKAGE_VERSION); # endif #endif #if !defined(TCL_THREADS) && !defined(PRE81) if ((Tcl_GetVar2(interp, "tcl_platform", "threaded", TCL_GLOBAL_ONLY) != NULL)) { /* a non threaded XOTcl version is loaded into a threaded environment */ fprintf(stderr, "\n A non threaded XOTCL version is loaded into threaded environment\n Please reconfigure XOTcl with --enable-threads!\n\n\n"); } #endif Tcl_ResetResult(interp); Tcl_SetIntObj(Tcl_GetObjResult(interp), 1); return TCL_OK; } extern int Xotcl_SafeInit(Tcl_Interp *interp) { /*** dummy for now **/ return Xotcl_Init(interp); } ./xotcl-1.6.8/generic/._xotcl.decls000644 000765 000024 00000000430 12161600406 017607 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotcl.decls000644 000765 000024 00000011454 12161600406 017402 0ustar00neumannstaff000000 000000 # xotcl.decls -- # # This file contains the declarations for all supported public # functions that are exported by the XOTcl library via the stubs table. # This file is used to generate the xotclDecls.h, xotclPlatDecls.h, # xotclStub.c, and xotclPlatStub.c files. # # # Copyright (c) 1998-1999 by Scriptics Corporation. # See the file "tcl-license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: $Id: xotcl.decls,v 1.4 2006/09/27 08:12:40 neumann Exp $ library xotcl interface xotcl hooks {xotclInt} # Declare each of the functions in the public Tcl interface. Note that # the an index should never be reused for a different function in order # to preserve backwards compatibility. declare 0 generic { int Xotcl_Init(Tcl_Interp *interp) } # 1 is reserved for safe init #declare 1 generic { # int Xotcl_SafeInit(Tcl_Interp *interp) #} declare 2 generic { struct XOTcl_Class* XOTclIsClass(Tcl_Interp* in, ClientData cd) } #declare 3 generic { # #} declare 4 generic { struct XOTcl_Object* XOTclGetObject(Tcl_Interp* in, char* name) } declare 5 generic { struct XOTcl_Class* XOTclGetClass(Tcl_Interp* in, char* name) } declare 6 generic { int XOTclCreateObject(Tcl_Interp* in, Tcl_Obj* name, struct XOTcl_Class* cl) } #declare 7 generic { # #} declare 8 generic { int XOTclCreateClass(Tcl_Interp* in, Tcl_Obj* name, struct XOTcl_Class* cl) } declare 9 generic { int XOTclDeleteObject(Tcl_Interp* in, struct XOTcl_Object* obj) } declare 10 generic { int XOTclDeleteClass(Tcl_Interp* in, struct XOTcl_Class* cl) } declare 11 generic { void XOTclAddPMethod(Tcl_Interp* in, struct XOTcl_Object* obj, CONST char* nm, Tcl_ObjCmdProc* proc, ClientData cd, Tcl_CmdDeleteProc* dp) } declare 12 generic { void XOTclAddIMethod(Tcl_Interp* in, struct XOTcl_Class* cl, CONST char* nm, Tcl_ObjCmdProc* proc, ClientData cd, Tcl_CmdDeleteProc* dp) } declare 13 generic { void XOTclRemovePMethod(Tcl_Interp* in,struct XOTcl_Object* obj, char* nm) } declare 14 generic { void XOTclRemoveIMethod(Tcl_Interp* in, struct XOTcl_Class* cl, char* nm) } declare 15 generic { Tcl_Obj* XOTclOSetInstVar(struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name, Tcl_Obj* value, int flgs) } declare 16 generic { Tcl_Obj* XOTclOGetInstVar(struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name, int flgs) } declare 17 generic { int XOTclInstVar(struct XOTcl_Object* obj, Tcl_Interp* in, char* name, char* destName) } #declare 18 generic { # #} declare 19 generic { Tcl_Obj* XOTclOSetInstVar2(struct XOTcl_Object* obj, Tcl_Interp* in,Tcl_Obj* name1,Tcl_Obj* name2, Tcl_Obj* value,int flgs) } declare 20 generic { Tcl_Obj* XOTclOGetInstVar2(struct XOTcl_Object* obj, Tcl_Interp* in,Tcl_Obj* name1,Tcl_Obj* name2, int flgs) } declare 21 generic { int XOTclUnsetInstVar2(struct XOTcl_Object* obj, Tcl_Interp* in, char* name1, char* name2, int flgs) } declare 22 generic { int XOTcl_TraceObjCmd(ClientData cd, Tcl_Interp *in, int objc, Tcl_Obj *CONST objv[]) } declare 23 generic { int XOTclErrMsg(Tcl_Interp* in, char* msg, Tcl_FreeProc* type) } declare 24 generic { int XOTclVarErrMsg(Tcl_Interp * in, ...) } declare 25 generic { int XOTclErrInProc (Tcl_Interp *in, Tcl_Obj* objName, Tcl_Obj* clName, char* procName) } declare 26 generic { int XOTclObjErrArgCnt(Tcl_Interp *in, Tcl_Obj *cmdname, char *arglist) } declare 27 generic { int XOTclErrBadVal_(Tcl_Interp *in, char *expected, char *value) } declare 28 generic { int XOTclObjErrType(Tcl_Interp *in, Tcl_Obj *nm, char* wt) } declare 29 generic { void XOTclStackDump (Tcl_Interp* in) } declare 30 generic { void XOTclCallStackDump (Tcl_Interp* in) } declare 31 generic { void XOTclDeprecatedMsg(char* oldCmd, char* newCmd) } declare 32 generic { void XOTclSetObjClientData(XOTcl_Object* obj, ClientData data) } declare 33 generic { ClientData XOTclGetObjClientData(XOTcl_Object* obj) } declare 34 generic { void XOTclSetClassClientData(XOTcl_Class* cl, ClientData data) } declare 35 generic { ClientData XOTclGetClassClientData(XOTcl_Class* cl) } declare 36 generic { void XOTclRequireObjNamespace(Tcl_Interp* in, XOTcl_Object* obj) } declare 37 generic { int XOTclErrBadVal(Tcl_Interp *in, char *context, char *expected, char *value) } declare 38 generic { int XOTclNextObjCmd(ClientData cd, Tcl_Interp *in, int objc, Tcl_Obj *CONST objv[]) } declare 39 generic { int XOTclCallMethodWithArgs(ClientData cd, Tcl_Interp *in, Tcl_Obj *method, Tcl_Obj *arg, int objc, Tcl_Obj *CONST objv[], int flags) } ./xotcl-1.6.8/generic/._xotcl.h000644 000765 000024 00000000430 12326777701 016764 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotcl.h000644 000765 000024 00000011276 12326777701 016561 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation, and that the name of * M.I.T. not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior * permission. M.I.T. makes no representations about the suitability * of this software for any purpose. It is provided "as is" without * express or implied warranty. * */ #ifndef _xotcl_h_ #define _xotcl_h_ #include "tcl.h" #undef TCL_STORAGE_CLASS #ifdef BUILD_xotcl # define TCL_STORAGE_CLASS DLLEXPORT #else # ifdef USE_XOTCL_STUBS # define TCL_STORAGE_CLASS # else # define TCL_STORAGE_CLASS DLLIMPORT # endif #endif /* use documented interface to link XOTcl state to an interpreter */ #define USE_ASSOC_DATA 1 /* new namespace support (post xotcl 1.2.0) */ #define NAMESPACEINSTPROCS 1 /* activate bytecode support #define XOTCL_BYTECODE */ /* activate/deacticate profiling information at the end of running the program #define PROFILE */ /* make self, proc and class in instproc and procs #define AUTOVARS */ #define KEEP_TCL_CMD_TYPE 1 /* activate/deacticate assert #define NDEBUG 1 */ #define NDEBUG 1 /* activate/deacticate memory tracing #define XOTCL_MEM_TRACE 1 #define XOTCL_MEM_COUNT 1 */ /*#define REFCOUNTED 1*/ /* #define XOTCLOBJ_TRACE 1 #define REFCOUNT_TRACE 1 */ /* turn tracing output on/off #define CALLSTACK_TRACE 1 #define DISPATCH_TRACE 1 #define NAMESPACE_TRACE 1 #define OBJDELETION_TRACE 1 #define STACK_TRACE 1 */ #ifdef XOTCL_MEM_COUNT # define DO_FULL_CLEANUP 1 #endif #ifdef AOL_SERVER # ifndef TCL_THREADS # define TCL_THREADS # endif #endif #ifdef TCL_THREADS # define DO_CLEANUP #endif #ifdef DO_FULL_CLEANUP # define DO_CLEANUP #endif /* * prevent old TCL-versions */ #if TCL_MAJOR_VERSION < 8 # error Tcl distribution is TOO OLD, we require at least tcl8.0 #endif #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<1 # define PRE81 #else # if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION==1 # define V81 # endif #endif #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<2 # define PRE82 #endif #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<3 # define PRE83 #endif #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<4 # define PRE84 #endif #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<5 # define PRE85 #endif #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<6 # define PRE86 #endif #if !defined(FORWARD_COMPATIBLE) # if defined(PRE85) # define FORWARD_COMPATIBLE 1 # else # define FORWARD_COMPATIBLE 0 # endif #endif #define XOTCL_NONLEAF_METHOD (ClientData)0x01 #if defined(PRE86) # define CONST86 # define Tcl_GetErrorLine(interp) (interp)->errorLine # define Tcl_NRCallObjProc(interp, proc, cd, objc, objv) \ (*(proc))((cd), (interp), (objc), (objv)) #else # define NRE #endif /* * A special definition used to allow this header file to be included * in resource files so that they can get obtain version information from * this file. Resource compilers don't like all the C stuff, like typedefs * and procedure declarations, that occur below. */ #ifndef RC_INVOKED /* #ifdef __cplusplus extern "C" { #endif */ /* * The structures XOTcl_Object and XOTcl_Class define mostly opaque * data structures for the internal use strucures XOTclObject and * XOTclClass (both defined in XOTclInt.h). Modification of elements * visible elements must be mirrored in both incarnations. */ typedef struct XOTcl_Object { Tcl_Obj *cmdName; } XOTcl_Object; typedef struct XOTcl_Class { struct XOTcl_Object object; } XOTcl_Class; /* * Include the public function declarations that are accessible via * the stubs table. */ #include "xotclDecls.h" /* * Xotcl_InitStubs is used by extensions that can be linked * against the xotcl stubs library. If we are not using stubs * then this reduces to package require. */ #ifdef USE_XOTCL_STUBS # ifdef __cplusplus extern "C" # endif CONST char * Xotcl_InitStubs _ANSI_ARGS_((Tcl_Interp *interp, CONST char *version, int exact)); #else # define Xotcl_InitStubs(interp, version, exact) \ Tcl_PkgRequire(interp, "XOTcl", version, exact) #endif #endif /* RC_INVOKED */ #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT #endif /* _xotcl_h_ */ ./xotcl-1.6.8/generic/._xotclAccessInt.h000644 000765 000024 00000000430 12161600406 020541 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclAccessInt.h000644 000765 000024 00000005506 12161600406 020335 0ustar00neumannstaff000000 000000 #define Tcl_Interp_numLevels(interp) ((Interp *)interp)->numLevels #define Tcl_Interp_framePtr(interp) ((Tcl_CallFrame *)((Interp *)interp)->framePtr) #define Tcl_Interp_varFramePtr(interp) (((Interp *)interp)->varFramePtr) #define Tcl_Interp_globalNsPtr(interp) ((Tcl_Namespace *)((Interp *)interp)->globalNsPtr) #define Tcl_Interp_flags(interp) ((Interp *)interp)->flags #if DISPATCH_TRACE #define Tcl_Interp_returnCode(interp) ((Interp *)interp)->returnCode #endif #define Tcl_Interp_threadId(interp) ((Interp *)interp)->threadId #define Tcl_CallFrame_callerPtr(cf) ((Tcl_CallFrame*)((CallFrame *)cf)->callerPtr) #define Tcl_CallFrame_procPtr(cf) ((CallFrame *)cf)->procPtr #define Tcl_CallFrame_varTablePtr(cf) ((CallFrame *)cf)->varTablePtr #define Tcl_CallFrame_level(cf) ((CallFrame *)cf)->level #define Tcl_CallFrame_isProcCallFrame(cf) ((CallFrame *)cf)->isProcCallFrame #define Tcl_CallFrame_compiledLocals(cf) ((CallFrame *)cf)->compiledLocals #define Tcl_CallFrame_callerVarPtr(cf) ((Tcl_CallFrame*)((CallFrame *)cf)->callerVarPtr) #define Tcl_CallFrame_objc(cf) ((CallFrame *)cf)->objc #define Tcl_CallFrame_objv(cf) ((CallFrame *)cf)->objv #define Tcl_Namespace_cmdTable(nsPtr) &((Namespace *)nsPtr)->cmdTable #define Tcl_Namespace_varTable(nsPtr) &((Namespace *)nsPtr)->varTable #define Tcl_Namespace_childTable(nsPtr) &((Namespace *)nsPtr)->childTable #define Tcl_Namespace_activationCount(nsPtr) ((Namespace *)nsPtr)->activationCount #define Tcl_Namespace_deleteProc(nsPtr) ((Namespace *)nsPtr)->deleteProc #define Tcl_Command_refCount(cmd) ((Command *)cmd)->refCount #define Tcl_Command_cmdEpoch(cmd) ((Command *)cmd)->cmdEpoch /* the following items could be obtained from Tcl_GetCommandInfoFromToken(cmd, infoPtr) */ #define Tcl_Command_nsPtr(cmd) ((Tcl_Namespace*)(((Command *)cmd)->nsPtr)) #define Tcl_Command_objProc(cmd) ((Command *)cmd)->objProc #define Tcl_Command_objClientData(cmd) ((Command *)cmd)->objClientData #define Tcl_Command_proc(cmd) ((Command *)cmd)->proc #define Tcl_Command_clientData(cmd) ((Command *)cmd)->clientData #define Tcl_Command_deleteProc(cmd) ((Command *)cmd)->deleteProc /* * Conversion from CmdPtr to Class / Object */ static XOTCLINLINE ClientData XOTclGetCDFromCmdPtr(Tcl_Command cmd) { assert(cmd); if (Tcl_Command_objProc(cmd) == XOTclObjDispatch && !Tcl_Command_cmdEpoch(cmd)) return Tcl_Command_objClientData(cmd); else return NULL; } static XOTCLINLINE XOTclClass* XOTclGetClassFromCmdPtr(Tcl_Command cmd) { ClientData cd = XOTclGetCDFromCmdPtr(cmd); if (cd) return XOTclObjectToClass(cd); else return 0; } static XOTCLINLINE XOTclObject* XOTclGetObjectFromCmdPtr(Tcl_Command cmd) { return (XOTclObject*) XOTclGetCDFromCmdPtr(cmd); } ./xotcl-1.6.8/generic/._xotclAppInit.c000644 000765 000024 00000000430 12161600406 020224 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclAppInit.c000644 000765 000024 00000007254 12161600406 020022 0ustar00neumannstaff000000 000000 /* * tclAppInit.c -- * * Provides a default version of the main program and Tcl_AppInit * procedure for Tcl applications (without Tk). * * Copyright (c) 1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tclAppInit.c 1.20 97/03/24 14:29:43 */ /* include tclInt.h for access to namespace API */ #include "tclInt.h" #include "xotcl.h" #if defined(VISUAL_CC) # include # include #endif #include #if TCL_MAJOR_VERSION < 7 #error Tcl distribution TOO OLD #endif /* * The following variable is a special hack that is needed in order for * Sun shared libraries to be used for Tcl. */ #ifdef NEED_MATHERR extern int matherr(); int *tclDummyMathPtr = (int *) matherr; #endif /* *---------------------------------------------------------------------- * * main -- * * This is the main program for the application. * * Results: * None: Tcl_Main never returns here, so this procedure never * returns either. * * Side effects: * Whatever the application does. * *---------------------------------------------------------------------- */ #if TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION < 4 extern int main(); int *tclDummyMainPtr = (int *) main; #else int main(argc, argv) int argc; /* Number of command-line arguments. */ char **argv; /* Values of command-line arguments. */ { #if defined(VISUAL_CC) setlocale(LC_ALL, "C"); #endif Tcl_Main(argc, argv, Tcl_AppInit); return 0; /* Needed only to prevent compiler warning. */ } #endif /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in interp->result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(interp) Tcl_Interp *interp; /* Interpreter for application. */ { if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* * Call the init procedures for included packages. Each call should * look like this: * * if (Mod_Init(interp) == TCL_ERROR) { * return TCL_ERROR; * } * * where "Mod" is the name of the module. if (Xotcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "XOTcl", Xotcl_Init, 0); */ if (Tcl_PkgRequire(interp, "XOTcl", XOTCLVERSION, 1) == NULL) { return TCL_ERROR; } /* * This is xotclsh, so import all xotcl commands by * default into the global namespace. */ if (Tcl_Import(interp, Tcl_GetGlobalNamespace(interp), "::xotcl::*", /* allowOverwrite */ 1) != TCL_OK) { return TCL_ERROR; } /* * Call Tcl_CreateCommand for application-specific commands, if * they weren't already created by the init procedures called above. */ /* * Specify a user-specific startup file to invoke if the application * is run interactively. Typically the startup file is "~/.apprc" * where "app" is the name of the application. If this line is deleted * then no user-specific startup file will be run under any conditions. */ Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY); return TCL_OK; } ./xotcl-1.6.8/generic/._xotclCompile.c000644 000765 000024 00000000430 12161600406 020250 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclCompile.c000644 000765 000024 00000007041 12161600406 020040 0ustar00neumannstaff000000 000000 #include "xotclInt.h" #ifdef XOTCL_BYTECODE #include static CompileProc initProcNsCompile, nextCompile, selfCompile, selfDispatchCompile; static InstructionDesc instructionTable[] = { {"initProc", 1, 0, {OPERAND_NONE}}, {"next", 1, 0, {OPERAND_NONE}}, {"self", 1, 0, {OPERAND_NONE}}, {"dispatch", 2, 1, {OPERAND_UINT1}}, }; static XOTclCompEnv instructions[] = { {0, 0, initProcNsCompile, XOTclInitProcNSCmd}, {0, 0, nextCompile, XOTclNextObjCmd}, {0, 0, selfCompile, XOTclGetSelfObjCmd}, {0, 0, selfDispatchCompile, /*XOTclSelfDispatchCmd*/XOTclDirectSelfDispatch}, 0 }; XOTclCompEnv * XOTclGetCompEnv() { return &instructions[0]; } static int initProcNsCompile(Tcl_Interp *interp, Tcl_Parse *parsePtr, CompileEnv *envPtr) { if (parsePtr->numWords != 1) { Tcl_ResetResult(interp); Tcl_AppendToObj(Tcl_GetObjResult(interp), "wrong # args: should be '::xotcl::initProcNS'", -1); envPtr->maxStackDepth = 0; return TCL_ERROR; } TclEmitOpcode(instructions[INST_INITPROC].bytecode, envPtr); envPtr->maxStackDepth = 0; return TCL_OK; } static int nextCompile(Tcl_Interp *interp, Tcl_Parse *parsePtr, CompileEnv *envPtr) { if (parsePtr->numWords != 1) return TCL_OUT_LINE_COMPILE; TclEmitOpcode(instructions[INST_NEXT].bytecode, envPtr); envPtr->maxStackDepth = 0; return TCL_OK; } static int selfCompile(Tcl_Interp *interp, Tcl_Parse *parsePtr, CompileEnv *envPtr) { if (parsePtr->numWords != 1) return TCL_OUT_LINE_COMPILE; TclEmitOpcode(instructions[INST_SELF].bytecode, envPtr); envPtr->maxStackDepth = 0; return TCL_OK; } static int selfDispatchCompile(Tcl_Interp *interp, Tcl_Parse *parsePtr, CompileEnv *envPtr) { Tcl_Token *tokenPtr; int code, wordIdx; /* fprintf(stderr, "****** selfDispatchCompile words=%d tokens=%d, avail=%d\n", parsePtr->numWords,parsePtr->numTokens,parsePtr->tokensAvailable); */ if (parsePtr->numWords > 255) return TCL_OUT_LINE_COMPILE; /*TclEmitOpcode(instructions[INST_SELF].bytecode, envPtr);*/ for (wordIdx=0, tokenPtr = parsePtr->tokenPtr + 0; wordIdx < parsePtr->numWords; wordIdx++, tokenPtr += (tokenPtr->numComponents + 1)) { /* fprintf(stderr," %d: %p token type=%d size=%d\n", wordIdx,tokenPtr,tokenPtr->type,tokenPtr->size ); */ if (tokenPtr->type == TCL_TOKEN_SIMPLE_WORD) { TclEmitPush(TclRegisterLiteral(envPtr, tokenPtr->start, tokenPtr->size, 0), envPtr); envPtr->maxStackDepth = 1; /* fprintf(stderr," %d: simple '%s' components=%d\n", wordIdx,tokenPtr->start, tokenPtr->numComponents); */ } else { /* fprintf(stderr," %d NOT simple '%s' components=%d\n", wordIdx,tokenPtr->start, tokenPtr->numComponents); */ code = TclCompileTokens(interp, tokenPtr+1, tokenPtr->numComponents, envPtr); if (code != TCL_OK) { return code; } } } /*fprintf(stderr, "maxdepth=%d, onStack=%d\n",envPtr->maxStackDepth,wordIdx); */ TclEmitInstInt1(instructions[INST_SELF_DISPATCH].bytecode, wordIdx, envPtr); envPtr->maxStackDepth = 0; return TCL_OK; } void XOTclBytecodeInit() { int i; for(i=0; iobjClientData))) { instructions[i].cmdPtr->compileProc = instructions[i].compileProc; } } /*tclTraceCompile = 2;*/ } #endif ./xotcl-1.6.8/generic/._xotclDecls.h000644 000765 000024 00000000430 12327000176 017721 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclDecls.h000644 000765 000024 00000031710 12327000176 017511 0ustar00neumannstaff000000 000000 /* * xotclDecls.h -- * * Declarations of functions in the platform independent public XOTcl API. * * Copyright (C) 1999-2007 Uwe Zdun * Copyright (C) 1999-2014 Gustaf Neumann * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #ifndef _XOTCLDECLS #define _XOTCLDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl * script. Any modifications to the function declarations below should be made * in the xotcl.decls script. */ /* !BEGIN!: Do not edit below this line. */ /* * Exported function declarations: */ /* 0 */ EXTERN int Xotcl_Init _ANSI_ARGS_((Tcl_Interp * interp)); /* Slot 1 is reserved */ /* 2 */ EXTERN struct XOTcl_Class* XOTclIsClass _ANSI_ARGS_((Tcl_Interp* in, ClientData cd)); /* Slot 3 is reserved */ /* 4 */ EXTERN struct XOTcl_Object* XOTclGetObject _ANSI_ARGS_((Tcl_Interp* in, char* name)); /* 5 */ EXTERN struct XOTcl_Class* XOTclGetClass _ANSI_ARGS_((Tcl_Interp* in, char* name)); /* 6 */ EXTERN int XOTclCreateObject _ANSI_ARGS_((Tcl_Interp* in, Tcl_Obj* name, struct XOTcl_Class* cl)); /* Slot 7 is reserved */ /* 8 */ EXTERN int XOTclCreateClass _ANSI_ARGS_((Tcl_Interp* in, Tcl_Obj* name, struct XOTcl_Class* cl)); /* 9 */ EXTERN int XOTclDeleteObject _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Object* obj)); /* 10 */ EXTERN int XOTclDeleteClass _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Class* cl)); /* 11 */ EXTERN void XOTclAddPMethod _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Object* obj, CONST char* nm, Tcl_ObjCmdProc* proc, ClientData cd, Tcl_CmdDeleteProc* dp)); /* 12 */ EXTERN void XOTclAddIMethod _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Class* cl, CONST char* nm, Tcl_ObjCmdProc* proc, ClientData cd, Tcl_CmdDeleteProc* dp)); /* 13 */ EXTERN void XOTclRemovePMethod _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Object* obj, char* nm)); /* 14 */ EXTERN void XOTclRemoveIMethod _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Class* cl, char* nm)); /* 15 */ EXTERN Tcl_Obj* XOTclOSetInstVar _ANSI_ARGS_(( struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name, Tcl_Obj* value, int flgs)); /* 16 */ EXTERN Tcl_Obj* XOTclOGetInstVar _ANSI_ARGS_(( struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name, int flgs)); /* 17 */ EXTERN int XOTclInstVar _ANSI_ARGS_((struct XOTcl_Object* obj, Tcl_Interp* in, char* name, char* destName)); /* Slot 18 is reserved */ /* 19 */ EXTERN Tcl_Obj* XOTclOSetInstVar2 _ANSI_ARGS_(( struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name1, Tcl_Obj* name2, Tcl_Obj* value, int flgs)); /* 20 */ EXTERN Tcl_Obj* XOTclOGetInstVar2 _ANSI_ARGS_(( struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name1, Tcl_Obj* name2, int flgs)); /* 21 */ EXTERN int XOTclUnsetInstVar2 _ANSI_ARGS_(( struct XOTcl_Object* obj, Tcl_Interp* in, char* name1, char* name2, int flgs)); /* 22 */ EXTERN int XOTcl_TraceObjCmd _ANSI_ARGS_((ClientData cd, Tcl_Interp * in, int objc, Tcl_Obj *CONST objv[])); /* 23 */ EXTERN int XOTclErrMsg _ANSI_ARGS_((Tcl_Interp* in, char* msg, Tcl_FreeProc* type)); /* 24 */ EXTERN int XOTclVarErrMsg _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,in)); /* 25 */ EXTERN int XOTclErrInProc _ANSI_ARGS_((Tcl_Interp * in, Tcl_Obj* objName, Tcl_Obj* clName, char* procName)); /* 26 */ EXTERN int XOTclObjErrArgCnt _ANSI_ARGS_((Tcl_Interp * in, Tcl_Obj * cmdname, char * arglist)); /* 27 */ EXTERN int XOTclErrBadVal_ _ANSI_ARGS_((Tcl_Interp * in, char * expected, char * value)); /* 28 */ EXTERN int XOTclObjErrType _ANSI_ARGS_((Tcl_Interp * in, Tcl_Obj * nm, char* wt)); /* 29 */ EXTERN void XOTclStackDump _ANSI_ARGS_((Tcl_Interp* in)); /* 30 */ EXTERN void XOTclCallStackDump _ANSI_ARGS_((Tcl_Interp* in)); /* 31 */ EXTERN void XOTclDeprecatedMsg _ANSI_ARGS_((char* oldCmd, char* newCmd)); /* 32 */ EXTERN void XOTclSetObjClientData _ANSI_ARGS_((XOTcl_Object* obj, ClientData data)); /* 33 */ EXTERN ClientData XOTclGetObjClientData _ANSI_ARGS_((XOTcl_Object* obj)); /* 34 */ EXTERN void XOTclSetClassClientData _ANSI_ARGS_((XOTcl_Class* cl, ClientData data)); /* 35 */ EXTERN ClientData XOTclGetClassClientData _ANSI_ARGS_((XOTcl_Class* cl)); /* 36 */ EXTERN void XOTclRequireObjNamespace _ANSI_ARGS_((Tcl_Interp* in, XOTcl_Object* obj)); /* 37 */ EXTERN int XOTclErrBadVal _ANSI_ARGS_((Tcl_Interp * in, char * context, char * expected, char * value)); /* 38 */ EXTERN int XOTclNextObjCmd _ANSI_ARGS_((ClientData cd, Tcl_Interp * in, int objc, Tcl_Obj *CONST objv[])); /* 39 */ EXTERN int XOTclCallMethodWithArgs _ANSI_ARGS_((ClientData cd, Tcl_Interp * in, Tcl_Obj * method, Tcl_Obj * arg, int objc, Tcl_Obj *CONST objv[], int flags)); typedef struct XotclStubHooks { struct XotclIntStubs *xotclIntStubs; } XotclStubHooks; typedef struct XotclStubs { int magic; struct XotclStubHooks *hooks; int (*xotcl_Init) _ANSI_ARGS_((Tcl_Interp * interp)); /* 0 */ void *reserved1; struct XOTcl_Class* (*xOTclIsClass) _ANSI_ARGS_((Tcl_Interp* in, ClientData cd)); /* 2 */ void *reserved3; struct XOTcl_Object* (*xOTclGetObject) _ANSI_ARGS_((Tcl_Interp* in, char* name)); /* 4 */ struct XOTcl_Class* (*xOTclGetClass) _ANSI_ARGS_((Tcl_Interp* in, char* name)); /* 5 */ int (*xOTclCreateObject) _ANSI_ARGS_((Tcl_Interp* in, Tcl_Obj* name, struct XOTcl_Class* cl)); /* 6 */ void *reserved7; int (*xOTclCreateClass) _ANSI_ARGS_((Tcl_Interp* in, Tcl_Obj* name, struct XOTcl_Class* cl)); /* 8 */ int (*xOTclDeleteObject) _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Object* obj)); /* 9 */ int (*xOTclDeleteClass) _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Class* cl)); /* 10 */ void (*xOTclAddPMethod) _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Object* obj, CONST char* nm, Tcl_ObjCmdProc* proc, ClientData cd, Tcl_CmdDeleteProc* dp)); /* 11 */ void (*xOTclAddIMethod) _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Class* cl, CONST char* nm, Tcl_ObjCmdProc* proc, ClientData cd, Tcl_CmdDeleteProc* dp)); /* 12 */ void (*xOTclRemovePMethod) _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Object* obj, char* nm)); /* 13 */ void (*xOTclRemoveIMethod) _ANSI_ARGS_((Tcl_Interp* in, struct XOTcl_Class* cl, char* nm)); /* 14 */ Tcl_Obj* (*xOTclOSetInstVar) _ANSI_ARGS_((struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name, Tcl_Obj* value, int flgs)); /* 15 */ Tcl_Obj* (*xOTclOGetInstVar) _ANSI_ARGS_((struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name, int flgs)); /* 16 */ int (*xOTclInstVar) _ANSI_ARGS_((struct XOTcl_Object* obj, Tcl_Interp* in, char* name, char* destName)); /* 17 */ void *reserved18; Tcl_Obj* (*xOTclOSetInstVar2) _ANSI_ARGS_((struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name1, Tcl_Obj* name2, Tcl_Obj* value, int flgs)); /* 19 */ Tcl_Obj* (*xOTclOGetInstVar2) _ANSI_ARGS_((struct XOTcl_Object* obj, Tcl_Interp* in, Tcl_Obj* name1, Tcl_Obj* name2, int flgs)); /* 20 */ int (*xOTclUnsetInstVar2) _ANSI_ARGS_((struct XOTcl_Object* obj, Tcl_Interp* in, char* name1, char* name2, int flgs)); /* 21 */ int (*xOTcl_TraceObjCmd) _ANSI_ARGS_((ClientData cd, Tcl_Interp * in, int objc, Tcl_Obj *CONST objv[])); /* 22 */ int (*xOTclErrMsg) _ANSI_ARGS_((Tcl_Interp* in, char* msg, Tcl_FreeProc* type)); /* 23 */ int (*xOTclVarErrMsg) _ANSI_ARGS_(TCL_VARARGS(Tcl_Interp *,in)); /* 24 */ int (*xOTclErrInProc) _ANSI_ARGS_((Tcl_Interp * in, Tcl_Obj* objName, Tcl_Obj* clName, char* procName)); /* 25 */ int (*xOTclObjErrArgCnt) _ANSI_ARGS_((Tcl_Interp * in, Tcl_Obj * cmdname, char * arglist)); /* 26 */ int (*xOTclErrBadVal_) _ANSI_ARGS_((Tcl_Interp * in, char * expected, char * value)); /* 27 */ int (*xOTclObjErrType) _ANSI_ARGS_((Tcl_Interp * in, Tcl_Obj * nm, char* wt)); /* 28 */ void (*xOTclStackDump) _ANSI_ARGS_((Tcl_Interp* in)); /* 29 */ void (*xOTclCallStackDump) _ANSI_ARGS_((Tcl_Interp* in)); /* 30 */ void (*xOTclDeprecatedMsg) _ANSI_ARGS_((char* oldCmd, char* newCmd)); /* 31 */ void (*xOTclSetObjClientData) _ANSI_ARGS_((XOTcl_Object* obj, ClientData data)); /* 32 */ ClientData (*xOTclGetObjClientData) _ANSI_ARGS_((XOTcl_Object* obj)); /* 33 */ void (*xOTclSetClassClientData) _ANSI_ARGS_((XOTcl_Class* cl, ClientData data)); /* 34 */ ClientData (*xOTclGetClassClientData) _ANSI_ARGS_((XOTcl_Class* cl)); /* 35 */ void (*xOTclRequireObjNamespace) _ANSI_ARGS_((Tcl_Interp* in, XOTcl_Object* obj)); /* 36 */ int (*xOTclErrBadVal) _ANSI_ARGS_((Tcl_Interp * in, char * context, char * expected, char * value)); /* 37 */ int (*xOTclNextObjCmd) _ANSI_ARGS_((ClientData cd, Tcl_Interp * in, int objc, Tcl_Obj *CONST objv[])); /* 38 */ int (*xOTclCallMethodWithArgs) _ANSI_ARGS_((ClientData cd, Tcl_Interp * in, Tcl_Obj * method, Tcl_Obj * arg, int objc, Tcl_Obj *CONST objv[], int flags)); /* 39 */ } XotclStubs; #ifdef __cplusplus extern "C" { #endif extern XotclStubs *xotclStubsPtr; #ifdef __cplusplus } #endif #if defined(USE_XOTCL_STUBS) && !defined(USE_XOTCL_STUB_PROCS) /* * Inline function declarations: */ #ifndef Xotcl_Init #define Xotcl_Init \ (xotclStubsPtr->xotcl_Init) /* 0 */ #endif /* Slot 1 is reserved */ #ifndef XOTclIsClass #define XOTclIsClass \ (xotclStubsPtr->xOTclIsClass) /* 2 */ #endif /* Slot 3 is reserved */ #ifndef XOTclGetObject #define XOTclGetObject \ (xotclStubsPtr->xOTclGetObject) /* 4 */ #endif #ifndef XOTclGetClass #define XOTclGetClass \ (xotclStubsPtr->xOTclGetClass) /* 5 */ #endif #ifndef XOTclCreateObject #define XOTclCreateObject \ (xotclStubsPtr->xOTclCreateObject) /* 6 */ #endif /* Slot 7 is reserved */ #ifndef XOTclCreateClass #define XOTclCreateClass \ (xotclStubsPtr->xOTclCreateClass) /* 8 */ #endif #ifndef XOTclDeleteObject #define XOTclDeleteObject \ (xotclStubsPtr->xOTclDeleteObject) /* 9 */ #endif #ifndef XOTclDeleteClass #define XOTclDeleteClass \ (xotclStubsPtr->xOTclDeleteClass) /* 10 */ #endif #ifndef XOTclAddPMethod #define XOTclAddPMethod \ (xotclStubsPtr->xOTclAddPMethod) /* 11 */ #endif #ifndef XOTclAddIMethod #define XOTclAddIMethod \ (xotclStubsPtr->xOTclAddIMethod) /* 12 */ #endif #ifndef XOTclRemovePMethod #define XOTclRemovePMethod \ (xotclStubsPtr->xOTclRemovePMethod) /* 13 */ #endif #ifndef XOTclRemoveIMethod #define XOTclRemoveIMethod \ (xotclStubsPtr->xOTclRemoveIMethod) /* 14 */ #endif #ifndef XOTclOSetInstVar #define XOTclOSetInstVar \ (xotclStubsPtr->xOTclOSetInstVar) /* 15 */ #endif #ifndef XOTclOGetInstVar #define XOTclOGetInstVar \ (xotclStubsPtr->xOTclOGetInstVar) /* 16 */ #endif #ifndef XOTclInstVar #define XOTclInstVar \ (xotclStubsPtr->xOTclInstVar) /* 17 */ #endif /* Slot 18 is reserved */ #ifndef XOTclOSetInstVar2 #define XOTclOSetInstVar2 \ (xotclStubsPtr->xOTclOSetInstVar2) /* 19 */ #endif #ifndef XOTclOGetInstVar2 #define XOTclOGetInstVar2 \ (xotclStubsPtr->xOTclOGetInstVar2) /* 20 */ #endif #ifndef XOTclUnsetInstVar2 #define XOTclUnsetInstVar2 \ (xotclStubsPtr->xOTclUnsetInstVar2) /* 21 */ #endif #ifndef XOTcl_TraceObjCmd #define XOTcl_TraceObjCmd \ (xotclStubsPtr->xOTcl_TraceObjCmd) /* 22 */ #endif #ifndef XOTclErrMsg #define XOTclErrMsg \ (xotclStubsPtr->xOTclErrMsg) /* 23 */ #endif #ifndef XOTclVarErrMsg #define XOTclVarErrMsg \ (xotclStubsPtr->xOTclVarErrMsg) /* 24 */ #endif #ifndef XOTclErrInProc #define XOTclErrInProc \ (xotclStubsPtr->xOTclErrInProc) /* 25 */ #endif #ifndef XOTclObjErrArgCnt #define XOTclObjErrArgCnt \ (xotclStubsPtr->xOTclObjErrArgCnt) /* 26 */ #endif #ifndef XOTclErrBadVal_ #define XOTclErrBadVal_ \ (xotclStubsPtr->xOTclErrBadVal_) /* 27 */ #endif #ifndef XOTclObjErrType #define XOTclObjErrType \ (xotclStubsPtr->xOTclObjErrType) /* 28 */ #endif #ifndef XOTclStackDump #define XOTclStackDump \ (xotclStubsPtr->xOTclStackDump) /* 29 */ #endif #ifndef XOTclCallStackDump #define XOTclCallStackDump \ (xotclStubsPtr->xOTclCallStackDump) /* 30 */ #endif #ifndef XOTclDeprecatedMsg #define XOTclDeprecatedMsg \ (xotclStubsPtr->xOTclDeprecatedMsg) /* 31 */ #endif #ifndef XOTclSetObjClientData #define XOTclSetObjClientData \ (xotclStubsPtr->xOTclSetObjClientData) /* 32 */ #endif #ifndef XOTclGetObjClientData #define XOTclGetObjClientData \ (xotclStubsPtr->xOTclGetObjClientData) /* 33 */ #endif #ifndef XOTclSetClassClientData #define XOTclSetClassClientData \ (xotclStubsPtr->xOTclSetClassClientData) /* 34 */ #endif #ifndef XOTclGetClassClientData #define XOTclGetClassClientData \ (xotclStubsPtr->xOTclGetClassClientData) /* 35 */ #endif #ifndef XOTclRequireObjNamespace #define XOTclRequireObjNamespace \ (xotclStubsPtr->xOTclRequireObjNamespace) /* 36 */ #endif #ifndef XOTclErrBadVal #define XOTclErrBadVal \ (xotclStubsPtr->xOTclErrBadVal) /* 37 */ #endif #ifndef XOTclNextObjCmd #define XOTclNextObjCmd \ (xotclStubsPtr->xOTclNextObjCmd) /* 38 */ #endif #ifndef XOTclCallMethodWithArgs #define XOTclCallMethodWithArgs \ (xotclStubsPtr->xOTclCallMethodWithArgs) /* 39 */ #endif #endif /* defined(USE_XOTCL_STUBS) && !defined(USE_XOTCL_STUB_PROCS) */ /* !END!: Do not edit above this line. */ #endif /* _XOTCLDECLS */ ./xotcl-1.6.8/generic/._xotclError.c000644 000765 000024 00000000430 12326777674 020002 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclError.c000644 000765 000024 00000005046 12326777674 017575 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * xotclError.c -- * * error return functions for XOTcl * */ #include "xotclInt.h" int XOTclErrMsg(Tcl_Interp *interp, char *msg, Tcl_FreeProc* type) { Tcl_SetResult(interp, msg, type); return TCL_ERROR; } int XOTclVarErrMsg TCL_VARARGS_DEF (Tcl_Interp *, arg1) { va_list argList; char *string; Tcl_Interp *interp; interp = TCL_VARARGS_START(Tcl_Interp *, arg1, argList); Tcl_ResetResult(interp); while (1) { string = va_arg(argList, char *); if (string == NULL) { break; } Tcl_AppendResult(interp, string, (char *) NULL); } va_end(argList); return TCL_ERROR; } int XOTclErrInProc (Tcl_Interp *interp, Tcl_Obj *objName, Tcl_Obj *clName, char *procName) { Tcl_DString errMsg; char *cName, *space; ALLOC_DSTRING(&errMsg, "\n "); if (clName) { cName = ObjStr(clName); space = " "; } else { cName = ""; space =""; } Tcl_DStringAppend(&errMsg, ObjStr(objName),-1); Tcl_DStringAppend(&errMsg, space, -1); Tcl_DStringAppend(&errMsg, cName, -1); Tcl_DStringAppend(&errMsg, "->", 2); Tcl_DStringAppend(&errMsg, procName, -1); Tcl_AddErrorInfo (interp, Tcl_DStringValue(&errMsg)); DSTRING_FREE(&errMsg); return TCL_ERROR; } int XOTclObjErrArgCnt(Tcl_Interp *interp, Tcl_Obj *cmdname, char *arglist) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, "wrong # args: should be {", (char *) NULL); if (cmdname) { Tcl_AppendResult(interp, ObjStr(cmdname), " ", (char *) NULL); } if (arglist != 0) Tcl_AppendResult(interp, arglist, (char *) NULL); Tcl_AppendResult(interp, "}", (char *) NULL); return TCL_ERROR; } int XOTclErrBadVal(Tcl_Interp *interp, char *context, char *expected, char *value) { Tcl_ResetResult(interp); Tcl_AppendResult(interp, context, ": expected ", expected, " but got '", value, "'", (char *) NULL); return TCL_ERROR; } int XOTclErrBadVal_(Tcl_Interp *interp, char *expected, char *value) { fprintf(stderr, "Deprecated call, recompile your program with xotcl 1.5 or newer\n"); Tcl_ResetResult(interp); Tcl_AppendResult(interp, ": expected ", expected, " but got '", value, "'", (char *) NULL); return TCL_ERROR; } extern int XOTclObjErrType(Tcl_Interp *interp, Tcl_Obj *nm, char *wt) { Tcl_ResetResult(interp); Tcl_AppendResult(interp,"'",ObjStr(nm), "' method should be called on '", wt, "'", (char *) NULL); return TCL_ERROR; } ./xotcl-1.6.8/generic/._xotclInt.decls000644 000765 000024 00000000430 12161600406 020262 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclInt.decls000644 000765 000024 00000005263 12161600406 020056 0ustar00neumannstaff000000 000000 # xotclInt.decls -- # # This file contains the declarations for all unsupported # functions that are exported by the Tcl library. This file # is used to generate the itclIntDecls.h and itclIntStub.c # files # # Copyright (c) 1998-1999 by Scriptics Corporation. # See the file "tcl-license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: xotclInt.decls,v 1.1 2004/05/23 22:50:39 neumann Exp $ library xotcl # Define the unsupported generic interfaces. interface xotclInt # # Functions used within the package, but not considered "public" # #declare 0 generic { #} #declare 1 generic { #} # declare 2 generic { # int XOTclErrInProc (Tcl_Interp *in, Tcl_Obj* objName, # Tcl_Obj* clName, char* procName) # } # declare 3 generic { # int XOTclObjErrArgCnt(Tcl_Interp *in, Tcl_Obj *cmdname, char *arglist) # } # declare 4 generic { # int XOTclErrBadVal(Tcl_Interp *in, char *expected, char *value) # } # declare 5 generic { # int XOTclObjErrType(Tcl_Interp *in, Tcl_Obj *nm, char* wt) # } # declare 6 generic { # void XOTclStackTrace (Tcl_Interp* in) # } # declare 7 generic { # void XOTclCallStackTrace (Tcl_Interp* in) # } #declare 8 generic { # void XOTclFilterTrace (Tcl_Interp* in) #} #declare 9 generic { # int XOTclIsType(XOTclObject* obj, XOTclClass* type) #} #declare 10 generic { # void XOTclRemoveClasses(XOTclClasses* sl) #} # declare 11 generic { # XOTclClasses** XOTclAddClass(XOTclClasses** cList, XOTclClass* cl, ClientData cd) # } # declare 12 generic { # XOTclClasses* XOTclComputePrecedence(register XOTclClass* cl) # } # declare 13 generic { # XOTclClasses* XOTclComputeDependents(register XOTclClass* cl) # } # declare 14 generic { # void XOTclDeprecatedMsg(char* oldCmd, char* newCmd) # } # declare 15 generic { # void XOTclSetObjClientData(XOTclObject* obj, ClientData data) # } # declare 16 generic { # ClientData XOTclGetObjClientData(XOTclObject* obj) # } # declare 17 generic { # void XOTclSetClassClientData(XOTclClass* cl, ClientData data) # } # declare 18 generic { # ClientData XOTclGetClassClientData(XOTclClass* cl) # } # declare 19 generic { # void XOTclRequireObjectOpt(XOTclObject* obj) # } # declare 20 generic { # void XOTclRequireClassOpt(XOTclClass* cl) # } # declare 21 generic { # void XOTclRequireObjNamespace(Tcl_Interp* in, XOTclObject* obj) # } # declare 22 generic { # } # declare 23 generic { # } # declare 24 generic { # } # declare 25 generic { # } # declare 26 generic { # } # declare 27 generic { # } # declare 28 generic { # } # declare 29 generic { # } # declare 30 generic { # } ./xotcl-1.6.8/generic/._xotclInt.h000644 000765 000024 00000000430 12326777701 017437 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclInt.h000644 000765 000024 00000054150 12326777701 017232 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * xotclInt.h -- * * Mostly internally used API Functions */ #ifndef _xotcl_int_h_ #define _xotcl_int_h_ #include #include "xotcl.h" #include #include #include #if defined(PROFILE) # include #endif #ifdef DMALLOC # include "dmalloc.h" #endif #ifdef BUILD_xotcl # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLEXPORT #endif /* #define XOTCL_METADATA */ /* * Makros */ #if defined(PRE85) # define TclVarHashTable Tcl_HashTable #endif #ifdef XOTCL_MEM_COUNT Tcl_HashTable xotclMemCount; extern int xotclMemCountInterpCounter; typedef struct XOTclMemCounter { int peak; int count; } XOTclMemCounter; # define MEM_COUNT_ALLOC(id,p) XOTclMemCountAlloc(id,p) # define MEM_COUNT_FREE(id,p) XOTclMemCountFree(id,p) # define MEM_COUNT_INIT() \ if (xotclMemCountInterpCounter == 0) { \ Tcl_InitHashTable(&xotclMemCount, TCL_STRING_KEYS); \ xotclMemCountInterpCounter = 1; \ } # define MEM_COUNT_DUMP() XOTclMemCountDump(interp) # define MEM_COUNT_OPEN_FRAME() /*if (obj->varTable) noTableBefore = 0*/ # define MEM_COUNT_CLOSE_FRAME() /* if (obj->varTable && noTableBefore) \ XOTclMemCountAlloc("obj->varTable",NULL)*/ #else # define MEM_COUNT_ALLOC(id,p) # define MEM_COUNT_FREE(id,p) # define MEM_COUNT_INIT() # define MEM_COUNT_DUMP() # define MEM_COUNT_OPEN_FRAME() # define MEM_COUNT_CLOSE_FRAME() #endif #define DSTRING_INIT(D) Tcl_DStringInit(D); MEM_COUNT_ALLOC("DString",D) #define DSTRING_FREE(D) Tcl_DStringFree(D); MEM_COUNT_FREE("DString",D) #if USE_ASSOC_DATA # define RUNTIME_STATE(interp) ((XOTclRuntimeState*)Tcl_GetAssocData((interp), "XOTclRuntimeState", NULL)) #else # define RUNTIME_STATE(interp) ((XOTclRuntimeState*)((Interp*)interp)->globalNsPtr->clientData) #endif #define ALLOC_NAME_NS(DSP, NS, NAME) \ DSTRING_INIT(DSP);\ Tcl_DStringAppend(DSP, NS, -1),\ Tcl_DStringAppend(DSP, "::", 2),\ Tcl_DStringAppend(DSP, NAME, -1) #define ALLOC_TOP_NS(DSP, NAME) \ DSTRING_INIT(DSP);\ Tcl_DStringAppend(DSP, "::", 2),\ Tcl_DStringAppend(DSP, NAME, -1) #define ALLOC_DSTRING(DSP,ENTRY) \ DSTRING_INIT(DSP);\ Tcl_DStringAppend(DSP, ENTRY, -1) #define nr_elements(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) # define NEW(type) \ (type *)ckalloc(sizeof(type)); MEM_COUNT_ALLOC(#type, NULL) # define NEW_ARRAY(type,n) \ (type *)ckalloc(sizeof(type)*(n)); MEM_COUNT_ALLOC(#type "*", NULL) # define FREE(type, var) \ ckfree((char*) var); MEM_COUNT_FREE(#type,var) #define isAbsolutePath(m) (*m == ':' && m[1] == ':') #define isArgsString(m) (\ *m == 'a' && m[1] == 'r' && m[2] == 'g' && m[3] == 's' && \ m[4] == '\0') #define isDoubleDashString(m) (\ *m == '-' && m[1] == '-' && m[2] == '\0') #define isBodyString(m) (\ *m == 'b' && m[1] == 'o' && m[2] == 'd' && m[3] == 'y' && \ m[4] == '\0') #define isClassString(m) (\ *m == 'c' && m[1] == 'l' && m[2] == 'a' && m[3] == 's' && \ m[4] == 's' && m[5] == '\0') #define isCheckString(m) (\ *m == 'c' && m[1] == 'h' && m[2] == 'e' && m[3] == 'c' && \ m[4] == 'k' && m[5] == '\0') #define isCheckObjString(m) (\ *m == 'c' && m[1] == 'h' && m[2] == 'e' && m[3] == 'c' && \ m[4] == 'k' && m[5] == 'o' && m[6] == 'b' && m[7] == 'j' && \ m[8] == '\0') #define isCreateString(m) (\ *m == 'c' && m[1] == 'r' && m[2] == 'e' && m[3] == 'a' && \ m[4] == 't' && m[5] == 'e' && m[6] == '\0') #define isAllocString(m) (\ *m == 'a' && m[1] == 'l' && m[2] == 'l' && m[3] == 'o' && \ m[4] == 'c' && m[5] == '\0') #define isDestroyString(m) (\ *m == 'd' && m[1] == 'e' && m[2] == 's' && m[3] == 't' && \ m[4] == 'r' && m[5] == 'o' && m[6] == 'y' && m[7] == '\0') #define isInstDestroyString(m) (\ *m == 'i' && m[1] == 'n' && m[2] == 's' && m[3] == 't' && \ m[4] == 'd' && m[5] == 'e' && m[6] == 's' && m[7] == 't' && \ m[8] == 'r' && m[9] == 'o' && m[10] == 'y' && m[11] == '\0') #define isInitString(m) (\ *m == 'i' && m[1] == 'n' && m[2] == 'i' && m[3] == 't' && \ m[4] == '\0') #define isInfoString(m) (\ *m == 'i' && m[1] == 'n' && m[2] == 'f' && m[3] == 'o' && \ m[4] == '\0') #ifdef AUTOVARS # define isNextString(m) (\ *m == 'n' && m[1] == 'e' && m[2] == 'x' && m[3] == 't' && \ m[4] == '\0') #endif #define isInstinvarString(m) (\ *m == 'i' && m[1] == 'n' && m[2] == 's' && m[3] == 't' && \ m[4] == 'i' && m[5] == 'n' && m[6] == 'v' && m[7] == 'a' && \ m[8] == 'r' && m[9] == '\0') #define isInvarString(m) (\ *m == 'i' && m[1] == 'n' && m[2] == 'v' && m[3] == 'a' && \ m[4] == 'r' && m[5] == '\0') #define isInstprocString(m) (\ *m == 'i' && m[1] == 'n' && m[2] == 's' && m[3] == 't' && \ m[4] == 'p' && m[5] == 'r' && m[6] == 'o' && m[7] == 'c' && \ m[8] == '\0') #define isProcString(m) (\ *m == 'p' && m[1] == 'r' && m[2] == 'o' && m[3] == 'c' && \ m[4] == '\0') #if (defined(sun) || defined(__hpux)) && !defined(__GNUC__) # define USE_ALLOCA #endif #if defined(__IBMC__) && !defined(__GNUC__) # if __IBMC__ >= 0x0306 # define USE_ALLOCA # else # define USE_MALLOC # endif #endif #if defined(VISUAL_CC) # define USE_MALLOC #endif #if defined(__GNUC__) && !defined(USE_ALLOCA) && !defined(USE_MALLOC) # if !defined(NDEBUG) # define ALLOC_ON_STACK(type,n,var) \ int __##var##_count = (n); type __##var[n+2]; \ type *var = __##var + 1; var[-1] = var[__##var##_count] = (type)0xdeadbeaf # define FREE_ON_STACK(type,var) \ assert(var[-1] == var[__##var##_count] && var[-1] == (type)0xdeadbeaf) # else # define ALLOC_ON_STACK(type,n,var) type var[(n)] # define FREE_ON_STACK(type,var) # endif #elif defined(USE_ALLOCA) # define ALLOC_ON_STACK(type,n,var) type *var = (type *)alloca((n)*sizeof(type)) # define FREE_ON_STACK(type,var) #else # define ALLOC_ON_STACK(type,n,var) type *var = (type *)ckalloc((n)*sizeof(type)) # define FREE_ON_STACK(type,var) ckfree((char*)var) #endif #ifdef USE_ALLOCA # include #endif #ifdef __WIN32__ # define XOTCLINLINE # define XOTclNewObj(A) A=Tcl_NewObj() # define DECR_REF_COUNT(A) \ MEM_COUNT_FREE("INCR_REF_COUNT",A); Tcl_DecrRefCount(A) #else /* * This was defined to be inline for anything !sun or __IBMC__ >= 0x0306, * but __hpux should also be checked - switched to only allow in gcc - JH */ # if defined(__GNUC__) # define XOTCLINLINE inline # else # define XOTCLINLINE # endif # ifdef USE_TCL_STUBS # define XOTclNewObj(A) A=Tcl_NewObj() # define DECR_REF_COUNT(A) \ MEM_COUNT_FREE("INCR_REF_COUNT",A); assert((A)->refCount > -1); \ Tcl_DecrRefCount(A) # else # define XOTclNewObj(A) TclNewObj(A) # define DECR_REF_COUNT(A) \ MEM_COUNT_FREE("INCR_REF_COUNT",A); TclDecrRefCount(A) # endif #endif #if !defined(PRE83) && defined(TCL_THREADS) # define XOTclMutex Tcl_Mutex # define XOTclMutexLock(a) Tcl_MutexLock(a) # define XOTclMutexUnlock(a) Tcl_MutexUnlock(a) #else # define XOTclMutex int # define XOTclMutexLock(a) (*(a))++ # define XOTclMutexUnlock(a) (*(a))-- #endif #if !defined(CONST84) # if defined(PRE84) # define CONST84 # else # define CONST84 CONST # endif #endif #if defined(PRE81) # define ObjStr(obj) Tcl_GetStringFromObj(obj, ((int*)NULL)) #else # define ObjStr(obj) (obj)->bytes ? (obj)->bytes : Tcl_GetString(obj) /*# define ObjStr(obj) Tcl_GetString(obj) */ #endif #ifdef V81 # define EvalObj(interp,cmd) Tcl_EvalObj(interp, cmd, 0) # define TclIsVarArgument(args) (args->isArg) # define Tcl_ObjSetVar2(interp,p1,p2,newval,flags) \ Tcl_SetObjVar2(interp,ObjStr(p1),p2,newval,flags) #define Tcl_ObjGetVar2(interp,name1,name2,flgs) \ Tcl_GetObjVar2(interp, ObjStr(name1), \ ((name2==NULL) ? (char*)NULL : ObjStr(name2)), flgs) #else # if defined(PRE83) # define EvalObj(interp, cmd) Tcl_EvalObj(interp,cmd) # else # define EvalObj(interp, cmd) Tcl_EvalObjEx(interp,cmd,0) # endif # if defined(PRE81) && TCL_RELEASE_SERIAL<3 # define TclIsVarArgument(args) (args->isArg) # endif #endif #if 0 #define XOTcl_FrameDecls CallFrame *oldFramePtr = 0, frame, *newFramePtr = &frame #define XOTcl_PushFrame(interp, obj) \ memset(newFramePtr, 0, sizeof(CallFrame)); \ oldFramePtr = ((Interp *)interp)->varFramePtr; \ if ((obj)->nsPtr) { \ newFramePtr->nsPtr = (Namespace*) (obj)->nsPtr; \ } else { \ newFramePtr->nsPtr = (Namespace*) RUNTIME_STATE(interp)->fakeNS; \ newFramePtr->isProcCallFrame = 1; \ newFramePtr->procPtr = &RUNTIME_STATE(interp)->fakeProc; \ newFramePtr->varTablePtr = (obj)->varTable; \ } \ ((Interp *)interp)->varFramePtr = newFramePtr; \ MEM_COUNT_OPEN_FRAME() #define XOTcl_PopFrame(interp, obj) \ if (!(obj)->nsPtr && (obj)->varTable == 0) \ (obj)->varTable = newFramePtr->varTablePtr; \ ((Interp *)interp)->varFramePtr = oldFramePtr; \ MEM_COUNT_CLOSE_FRAME() #else /* slightly slower version based on Tcl_PushCallFrame. Note that it is possible that between push and pop a obj->nsPtr can be created (e.g. during a read trace) */ #define XOTcl_FrameDecls TclCallFrame frame, *framePtr = &frame; int frame_constructed = 1 #define XOTcl_PushFrame(interp,obj) \ if ((obj)->nsPtr) { \ frame_constructed = 0; \ Tcl_PushCallFrame(interp, (Tcl_CallFrame*)framePtr, (obj)->nsPtr, 0); \ } else { \ CallFrame *myframe = (CallFrame *)framePtr; \ Tcl_PushCallFrame(interp, (Tcl_CallFrame*)framePtr, RUNTIME_STATE(interp)->fakeNS, 1); \ Tcl_CallFrame_procPtr(myframe) = &RUNTIME_STATE(interp)->fakeProc; \ Tcl_CallFrame_varTablePtr(myframe) = (obj)->varTable; \ } #define XOTcl_PopFrame(interp,obj) \ if (!(obj)->nsPtr) { \ CallFrame *myframe = (CallFrame *)framePtr; \ if ((obj)->varTable == 0) \ (obj)->varTable = Tcl_CallFrame_varTablePtr(myframe); \ } \ if (frame_constructed) { \ Interp *iPtr = (Interp *) interp; \ register CallFrame *myframe = iPtr->framePtr; \ Tcl_CallFrame_varTablePtr(myframe) = 0; \ Tcl_CallFrame_procPtr(myframe) = 0; \ } \ Tcl_PopCallFrame(interp) #endif #define INCR_REF_COUNT(A) MEM_COUNT_ALLOC("INCR_REF_COUNT",A); Tcl_IncrRefCount(A) #ifdef OBJDELETION_TRACE # define PRINTOBJ(ctx,obj) \ fprintf(stderr, " %s %p %s oid=%p teardown=%p destroyCalled=%d\n", \ ctx,obj,ObjStr(obj->cmdName), obj->id, obj->teardown, \ (obj->flags & XOTCL_DESTROY_CALLED)) #else # define PRINTOBJ(ctx,obj) #endif #define className(cl) (cl ? ObjStr(cl->object.cmdName) : "") #define LONG_AS_STRING 32 /* TCL_CONTINUE is defined as 4, from 5 on we can use app-specific return codes */ #define XOTCL_CHECK_FAILED 6 /* flags for call method */ #define XOTCL_CM_NO_FILTERS 1 #define XOTCL_CM_NO_UNKNOWN 2 /* * * XOTcl Structures * */ /* * Filter structures */ typedef struct XOTclFilterStack { Tcl_Command currentCmdPtr; Tcl_Obj* calledProc; struct XOTclFilterStack* next; } XOTclFilterStack; typedef struct XOTclTclObjList { Tcl_Obj* content; struct XOTclTclObjList* next; } XOTclTclObjList; /* * Assertion structures */ typedef struct XOTclProcAssertion { XOTclTclObjList* pre; XOTclTclObjList* post; } XOTclProcAssertion; typedef struct XOTclAssertionStore { XOTclTclObjList* invariants; Tcl_HashTable procs; } XOTclAssertionStore; typedef enum { /* powers of 2; add to ALL, if default; */ CHECK_NONE = 0, CHECK_CLINVAR = 1, CHECK_OBJINVAR = 2, CHECK_PRE = 4, CHECK_POST = 8, CHECK_INVAR = CHECK_CLINVAR + CHECK_OBJINVAR, CHECK_ALL = CHECK_INVAR + CHECK_PRE + CHECK_POST } CheckOptions; void XOTclAssertionRename(Tcl_Interp* interp, Tcl_Command cmd, XOTclAssertionStore *as, char *oldSimpleCmdName, char *newName); /* * mixins */ typedef struct XOTclMixinStack { Tcl_Command currentCmdPtr; struct XOTclMixinStack* next; } XOTclMixinStack; /* * Generic command pointer list */ typedef struct XOTclCmdList { Tcl_Command cmdPtr; ClientData clientData; struct XOTclClass *clorobj; struct XOTclCmdList* next; } XOTclCmdList; typedef void (XOTclFreeCmdListClientData) _ANSI_ARGS_((XOTclCmdList*)); /* for incr string */ typedef struct XOTclStringIncrStruct { char *buffer; char *start; size_t bufSize; int length; } XOTclStringIncrStruct; /* * object flags ... */ /* DESTROY_CALLED indicates that destroy was called on obj */ #define XOTCL_DESTROY_CALLED 0x0001 /* INIT_CALLED indicates that init was called on obj */ #define XOTCL_INIT_CALLED 0x0002 /* MIXIN_ORDER_VALID set when mixin order is valid */ #define XOTCL_MIXIN_ORDER_VALID 0x0004 /* MIXIN_ORDER_DEFINED set, when mixins are defined for obj */ #define XOTCL_MIXIN_ORDER_DEFINED 0x0008 #define XOTCL_MIXIN_ORDER_DEFINED_AND_VALID 0x000c /* FILTER_ORDER_VALID set, when filter order is valid */ #define XOTCL_FILTER_ORDER_VALID 0x0010 /* FILTER_ORDER_DEFINED set, when filters are defined for obj */ #define XOTCL_FILTER_ORDER_DEFINED 0x0020 #define XOTCL_FILTER_ORDER_DEFINED_AND_VALID 0x0030 /* IS_CLASS set, when object is a class */ #define XOTCL_IS_CLASS 0x0040 /* DESTROYED set, when object is physically destroyed with PrimitiveODestroy */ #define XOTCL_DESTROYED 0x0080 #define XOTCL_REFCOUNTED 0x0100 #define XOTCL_RECREATE 0x0200 #define XOTCL_NS_DESTROYED 0x0400 #define XOTCL_TCL_DELETE 0x0200 #define XOTCL_FREE_TRACE_VAR_CALLED 0x2000 #define XOTclObjectSetClass(obj) \ (obj)->flags |= XOTCL_IS_CLASS #define XOTclObjectClearClass(obj) \ (obj)->flags &= ~XOTCL_IS_CLASS #define XOTclObjectIsClass(obj) \ ((obj)->flags & XOTCL_IS_CLASS) #define XOTclObjectToClass(obj) \ (XOTclClass*)((((XOTclObject*)obj)->flags & XOTCL_IS_CLASS)?obj:0) /* * object and class internals */ typedef struct XOTclNonposArgs { Tcl_Obj* nonposArgs; Tcl_Obj* ordinaryArgs; } XOTclNonposArgs; typedef struct XOTclObjectOpt { XOTclAssertionStore *assertions; XOTclCmdList* filters; XOTclCmdList* mixins; #ifdef XOTCL_METADATA Tcl_HashTable metaData; #endif ClientData clientData; CONST char *volatileVarName; short checkoptions; } XOTclObjectOpt; typedef struct XOTclObject { Tcl_Obj *cmdName; Tcl_Command id; Tcl_Interp *teardown; struct XOTclClass *cl; TclVarHashTable *varTable; Tcl_Namespace *nsPtr; XOTclObjectOpt *opt; struct XOTclCmdList *filterOrder; struct XOTclCmdList *mixinOrder; XOTclFilterStack *filterStack; XOTclMixinStack *mixinStack; int refCount; short flags; Tcl_HashTable *nonposArgsTable; } XOTclObject; typedef struct XOTclClassOpt { XOTclCmdList* instfilters; XOTclCmdList* instmixins; XOTclCmdList* isObjectMixinOf; XOTclCmdList* isClassMixinOf; XOTclAssertionStore *assertions; Tcl_Obj* parameterClass; #ifdef XOTCL_OBJECTDATA Tcl_HashTable* objectdata; #endif Tcl_Command id; ClientData clientData; } XOTclClassOpt; typedef struct XOTclClass { struct XOTclObject object; struct XOTclClasses* super; struct XOTclClasses* sub; short color; struct XOTclClasses* order; /*struct XOTclClass* parent;*/ Tcl_HashTable instances; Tcl_Namespace *nsPtr; Tcl_Obj* parameters; XOTclClassOpt* opt; Tcl_HashTable *nonposArgsTable; } XOTclClass; typedef struct XOTclClasses { struct XOTclClass* cl; ClientData clientData; struct XOTclClasses* next; } XOTclClasses; /* XOTcl global names and strings */ /* these are names and contents for global (corresponding) Tcl_Objs and Strings - otherwise these "constants" would have to be built every time they are used; now they are built once in XOTcl_Init */ typedef enum { XOTE_EMPTY, XOTE_UNKNOWN, XOTE_CREATE, XOTE_DESTROY, XOTE_INSTDESTROY, XOTE_ALLOC, XOTE_INIT, XOTE_INSTVAR, XOTE_INTERP, XOTE_AUTONAMES, XOTE_ZERO, XOTE_ONE, XOTE_MOVE, XOTE_SELF, XOTE_CLASS, XOTE_RECREATE, XOTE_SELF_CLASS, XOTE_SELF_PROC, XOTE_PARAM_CL, XOTE_SEARCH_DEFAULTS, XOTE_EXIT_HANDLER, XOTE_NON_POS_ARGS_CL, XOTE_NON_POS_ARGS_OBJ, XOTE_CLEANUP, XOTE_CONFIGURE, XOTE_FILTER, XOTE_INSTFILTER, XOTE_INSTPROC, XOTE_PROC, XOTE_INSTFORWARD, XOTE_FORWARD, XOTE_INSTCMD, XOTE_CMD, XOTE_INSTPARAMETERCMD, XOTE_PARAMETERCMD, XOTE_MKGETTERSETTER, XOTE_FORMAT, XOTE_NEWOBJ, XOTE_GUARD_OPTION, XOTE_DEFAULTMETHOD, XOTE___UNKNOWN, XOTE_ARGS, XOTE_SPLIT, XOTE_COMMA, /** these are the redefined tcl commands; leave them together at the end */ XOTE_EXPR, XOTE_INFO, XOTE_RENAME, XOTE_SUBST } XOTclGlobalNames; #if !defined(XOTCL_C) extern char *XOTclGlobalStrings[]; #else char *XOTclGlobalStrings[] = { "", "unknown", "create", "destroy", "instdestroy", "alloc", "init", "instvar", "interp", "__autonames", "0", "1", "move", "self", "class", "recreate", "self class", "self proc", "::xotcl::Class::Parameter", "searchDefaults", "__exitHandler", "::xotcl::NonposArgs", "::xotcl::nonposArgs", "cleanup", "configure", "filter", "instfilter", "instproc", "proc", "instforward", "forward", "instcmd", "cmd", "instparametercmd", "parametercmd", "mkGetterSetter", "format", "__#", "-guard", "defaultmethod", "__unknown", "args", "split", ",", "expr", "info", "rename", "subst", }; #endif #define XOTclGlobalObjects RUNTIME_STATE(interp)->methodObjNames /* XOTcl ShadowTclCommands */ typedef struct XOTclShadowTclCommandInfo { TclObjCmdProcType proc; ClientData cd; } XOTclShadowTclCommandInfo; typedef enum {SHADOW_LOAD=1, SHADOW_UNLOAD=0, SHADOW_REFETCH=2} XOTclShadowOperations; int XOTclCallCommand(Tcl_Interp* interp, XOTclGlobalNames name, int objc, Tcl_Obj *CONST objv[]); int XOTclShadowTclCommands(Tcl_Interp* interp, XOTclShadowOperations load); /* * XOTcl CallStack */ typedef struct XOTclCallStackContent { XOTclObject *self; XOTclClass *cl; Tcl_Command cmdPtr; Tcl_Command destroyedCmd; Tcl_CallFrame *currentFramePtr; unsigned short frameType; unsigned short callType; XOTclFilterStack *filterStackEntry; } XOTclCallStackContent; #define XOTCL_CSC_TYPE_PLAIN 0 #define XOTCL_CSC_TYPE_ACTIVE_MIXIN 1 #define XOTCL_CSC_TYPE_ACTIVE_FILTER 2 #define XOTCL_CSC_TYPE_INACTIVE 4 #define XOTCL_CSC_TYPE_INACTIVE_MIXIN 5 #define XOTCL_CSC_TYPE_INACTIVE_FILTER 6 #define XOTCL_CSC_TYPE_GUARD 16 #define XOTCL_CSC_CALL_IS_NEXT 1 #define XOTCL_CSC_CALL_IS_DESTROY 2 #define XOTCL_CSC_CALL_IS_GUARD 4 typedef struct XOTclCallStack { XOTclCallStackContent content[MAX_NESTING_DEPTH]; XOTclCallStackContent *top; short guardCount; } XOTclCallStack; #if defined(PROFILE) typedef struct XOTclProfile { long int overallTime; Tcl_HashTable objectData; Tcl_HashTable methodData; } XOTclProfile; #endif typedef struct XOTclRuntimeState { XOTclCallStack cs; Tcl_Namespace *XOTclClassesNS; Tcl_Namespace *XOTclNS; /* * definitions of the main xotcl objects */ XOTclClass *theObject; XOTclClass *theClass; #if USE_INTERP_PROC Tcl_CmdProc *interpProc; #endif Tcl_ObjCmdProc *objInterpProc; Tcl_Obj **methodObjNames; struct XOTclShadowTclCommandInfo *tclCommands; int errorCount; /* these flags could move into a bitarray, but are used only once per interp*/ int callDestroy; int callIsDestroy; int unknown; int doFilters; int doSoftrecreate; int exitHandlerDestroyRound; int returnCode; long newCounter; XOTclStringIncrStruct iss; Proc fakeProc; Tcl_Namespace *fakeNS; XotclStubs *xotclStubs; Tcl_CallFrame *varFramePtr; Command *cmdPtr; #if defined(PROFILE) XOTclProfile profile; #endif ClientData clientData; } XOTclRuntimeState; #define XOTCL_EXITHANDLER_OFF 0 #define XOTCL_EXITHANDLER_ON_SOFT_DESTROY 1 #define XOTCL_EXITHANDLER_ON_PHYSICAL_DESTROY 2 #ifdef XOTCL_OBJECTDATA extern void XOTclSetObjectData(struct XOTclObject* obj, struct XOTclClass* cl, ClientData data); extern int XOTclGetObjectData(struct XOTclObject* obj, struct XOTclClass* cl, ClientData* data); extern int XOTclUnsetObjectData(struct XOTclObject* obj, struct XOTclClass* cl); extern void XOTclFreeObjectData(XOTclClass* cl); #endif /* * * internally used API functions * */ #include "xotclIntDecls.h" /* * Profiling functions */ #if defined(PROFILE) extern void XOTclProfileFillTable(Tcl_HashTable* table, Tcl_DString* key, double totalMicroSec); extern void XOTclProfileEvaluateData(Tcl_Interp* interp, long int startSec, long int startUsec, XOTclObject* obj, XOTclClass *cl, char *methodName); extern void XOTclProfilePrintTable(Tcl_HashTable* table); extern void XOTclProfilePrintData(Tcl_Interp* interp); extern void XOTclProfileInit(Tcl_Interp* interp); #endif /* * MEM Counting */ #ifdef XOTCL_MEM_COUNT void XOTclMemCountAlloc(char* id, void *); void XOTclMemCountFree(char* id, void *); void XOTclMemCountDump(); #endif /* XOTCL_MEM_COUNT */ /* * old, deprecated meta-data command */ #if defined(XOTCL_METADATA) extern void XOTclMetaDataDestroy(XOTclObject* obj); extern void XOTclMetaDataInit(XOTclObject* obj); extern int XOTclOMetaDataMethod (ClientData cd, Tcl_Interp* interp, int objc, Tcl_Obj *objv[]); #endif /* XOTCL_METADATA */ /* * bytecode support */ #ifdef XOTCL_BYTECODE typedef struct XOTclCompEnv { int bytecode; Command *cmdPtr; CompileProc *compileProc; Tcl_ObjCmdProc *callProc; } XOTclCompEnv; typedef enum {INST_INITPROC, INST_NEXT, INST_SELF, INST_SELF_DISPATCH, LAST_INSTRUCTION} XOTclByteCodeInstructions; extern XOTclCompEnv *XOTclGetCompEnv(); Tcl_ObjCmdProc XOTclInitProcNSCmd, XOTclSelfDispatchCmd, XOTclNextObjCmd, XOTclGetSelfObjCmd; int XOTclDirectSelfDispatch(ClientData cd, Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[]); #endif int XOTclObjDispatch(ClientData cd, Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[]); XOTclCallStackContent * XOTclCallStackFindActiveFrame(Tcl_Interp* interp, int offset); XOTclCallStackContent * XOTclCallStackFindLastInvocation(Tcl_Interp* interp, int offset); /* functions from xotclUtil.c */ char *XOTcl_ltoa(char *buf, long i, int *len); char *XOTclStringIncr(XOTclStringIncrStruct *iss); void XOTclStringIncrInit(XOTclStringIncrStruct *iss); void XOTclStringIncrFree(XOTclStringIncrStruct *iss); #if !defined(NDEBUG) /*# define XOTCLINLINE*/ #endif /*** common win sermon ***/ #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT #endif /* _xotcl_int_h_ */ ./xotcl-1.6.8/generic/._xotclIntDecls.h000644 000765 000024 00000000430 12327000221 020363 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclIntDecls.h000644 000765 000024 00000002356 12327000221 020157 0ustar00neumannstaff000000 000000 /* * xotclIntDecls.h -- * * This file contains the declarations for all unsupported * functions that are exported by the Tcl library. These * interfaces are not guaranteed to remain the same between * versions. Use at your own risk. * * Copyright (C) 1999-2007 Uwe Zdun * Copyright (C) 1999-2014 Gustaf Neumann * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #ifndef _XOTCLINTDECLS #define _XOTCLINTDECLS /* * WARNING: This file is automatically generated by the tools/genStubs.tcl * script. Any modifications to the function declarations below should be made * in the xotclInt.decls script. */ /* !BEGIN!: Do not edit below this line. */ /* * Exported function declarations: */ typedef struct XotclIntStubs { int magic; struct XotclIntStubHooks *hooks; } XotclIntStubs; #ifdef __cplusplus extern "C" { #endif extern XotclIntStubs *xotclIntStubsPtr; #ifdef __cplusplus } #endif #if defined(USE_XOTCL_STUBS) && !defined(USE_XOTCL_STUB_PROCS) /* * Inline function declarations: */ #endif /* defined(USE_XOTCL_STUBS) && !defined(USE_XOTCL_STUB_PROCS) */ /* !END!: Do not edit above this line. */ #endif /* _XOTCLINTDECLS */ ./xotcl-1.6.8/generic/._xotclMetaData.c000644 000765 000024 00000000430 12326777674 020371 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclMetaData.c000644 000765 000024 00000010154 12326777674 020160 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * xotclReference.c -- * * XOTcl Object References * */ #include "xotclInt.h" #ifdef XOTCL_METADATA /* * Meta Data */ void XOTclMetaDataRemoveDepending(XOTclClass *cl, char *name) { XOTclClasses *saved = cl->order, *clPtr; cl->order = 0; clPtr = XOTclComputeDependents(cl); while (clPtr != 0) { Tcl_HashSearch hSrch; Tcl_HashEntry *hPtr = &clPtr->cl->instances ? Tcl_FirstHashEntry(&clPtr->cl->instances, &hSrch) : 0; for (; hPtr != 0; hPtr = Tcl_NextHashEntry(&hSrch)) { XOTclObject *obj = (XOTclObject*) Tcl_GetHashKey(&clPtr->cl->instances, hPtr); Tcl_HashEntry *h1Ptr = 0; if (obj->opt) h1Ptr = Tcl_FindHashEntry(&obj->opt->metaData, name); if (h1Ptr) { Tcl_DeleteHashEntry(h1Ptr); } } clPtr = clPtr->next; } XOTclRemoveClasses(cl->order); cl->order = saved; } int XOTclMetaDataInheritance (XOTclObject *obj, char *name) { XOTclClasses *clPtr; assert(obj); if (!obj->cl->order) obj->cl->order = XOTclComputePrecedence(obj->cl); clPtr = obj->cl->order; if (clPtr) { while (clPtr != 0) { if (clPtr->cl->object.opt) { if (Tcl_FindHashEntry(&clPtr->cl->object.opt->metaData, name)) { return 1; } } clPtr = clPtr->next; } } return 0; } void XOTclMetaDataDestroy(XOTclObject *obj) { if (obj->opt) Tcl_DeleteHashTable(&obj->opt->metaData); } void XOTclMetaDataInit(XOTclObject *obj) { XOTclRequireObjectOpt(obj); Tcl_InitHashTable(&obj->opt->metaData, TCL_STRING_KEYS); } int XOTclOMetaDataMethod (ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { XOTclObject *obj = (XOTclObject*)cd; XOTclClass *cl = XOTclObjectToClass(cd); char *option; int add = -1; int result = TCL_OK; int oc; Tcl_Obj* *ov; int i; if (!obj) return XOTclObjErrType(interp, obj->cmdName, "Object"); if (objc < 2) return XOTclObjErrArgCnt(interp,obj->cmdName, "metadata ?(add|remove)? metaDataList"); option = ObjStr(objv[1]); switch (*option) { case 'a': if (strcmp(option,"add") == 0) add = 1; break; case 'r': if (strcmp(option,"remove") == 0) add = 0; break; } if (add == -1) { if (objc == 2) { if (obj->opt) { Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&obj->opt->metaData, option); if (hPtr) { Tcl_Obj *entry = (Tcl_Obj *) Tcl_GetHashValue(hPtr); if (entry) { Tcl_SetObjResult(interp, (Tcl_Obj *) Tcl_GetHashValue(hPtr)); } else { Tcl_ResetResult(interp); } } return TCL_OK; } } if (objc == 3) { if (obj->opt) { Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&obj->opt->metaData, option); if (!hPtr) { int nw; if (XOTclMetaDataInheritance(obj, option)) { hPtr = Tcl_CreateHashEntry(&obj->opt->metaData, option, &nw); if (!nw) return XOTclVarErrMsg(interp, "MetaData: Can't create MetaData Entry: ", option, (char*) NULL); } } if (hPtr) { Tcl_Obj *entry = (Tcl_Obj *) Tcl_GetHashValue(hPtr); if (entry) DECR_REF_COUNT(entry); INCR_REF_COUNT(objv[2]); Tcl_SetHashValue(hPtr, (ClientData) objv[2]); return TCL_OK; } } } return XOTclVarErrMsg(interp,"MetaData: Unknown option; given Option: ", option, (char*) NULL); } if (Tcl_ListObjGetElements(interp, objv[2], &oc, &ov) == TCL_OK) { for (i = 0; i < oc; i ++) { char *value = ObjStr (ov[i]); if (obj->opt) { if (add) { int nw; Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&obj->opt->metaData, value); if (hPtr) return XOTclVarErrMsg(interp, "Can't add MetaData, MetaData exists: ", value, (char*) NULL); hPtr = Tcl_CreateHashEntry(&obj->opt->metaData, value, &nw); if (!nw) return XOTclVarErrMsg(interp, "MetaData: Can't create MetaData Entry: ", value,(char*) NULL); } else { Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&obj->opt->metaData, value); if (hPtr) { Tcl_DeleteHashEntry(hPtr); if (cl) { XOTclMetaDataRemoveDepending(cl, value); } } } } } } return result; } #endif ./xotcl-1.6.8/generic/._xotclObjectData.c000644 000765 000024 00000000430 12326777674 020711 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclObjectData.c000644 000765 000024 00000002715 12326777674 020504 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * * xotclObjectData.c -- * * XOTcl Object Data, needs XOTCL_OBJECTDATA to be compiled in * */ #include "xotclInt.h" #ifdef XOTCL_OBJECTDATA extern void XOTclFreeObjectData(XOTclClass* cl) { if (cl->opt && cl->opt->objectdata) { Tcl_DeleteHashTable(cl->opt->objectdata); ckfree((char*)cl->opt->objectdata); cl->opt->objectdata = 0; } } extern void XOTclSetObjectData(XOTclObject* obj, XOTclClass* cl, ClientData data) { Tcl_HashEntry *hPtr; int nw; XOTclRequireClassOpt(cl); if (!cl->opt->objectdata) { cl->opt->objectdata = (Tcl_HashTable*)ckalloc(sizeof(Tcl_HashTable)); Tcl_InitHashTable(cl->opt->objectdata, TCL_ONE_WORD_KEYS); } hPtr = Tcl_CreateHashEntry(cl->opt->objectdata, (char*)obj, &nw); Tcl_SetHashValue(hPtr, data); } extern int XOTclGetObjectData(XOTclObject* obj, XOTclClass* cl, ClientData* data) { Tcl_HashEntry *hPtr; if (!cl->opt || !cl->opt->objectdata) return 0; hPtr = Tcl_FindHashEntry(cl->opt->objectdata, (char*)obj); if (data) *data = hPtr ? Tcl_GetHashValue(hPtr) : 0; return hPtr != 0; } extern int XOTclUnsetObjectData(XOTclObject* obj, XOTclClass* cl) { Tcl_HashEntry *hPtr; if (!cl->opt || !cl->opt->objectdata) return 0; hPtr = Tcl_FindHashEntry(cl->opt->objectdata, (char*)obj); if (hPtr) Tcl_DeleteHashEntry(hPtr); return hPtr != 0; } #endif ./xotcl-1.6.8/generic/._xotclProfile.c000644 000765 000024 00000000430 12326777674 020311 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclProfile.c000644 000765 000024 00000007756 12326777674 020116 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * xotclProfile.c -- * * Profiling information printout for XOTcl * * For profiling infos PROFILE (xotcl.h) flag must be activated * */ #include "xotclInt.h" #if defined(PROFILE) void XOTclProfileFillTable(Tcl_HashTable* table, Tcl_DString* key, double totalMicroSec) { Tcl_HashEntry* hPtr; char* keyStr = Tcl_DStringValue(key); long int* value; hPtr = Tcl_FindHashEntry(table, keyStr); if (!hPtr) { int nw; hPtr = Tcl_CreateHashEntry(table, keyStr, &nw); if (!nw) return; value = (long int*) ckalloc (sizeof(long int)); *value = 0; Tcl_SetHashValue(hPtr, (ClientData) value); } else value = (long int*) Tcl_GetHashValue (hPtr); *value += totalMicroSec; /* { long int* d = (long int*) Tcl_GetHashValue (hPtr); fprintf(stderr, "Entered %s ... %ld\n", Tcl_GetHashKey(table, hPtr), *d); }*/ } void XOTclProfileEvaluateData(Tcl_Interp* interp, long int startSec, long int startUsec, XOTclObject* obj, XOTclClass *cl, char *methodName) { double totalMicroSec; struct timeval trt; Tcl_DString objectKey, methodKey; XOTclProfile* profile = &RUNTIME_STATE(interp)->profile; gettimeofday(&trt, NULL); totalMicroSec = (trt.tv_sec - startSec) * 1000000 + (trt.tv_usec - startUsec); profile->overallTime += totalMicroSec; if (obj->teardown == 0 || !obj->id || obj->destroyCalled) return; ALLOC_DSTRING(&objectKey, ObjStr(obj->cmdName)); if (cl) ALLOC_DSTRING(&methodKey, ObjStr(cl->object.cmdName)); else ALLOC_DSTRING(&methodKey, ObjStr(obj->cmdName)); Tcl_DStringAppend(&methodKey, "->", 2); Tcl_DStringAppend(&methodKey, methodName, -1); if (cl) Tcl_DStringAppend(&methodKey, " (instproc)", 11); else Tcl_DStringAppend(&methodKey, " (proc)", 7); XOTclProfileFillTable(&profile->objectData, &objectKey, totalMicroSec); XOTclProfileFillTable(&profile->methodData, &methodKey, totalMicroSec); DSTRING_FREE(&objectKey); DSTRING_FREE(&methodKey); } void XOTclProfilePrintTable(Tcl_HashTable* table) { Tcl_HashEntry* topValueHPtr; long int* topValue; do { Tcl_HashSearch hSrch; Tcl_HashEntry* hPtr = table ? Tcl_FirstHashEntry(table, &hSrch) : 0; char* topKey = 0; topValueHPtr = 0; topValue = 0; for (; hPtr != 0; hPtr = Tcl_NextHashEntry(&hSrch)) { long int *val = (long int*) Tcl_GetHashValue(hPtr); if (val && (!topValue || (topValue && *val >= *topValue))) { topValue = val; topValueHPtr = hPtr; topKey = Tcl_GetHashKey(table, hPtr); } } if (topValueHPtr) { fprintf(stderr, " %15ld %s\n", *topValue, topKey); ckfree((char*) topValue); Tcl_DeleteHashEntry(topValueHPtr); } } while (topValueHPtr); } void XOTclProfilePrintData(Tcl_Interp *interp) { XOTclProfile* profile = &RUNTIME_STATE(interp)->profile; fprintf(stderr, "------------------------------------------------------------------\n"); fprintf(stderr, "\nXOTcl Profile Information\n\n"); fprintf(stderr, "------------------------------------------------------------------\n"); fprintf(stderr, "Overall Elapsed Time %ld\n", profile->overallTime); fprintf(stderr, "------------------------------------------------------------------\n"); fprintf(stderr, " MICROSECONDS OBJECT-NAME\n"); XOTclProfilePrintTable(&profile->objectData); fprintf(stderr, "------------------------------------------------------------------\n"); fprintf(stderr, " MICROSECONDS (CL/OBJ)->METHOD-NAME\n"); XOTclProfilePrintTable(&profile->methodData); fprintf(stderr, "------------------------------------------------------------------\n"); } void XOTclProfileInit(Tcl_Interp *interp) { RUNTIME_STATE(interp)->profile.overallTime = 0; Tcl_InitHashTable(&RUNTIME_STATE(interp)->profile.objectData, TCL_STRING_KEYS); Tcl_InitHashTable(&RUNTIME_STATE(interp)->profile.methodData, TCL_STRING_KEYS); } #endif ./xotcl-1.6.8/generic/._xotclShadow.c000644 000765 000024 00000000430 12326777674 020136 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclShadow.c000644 000765 000024 00000014277 12326777674 017737 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * xotclShadow.c -- * * Shadowing (overloading) and accessing global tcl obj commands * */ #include "xotclInt.h" #include "xotclAccessInt.h" static int XOTclReplaceCommandCleanup(Tcl_Interp *interp, XOTclGlobalNames name) { Tcl_Command cmd; int result = TCL_OK; XOTclShadowTclCommandInfo *ti = &RUNTIME_STATE(interp)->tclCommands[name-XOTE_EXPR]; /*fprintf(stderr," cleanup for %s ti=%p in %p\n", XOTclGlobalStrings[name], ti, interp);*/ cmd = Tcl_GetCommandFromObj(interp, XOTclGlobalObjects[name]); if (cmd != NULL) { Tcl_Command_objProc(cmd) = ti->proc; ti->proc = NULL; } else { result = TCL_ERROR; } return result; } static void XOTclReplaceCommandCheck(Tcl_Interp *interp, XOTclGlobalNames name, Tcl_ObjCmdProc *proc) { Tcl_Command cmd; XOTclShadowTclCommandInfo *ti = &RUNTIME_STATE(interp)->tclCommands[name-XOTE_EXPR]; cmd = Tcl_GetCommandFromObj(interp, XOTclGlobalObjects[name]); if (cmd != NULL && ti->proc && Tcl_Command_objProc(cmd) != proc) { /* fprintf(stderr, "we have to do something about %s %p %p\n", XOTclGlobalStrings[name], Tcl_Command_objProc(cmd), proc); */ ti->proc = Tcl_Command_objProc(cmd); ti->cd = Tcl_Command_objClientData(cmd); Tcl_Command_objProc(cmd) = proc; } } static int XOTclReplaceCommand(Tcl_Interp *interp, XOTclGlobalNames name, Tcl_ObjCmdProc *xotclReplacementProc, int pass) { Tcl_Command cmd; XOTclShadowTclCommandInfo *ti = &RUNTIME_STATE(interp)->tclCommands[name-XOTE_EXPR]; int result = TCL_OK; /*fprintf(stderr,"XOTclReplaceCommand %d\n",name);*/ cmd = Tcl_GetCommandFromObj(interp, XOTclGlobalObjects[name]); if (cmd == NULL) { result = TCL_ERROR; } else { Tcl_ObjCmdProc *objProc = Tcl_Command_objProc(cmd); if (xotclReplacementProc != objProc) { if (pass == 0) { /* setting values on first pass (must be locked here) */ ti->proc = objProc; ti->cd = Tcl_Command_objClientData(cmd); } else if (ti->proc != objProc) { /*fprintf(stderr, "we have to refetch command for %s\n",XOTclGlobalStrings[name]);*/ ti->proc = objProc; ti->cd = Tcl_Command_objClientData(cmd); } if (xotclReplacementProc) { Tcl_Command_objProc(cmd) = xotclReplacementProc; /*Tcl_CreateObjCommand(interp, XOTclGlobalStrings[name], xotclReplacementProc, 0, 0);*/ } } } return result; } static int XOTcl_RenameObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { /* this call the Tcl_RenameObjCmd, but it ensures before that the renamed obj, functions, etc. are not part of XOTcl */ XOTclObject *obj = NULL; Tcl_Command cmd; /* wrong # args => normal Tcl ErrMsg*/ if (objc != 3) return XOTclCallCommand(interp, XOTE_RENAME, objc, objv); /* if an obj/cl should be renamed => call the XOTcl move method */ cmd = Tcl_FindCommand(interp, ObjStr(objv[1]), (Tcl_Namespace *)NULL,0); if (cmd != NULL) { obj = XOTclGetObjectFromCmdPtr(cmd); if (obj) { return XOTclCallMethodWithArgs((ClientData)obj, interp, XOTclGlobalObjects[XOTE_MOVE], objv[2], 1, 0, 0); } } /* Actually rename the cmd using Tcl's rename*/ return XOTclCallCommand(interp, XOTE_RENAME, objc, objv); } static int XOTcl_InfoObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { int result, isBody = 0; if (objc > 1) { char *opt = ObjStr(objv[1]); if (isBodyString(opt) && objc > 2) isBody = 1; } result = XOTclCallCommand(interp, XOTE_INFO, objc, objv); if (isBody && result == TCL_OK) { char *body = ObjStr(Tcl_GetObjResult(interp)); if (strncmp(body, "::xotcl::initProcNS\n",20) == 0) body += 20; Tcl_SetObjResult(interp, Tcl_NewStringObj(body, -1)); } return result; } /* * Obtain the names of the tcl commands * not available through the stub interface and overload some global commands */ int XOTclShadowTclCommands(Tcl_Interp *interp, XOTclShadowOperations load) { int rc = TCL_OK; if (load == SHADOW_LOAD) { int initialized = (RUNTIME_STATE(interp)->tclCommands != NULL); assert(initialized == 0); RUNTIME_STATE(interp)->tclCommands = NEW_ARRAY(XOTclShadowTclCommandInfo, XOTE_SUBST - XOTE_EXPR + 1); /*fprintf(stderr, "+++ load tcl commands %d %d\n", load, initialized);*/ #ifdef USE_TCL_STUBS /* no commands are overloaded, these are only used for calling e.g. Tcl_ExprObjCmd(), Tcl_IncrObjCmd() and Tcl_SubstObjCmd(), which are not avalailable in through the stub table */ rc|= XOTclReplaceCommand(interp, XOTE_EXPR, 0, initialized); rc|= XOTclReplaceCommand(interp, XOTE_SUBST, 0, initialized); #endif /* for the following commands, we have to add our own semantics */ #if 1 rc|= XOTclReplaceCommand(interp, XOTE_INFO, XOTcl_InfoObjCmd, initialized); #endif rc|= XOTclReplaceCommand(interp, XOTE_RENAME, XOTcl_RenameObjCmd, initialized); } else if (load == SHADOW_REFETCH) { XOTclReplaceCommandCheck(interp, XOTE_INFO, XOTcl_InfoObjCmd); XOTclReplaceCommandCheck(interp, XOTE_RENAME, XOTcl_RenameObjCmd); } else { XOTclReplaceCommandCleanup(interp, XOTE_INFO); XOTclReplaceCommandCleanup(interp, XOTE_RENAME); FREE(XOTclShadowTclCommandInfo*, RUNTIME_STATE(interp)->tclCommands); RUNTIME_STATE(interp)->tclCommands = NULL; } return rc; } /* * call a Tcl command with given objv's ... replace objv[0] * with the given command name */ int XOTclCallCommand(Tcl_Interp *interp, XOTclGlobalNames name, int objc, Tcl_Obj *CONST objv[]) { int result; XOTclShadowTclCommandInfo *ti = &RUNTIME_STATE(interp)->tclCommands[name-XOTE_EXPR]; ALLOC_ON_STACK(Tcl_Obj*,objc, ov); /* {int i; fprintf(stderr,"calling %s (%p %p) in %p, objc=%d ", XOTclGlobalStrings[name],ti,ti->proc, interp, objc); for(i=0;i 1) memcpy(ov+1, objv+1, sizeof(Tcl_Obj *)*(objc-1)); result = Tcl_NRCallObjProc(interp, ti->proc, ti->cd, objc, ov); FREE_ON_STACK(Tcl_Obj *, ov); return result; } ./xotcl-1.6.8/generic/._xotclStubInit.c000644 000765 000024 00000000430 12161600406 020421 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclStubInit.c000644 000765 000024 00000004037 12161600406 020213 0ustar00neumannstaff000000 000000 /* * xotclStubInit.c -- * * This file contains the initializers for the XOTcl stub vectors. * * Copyright (c) 1998-1999 by XXX * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include "xotclInt.h" /* * Remove macros that will interfere with the definitions below. */ /* * WARNING: The contents of this file is automatically generated by the * tools/genStubs.tcl script. Any modifications to the function declarations * below should be made in the generic/tcl.decls script. */ /* !BEGIN!: Do not edit below this line. */ XotclIntStubs xotclIntStubs = { TCL_STUB_MAGIC, NULL, }; static XotclStubHooks xotclStubHooks = { &xotclIntStubs }; XotclStubs xotclStubs = { TCL_STUB_MAGIC, &xotclStubHooks, Xotcl_Init, /* 0 */ NULL, /* 1 */ XOTclIsClass, /* 2 */ NULL, /* 3 */ XOTclGetObject, /* 4 */ XOTclGetClass, /* 5 */ XOTclCreateObject, /* 6 */ NULL, /* 7 */ XOTclCreateClass, /* 8 */ XOTclDeleteObject, /* 9 */ XOTclDeleteClass, /* 10 */ XOTclAddPMethod, /* 11 */ XOTclAddIMethod, /* 12 */ XOTclRemovePMethod, /* 13 */ XOTclRemoveIMethod, /* 14 */ XOTclOSetInstVar, /* 15 */ XOTclOGetInstVar, /* 16 */ XOTclInstVar, /* 17 */ NULL, /* 18 */ XOTclOSetInstVar2, /* 19 */ XOTclOGetInstVar2, /* 20 */ XOTclUnsetInstVar2, /* 21 */ XOTcl_TraceObjCmd, /* 22 */ XOTclErrMsg, /* 23 */ XOTclVarErrMsg, /* 24 */ XOTclErrInProc, /* 25 */ XOTclObjErrArgCnt, /* 26 */ XOTclErrBadVal_, /* 27 */ XOTclObjErrType, /* 28 */ XOTclStackDump, /* 29 */ XOTclCallStackDump, /* 30 */ XOTclDeprecatedMsg, /* 31 */ XOTclSetObjClientData, /* 32 */ XOTclGetObjClientData, /* 33 */ XOTclSetClassClientData, /* 34 */ XOTclGetClassClientData, /* 35 */ XOTclRequireObjNamespace, /* 36 */ XOTclErrBadVal, /* 37 */ XOTclNextObjCmd, /* 38 */ XOTclCallMethodWithArgs, /* 39 */ }; /* !END!: Do not edit above this line. */ ./xotcl-1.6.8/generic/._xotclStubLib.c000644 000765 000024 00000000430 12327000077 020226 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclStubLib.c000644 000765 000024 00000004204 12327000077 020014 0ustar00neumannstaff000000 000000 /* * xotclStubLib.c -- * * Stub object that will be statically linked into extensions of XOTcl * * Copyright (c) 1998 Paul Duffin. * Copyright (C) 1999-2007 Uwe Zdun * Copyright (C) 1999-2014 Gustaf Neumann * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ /* * We need to ensure that we use the stub macros so that this file contains * no references to any of the stub functions. This will make it possible * to build an extension that references Tcl_InitStubs but doesn't end up * including the rest of the stub functions. */ #ifndef USE_TCL_STUBS #define USE_TCL_STUBS #endif #undef USE_TCL_STUB_PROCS /* * This ensures that the Xotcl_InitStubs has a prototype in * xotcl.h and is not the macro that turns it into Tcl_PkgRequire */ #ifndef USE_XOTCL_STUBS #define USE_XOTCL_STUBS #endif #include "xotclInt.h" XotclStubs *xotclStubsPtr = NULL; XotclIntStubs *xotclIntStubsPtr = NULL; /* *---------------------------------------------------------------------- * * Xotcl_InitStubs -- * * Tries to initialise the stub table pointers and ensures that * the correct version of XOTcl is loaded. * * Results: * The actual version of XOTcl that satisfies the request, or * NULL to indicate that an error occurred. * * Side effects: * Sets the stub table pointers. * *---------------------------------------------------------------------- */ CONST char * Xotcl_InitStubs (interp, version, exact) Tcl_Interp *interp; CONST char *version; int exact; { CONST char *actualVersion; actualVersion = Tcl_PkgRequireEx(interp, "XOTcl", version, exact, (ClientData *) &xotclStubsPtr); if (actualVersion == NULL) { xotclStubsPtr = NULL; return NULL; } if (xotclStubsPtr == NULL) { return NULL; } if (xotclStubsPtr->hooks) { xotclIntStubsPtr = xotclStubsPtr->hooks->xotclIntStubs; } else { xotclIntStubsPtr = NULL; } return actualVersion; } ./xotcl-1.6.8/generic/._xotclTrace.c000644 000765 000024 00000000430 12326777674 017747 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclTrace.c000644 000765 000024 00000014141 12326777674 017536 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * xotclTrace.c -- * * Tracing facilities for XOTcl * */ #include "xotclInt.h" #include "xotclAccessInt.h" void XOTclStackDump(Tcl_Interp *interp) { Interp *iPtr = (Interp *)interp; CallFrame *f = iPtr->framePtr, *v = iPtr->varFramePtr; Tcl_Obj *varCmdObj; XOTclNewObj(varCmdObj); fprintf (stderr, " TCL STACK:\n"); if (f == 0) fprintf(stderr, "- "); while (f) { Tcl_Obj *cmdObj; XOTclNewObj(cmdObj); fprintf(stderr, "\tFrame=%p ", f); if (f->isProcCallFrame && f->procPtr && f->procPtr->cmdPtr) { fprintf(stderr,"caller %p ",Tcl_CallFrame_callerPtr(f)); fprintf(stderr,"callerV %p ",Tcl_CallFrame_callerVarPtr(f)); Tcl_GetCommandFullName(interp, (Tcl_Command) f->procPtr->cmdPtr, cmdObj); fprintf(stderr, "%s (%p) lvl=%d\n", ObjStr(cmdObj), f->procPtr->cmdPtr, f->level); DECR_REF_COUNT(cmdObj); } else fprintf(stderr, "- \n"); f = f->callerPtr; } fprintf (stderr, " VARFRAME:\n"); fprintf(stderr, "\tFrame=%p", v); if (v) {fprintf(stderr, "caller %p", v->callerPtr);} if (v && v->isProcCallFrame && v->procPtr && v->procPtr->cmdPtr) { Tcl_GetCommandFullName(interp, (Tcl_Command) v->procPtr->cmdPtr, varCmdObj); if (varCmdObj) { fprintf(stderr, " %s (%d)\n", ObjStr(varCmdObj), v->level); } } else fprintf(stderr, "- \n"); DECR_REF_COUNT(varCmdObj); } void XOTclCallStackDump(Tcl_Interp *interp) { XOTclCallStack *cs = &RUNTIME_STATE(interp)->cs; XOTclCallStackContent *csc; int i=1, entries = cs->top - cs->content; fprintf (stderr, " XOTCL CALLSTACK: (%d entries, top: %p) \n", entries, cs->top); for (csc = &cs->content[1]; csc <= cs->top; csc++) { fprintf(stderr, " %d: %p ",i++,csc); if (csc->self) fprintf(stderr, "OBJ %s (%p), ", ObjStr(csc->self->cmdName), csc->self); if (csc->cl) fprintf(stderr, "INSTPROC %s->", className(csc->cl)); else fprintf(stderr, "PROC "); /*fprintf(stderr, " cmd %p, obj %p, ",csc->cmdPtr, csc->self);*/ if (csc->cmdPtr && !csc->destroyedCmd) fprintf(stderr, "%s (%p), ", Tcl_GetCommandName(interp, (Tcl_Command)csc->cmdPtr), csc->cmdPtr); else fprintf(stderr, "NULL, "); fprintf(stderr, "frameType: %d, ", csc->frameType); fprintf(stderr, "callType: %d ", csc->callType); fprintf(stderr, "cframe %p ", csc->currentFramePtr); if (csc->currentFramePtr) fprintf(stderr,"l=%d ",Tcl_CallFrame_level(csc->currentFramePtr)); if (csc->destroyedCmd) fprintf(stderr, "--destroyed cmd set (%p) ", csc->destroyedCmd); fprintf(stderr, "\n"); } /* if (entries > 0) { XOTclCallStackContent *c; c = XOTclCallStackFindLastInvocation(interp); fprintf(stderr," --- findLastInvocation %p ",c); if (c) { if (c <= cs->top && c->currentFramePtr) fprintf(stderr," l=%d", Tcl_CallFrame_level(c->currentFramePtr)); } c = XOTclCallStackFindActiveFrame(interp, 1); fprintf(stderr," findActiveFrame %p ",c); if (c) { if (c <= cs->top && c->currentFramePtr) fprintf(stderr," l=%d", Tcl_CallFrame_level(c->currentFramePtr)); } fprintf(stderr," --- \n"); } */ } /* helper function to print the vars dynamically created on a callframe static void printLocalTable (CallFrame *c) { Tcl_HashEntry *entryPtr; Tcl_HashTable *localVarTablePtr = c->varTablePtr; Tcl_HashSearch search; fprintf(stderr, "LocalVars:"); if (localVarTablePtr != NULL) { for (entryPtr = Tcl_FirstHashEntry(localVarTablePtr, &search); entryPtr != NULL; entryPtr = Tcl_NextHashEntry(&search)) { char *varName = Tcl_GetHashKey(localVarTablePtr, entryPtr); fprintf(stderr, " %s,", varName); } } fprintf(stderr,"\n"); } */ int XOTcl_TraceObjCmd(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { char *option; if (objc != 2) return XOTclObjErrArgCnt(interp, NULL, "::xotcl::trace"); option = ObjStr(objv[1]); if (strcmp(option,"stack") == 0) { XOTclStackDump(interp); return TCL_OK; } if (strcmp(option,"callstack") == 0) { XOTclCallStackDump(interp); return TCL_OK; } return XOTclVarErrMsg(interp, "xotcltrace: unknown option", (char*) NULL); } #ifdef XOTCL_MEM_COUNT void XOTclMemCountAlloc(char *id, void *p) { int new; XOTclMemCounter *entry; Tcl_HashTable *table = &xotclMemCount; Tcl_HashEntry *hPtr; hPtr = Tcl_CreateHashEntry(table, id, &new); #ifdef XOTCL_MEM_TRACE fprintf(stderr, "+++ alloc %s %p\n",id,p); #endif /*fprintf(stderr,"+++alloc '%s'\n",id);*/ if (new) { entry = (XOTclMemCounter*)ckalloc(sizeof(XOTclMemCounter)); entry->count = 1; entry->peak = 1; Tcl_SetHashValue(hPtr, entry); } else { entry = (XOTclMemCounter*) Tcl_GetHashValue(hPtr); entry->count++; if (entry->count > entry->peak) entry->peak = entry->count; } } void XOTclMemCountFree(char *id, void *p) { XOTclMemCounter *entry; Tcl_HashTable *table = &xotclMemCount; Tcl_HashEntry *hPtr; #ifdef XOTCL_MEM_TRACE fprintf(stderr, "+++ free %s %p\n",id,p); #endif hPtr = Tcl_FindHashEntry(table, id); if (!hPtr) { fprintf(stderr, "******** MEM COUNT ALERT: Trying to free <%s>, but was not allocated\n", id); return; } entry = (XOTclMemCounter*) Tcl_GetHashValue(hPtr); entry->count--; } void XOTclMemCountDump() { Tcl_HashTable *table = &xotclMemCount; Tcl_HashSearch search; Tcl_HashEntry *hPtr; int count = 0; xotclMemCountInterpCounter--; if (xotclMemCountInterpCounter != 0) { return; } fprintf(stderr, "******** XOTcl MEM Count *********\n* count peak\n"); for (hPtr = Tcl_FirstHashEntry(table, &search); hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) { char *id = Tcl_GetHashKey(table, hPtr); XOTclMemCounter *entry = (XOTclMemCounter*) Tcl_GetHashValue(hPtr); count += entry->count; fprintf(stderr, "* %4d %6d %s\n", entry->count, entry->peak, id); ckfree ((char*) entry); } Tcl_DeleteHashTable(table); fprintf(stderr, "******** Count Overall = %d\n", count); } #endif ./xotcl-1.6.8/generic/._xotclUtil.c000644 000765 000024 00000000430 12326777674 017626 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/generic/xotclUtil.c000644 000765 000024 00000005437 12326777674 017425 0ustar00neumannstaff000000 000000 /* * Extended Object Tcl (XOTcl) * * Copyright (C) 1999-2014 Gustaf Neumann * Copyright (C) 1999-2007 Uwe Zdun * * xotclUtil.c -- * * Utility functions * */ #include "xotclInt.h" char * XOTcl_ltoa(char *buf, long i, int *len) /* fast version of sprintf(buf,"%ld",l); */ { int nr_written, negative; char tmp[LONG_AS_STRING], *pointer = &tmp[1], *string, *p; *tmp = 0; if (i<0) { i = -i; negative = nr_written = 1; } else nr_written = negative = 0; do { nr_written++; *pointer++ = i%10 + '0'; i/=10; } while (i); p = string = buf; if (negative) *p++ = '-'; while ((*p++ = *--pointer)); /* copy number (reversed) from tmp to buf */ if (len) *len = nr_written; return string; } static char *alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; static int blockIncrement = 8; /* static char *alphabet = "ab"; static int blockIncrement = 2; */ static unsigned char chartable[255] = {0}; char * XOTclStringIncr(XOTclStringIncrStruct *iss) { char newch, *currentChar; currentChar = iss->buffer + iss->bufSize - 2; newch = *(alphabet + chartable[(unsigned)*currentChar]); while (1) { if (newch) { /* no overflow */ *currentChar = newch; break; } else { /* overflow */ *currentChar = *alphabet; /* use first char from alphabet */ currentChar--; assert(currentChar >= iss->buffer); newch = *(alphabet + chartable[(unsigned)*currentChar]); if (currentChar < iss->start) { iss->length++; if (currentChar == iss->buffer) { size_t newBufSize = iss->bufSize + blockIncrement; char *newBuffer = ckalloc(newBufSize); currentChar = newBuffer+blockIncrement; /*memset(newBuffer, 0, blockIncrement);*/ memcpy(currentChar, iss->buffer, iss->bufSize); *currentChar = newch; iss->start = currentChar; ckfree(iss->buffer); iss->buffer = newBuffer; iss->bufSize = newBufSize; } else { iss->start = currentChar; } } } } assert(iss->buffer[iss->bufSize-1] == 0); assert(iss->buffer[iss->bufSize-2] != 0); assert(iss->length < iss->bufSize); assert(iss->start + iss->length + 1 == iss->buffer + iss->bufSize); return iss->start; } void XOTclStringIncrInit(XOTclStringIncrStruct *iss) { char *p; int i = 0; const size_t bufSize = blockIncrement>2 ? blockIncrement : 2; for (p=alphabet; *p; p++) { chartable[(int)*p] = ++i; } iss->buffer = ckalloc(bufSize); memset(iss->buffer, 0, bufSize); iss->start = iss->buffer + bufSize-2; iss->bufSize = bufSize; iss->length = 1; /* for (i=1; i<50; i++) { XOTclStringIncr(iss); fprintf(stderr, "string '%s' (%d)\n", iss->start, iss->length); } */ } void XOTclStringIncrFree(XOTclStringIncrStruct *iss) { ckfree(iss->buffer); } ./xotcl-1.6.8/library/actiweb/._Agent.xotcl000644 000765 000024 00000000430 12161611632 021224 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/Agent.xotcl000644 000765 000024 00000014524 12161611632 021020 0ustar00neumannstaff000000 000000 # $Id: Agent.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $ package provide xotcl::actiweb::agent 1.0 package require -exact xotcl::trace 1.0 package require -exact xotcl::comm::httpAccess 1.0 package require -exact xotcl::actiweb::webObject 1.0 package require -exact xotcl::store::persistence 1.0 package require XOTcl 1 # # current response codes for agent requests: # # OK -- content arrived (can be retrieved with sinks content method) # ERROR -- error on the place invocation # FAILED -- call itself failed, e.g. cancel # namespace eval ::xotcl::actiweb::agent { namespace import ::xotcl::* Class AgentMemSink \ -superclass MemorySink \ -parameter {{agent ""} responseCode} AgentMemSink instproc startCb {r} { my set d "" next } AgentMemSink instproc notifyCb {r} {next} AgentMemSink instproc incCb {r t c} {next} AgentMemSink instproc endCb {r} { if {[Agent exists responseCodes([$r set responseCode])]} { my set responseCode OK } else { my set responseCode ERROR } next } AgentMemSink instproc cancelCb {r} { my set responseCode FAILED next } AgentMemSink instproc endReq {r} { my instvar agent if {[Object isobject $agent]} { if {[$agent exists sinks($r)]} { $agent unset sinks($r) } } } # sink class that calls the agent's endcmd in async calls # the sink is destroyed automatically after endCmd is called Class AgentAsyncSink -superclass AgentMemSink AgentAsyncSink instproc endCb {r} { next my instvar endCmd responseCode set result [my content] if {[info exists endCmd]} { eval [concat $endCmd $responseCode \"$result\"] } my endReq $r } AgentAsyncSink instproc cancelCb {r} { my instvar endCmd responseCode if {[info exists endCmd]} { eval [concat $endCmd $responseCode ""] } next my endReq $r } # sink type for sync request # has to be destroyed with endReq when content is # read (see createSyncRequest) Class AgentSyncSink -superclass AgentMemSink Class Agent -superclass WebObject Agent array set responseCodes { 200 {OK} } Agent instproc init args { #my showCall #my exportProcs invoke my array set endCmds {} my array set sinks {} next } # # method to create async requests # # endCmd specifies the command (or object method or proc ...) that # is to be called, when the request has ended, empty for sync requests # # args are to be given in the form -name value, like: # -contentType text/xml # -method PUT # -data XXX # # returns the request object name # Agent instproc createRequest {endCmd url args} { #my showCall puts stderr "[self] [self proc]" my instvar place set s [AgentAsyncSink create [$place autoname agentmemsink] \ -agent [self]] set cmd [list Access createRequest -caching 0 -url $url \ -informObject $s] foreach {n v} $args {lappend cmd $n $v} $s set endCmd $endCmd set t ::[string trimleft [::eval $cmd $args] :] my set sinks($t) $s return $t } # # method to create sync reqs ... url and args identical to # async req # # returns the result of sync request, if "OK" # otherwise: Raises an error # Agent instproc createSyncRequest {url args} { #my showCall puts stderr "[self] [self proc]" my instvar place set s [AgentSyncSink [$place autoname agentmemsink] -agent [self]] set cmd [list Access createRequest \ -httpVersion 1.0 \ -caching 0 -url $url -informObject $s -blocking 1] foreach {n v} $args {lappend cmd $n $v} set t ::[string trimleft [::eval $cmd] :] #puts stderr "After SyncRequest t=$t [$s responseCode]" if {[$s responseCode] eq "OK"} { set content [$s content] # kill the sink $s endReq $t return $content } $s endReq $t error "[self] -- Sync request failed: url=$url, responseCode=[$s responseCode]" } # # invoke a remote method directly along the places' dispatcher # Agent instproc invoke {endCmd host receiver args} { puts stderr [self proc]----host=$host #my showCall set url http://$host/${receiver}+[url encode $args] my createRequest $endCmd $url } Agent instproc syncInvoke {host receiver args} { puts stderr [self proc]----host=$host #[self] showCall set url http://$host/${receiver}+[url encode $args] my createSyncRequest $url } # # invoke a cloning migration # Agent instproc cloneImpl {async host startcmd {endCmd ""}} { #my showCall set ai [my agentInfo] set place [Place getInstance] # get the full name of the agent ns from the places's agent mgr #set ns [${place}::agentMgr::rdfNS searchPrefix agent] $ai set agentData(script) [${place}::scriptCreator makeScript [self]] $ai append agentData(script) [my makeVarScript] $ai set agentData(startcmd) $startcmd set data [$ai getXMLScript [$ai name]] ###puts $data #set data [[Place getInstance]::rdfCreator createFromTriples [$ai getTriples]] if {$async} { return [my createRequest $endCmd http://$host/[my selfName] \ -contentType text/xml \ -method PUT \ -data $data] } else { return [my createSyncRequest http://$host/[my selfName] \ -contentType text/xml \ -method PUT \ -data $data] } } Agent instproc clone {host startCmd endCmd} { my cloneImpl 1 $host $startCmd $endCmd } Agent instproc syncClone {host startCmd} { my cloneImpl 0 $host $startCmd } # # invoke a migration that destroys the object in the current place # Agent instproc migrateImpl {async host startcmd {endCmd ""}} { ### GN ??? puts stderr "--- async=$async" if {$async} { set r [my clone $host $startcmd $endCmd] } else { set r [my syncClone $host $startcmd] } puts stderr "--- [self] destroy +++ " my destroy ;### FIXME: this does not work in the asynchronous case return $r } Agent instproc migrate {host startCmd endCmd} { #my migrateImpl 1 $host $startCmd $endCmd my migrateImpl 0 $host $startCmd $endCmd } Agent instproc syncMigrate {host startCmd} { my migrateImpl 0 $host $startCmd } # # query a place with its hostname for its name # Agent instproc getPlaceFromHostName {endCb host} { set r [my autoname __result] my createRequest "[self]::$r set" http://$host/ return [set [self]::$r] } namespace export AgentMemSink AgentAsyncSink AgentSyncSink Agent } namespace import ::xotcl::actiweb::agent::* ./xotcl-1.6.8/library/actiweb/._AgentManagement.xotcl000644 000765 000024 00000000430 12161604756 023232 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/AgentManagement.xotcl000644 000765 000024 00000013026 12161604756 023022 0ustar00neumannstaff000000 000000 # $Id: AgentManagement.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $ package provide xotcl::actiweb::agentManagement 1.0 package require -exact xotcl::rdf::parser 1.0 package require -exact xotcl::rdf::triple 1.0 package require -exact xotcl::actiweb::agent 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::agentManagement { namespace import ::xotcl::* Class AgentInfo -parameter { {name ""} {changed 1} } AgentInfo instproc init args { next # # array providing info on a (migrated) agent # my array set agentData {} RDFTripleDB [self]::db my trace variable agentData w [list [self] changeOccured] my trace variable name w [list [self] changeOccured] } AgentInfo instproc getXMLScript {name} { #my showCall set s { } set s [subst -nobackslashes $s] foreach n [my array name agentData] { append s " [my set agentData($n)] " } append s " " } AgentInfo instproc changeOccured args {my set changed 1} AgentInfo instproc getTriples {} { #my showCall if {[my set changed]} { # build up the triple-db [self]::db reset set place [Place getInstance] set subject "http://[$place set host]:[$place set port]/[my name]" foreach n [my array names agentData] { [self]::db add $n $subject [my set agentData($n)] } } return [[self]::db getTriples] } AgentInfo instproc print {} { puts "AGENT-INFO:" puts "Name == [my set name]" foreach a [my array names agentData] { puts "$a == [my set agentData($a)]" } } Class AgentVisitor -superclass NodeTreeVisitor -parameter { {openProperty ""} {agentInfo ""} {rdfNS {[my info parent]::rdfNS}} } AgentVisitor instproc fullName {obj n} { set ns [$obj resolveNS] return [$ns getFullName $n] } AgentVisitor instproc visit {objName} { #puts stderr "AgentVisitor visit -- $objName" set ai [my set agentInfo] set cl [$objName info class] #puts stderr "AgentVisitor visit -- $objName cl=$cl <[$ai name]>" if {[$ai name] eq ""} { #### not fixed yet puts stderr "my fixme (AgentManagement)" if {$cl eq "::About" && [string first "::Description" [[$objName info parent] info class]] == 0} { $ai name [$objName set content] } } else { #puts stderr C=<[$objName content]> #$cl showVars switch -exact $cl { ::RDFProperty { set c [$objName content] #$objName showVars if {[$objName exists pcdata]} { $ai set agentData($c) [lindex [$objName getPCdataList] 0] } else { #puts stderr "empty PCDATA" } } } } } AgentVisitor instproc interpretNodeTree node { if {[my set agentInfo] eq "" } { error "Agent Visitor: no agent info provided." } $node accept [self] } Class AgentMgr -superclass Agent \ -parameter { {acceptedData [list script startcmd senderPlace senderPort senderHost]} } AgentMgr instproc init args { next my array set agents {} # # this ns class holds the prefix/Rdf-ns pairs used by this # agent mgr (with default values) # XMLNamespace [self]::rdfNS [self]::rdfNS add agent {http://www.xotcl.org/schema/agent#} [self]::rdfNS add service {http://www.xotcl.org/schema/service#} [self]::rdfNS add xotcl {http://www.xotcl.org/schema/xotcl#} RDFParser [self]::rdfParser AgentVisitor [self]::agentVisitor #package require xotcl::xml::printVisitor #PrintVisitor [self]::pv } AgentMgr instproc register {name} { set ai [AgentInfo [self]::[my autoname agentInfo]] my set agents($name) $ai $ai name $name return $ai } AgentMgr instproc deregister {name} { if {[my info agents $name]} { # destroy the agents info objects #my showMsg "calling destroy on [my set agents($name)]" [my set agents($name)] destroy # unset the var my unset agents($name) } } AgentMgr instproc info args { if {[lindex $args 0] eq "agents"} { if {[llength $args] > 1} { return [my exists agents([lindex $args 1])] } else { return [my array names agents] } } next } # # parses the data of a migration request into a new agent # info object # # name must be stringleft : !! AgentMgr instproc parseData {name data} { set ai [my register $name] next [self]::rdfParser reset [self]::rdfParser parse $data #puts stderr =========================================================== #[self]::pv interpretAll [self]::rdfParser #puts stderr =========================================================== [self]::agentVisitor agentInfo $ai #foreach tn [[self]::rdfParser info children topNode*] { # [self]::agentVisitor interpretNodeTree $tn #} [self]::agentVisitor interpretAll [self]::rdfParser #puts "************** Received Agent:" #$ai print return $ai } AgentMgr instproc immigrate {AI} { #set ns [[self]::rdfNS searchPrefix agent] #::eval [$AI set agentData(${ns}script)] #puts stderr "immigrate call showVars" #$AI showVars #puts stderr "immigrate showVars done" ::eval [$AI set agentData(agent:script)] #puts stderr "immigrate persistentVars = '[[$AI name] persistentVars]'" #foreach v [[$AI name] info vars] { $n persistent $v } if {[$AI exists agentData(agent:startcmd)]} { ::after 10 [list [$AI name] [$AI set agentData(agent:startcmd)]] } return "" } namespace export AgentInfo AgentVisitor AgentMgr } namespace import ::xotcl::actiweb::agentManagement::* ./xotcl-1.6.8/library/actiweb/._cacert.pem000644 000765 000024 00000000430 12161600406 021054 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/cacert.pem000644 000765 000024 00000002207 12161600406 020643 0ustar00neumannstaff000000 000000 -----BEGIN CERTIFICATE----- MIIDKjCCApOgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBwDELMAkGA1UEBhMCQVQx DzANBgNVBAgTBlZpZW5uYTEPMA0GA1UEBxMGVmllbm5hMR0wGwYDVQQKExRNeSBU ZXN0IE9yZ2FuaXphdGlvbjETMBEGA1UECxMKTXkgRGVtbyBDQTErMCkGA1UEAxMi TXkgRGVtbyBDQSBhdCBNeSBUZXN0IE9yZ2FuaXphdGlvbjEuMCwGCSqGSIb3DQEJ ARYfa2xhdXMua29sb3dyYXRuaWtAd3Utd2llbi5hYy5hdDAeFw0wMzA5MDUxMTEw MDFaFw0xMzA5MDIxMTEwMDFaMIHAMQswCQYDVQQGEwJBVDEPMA0GA1UECBMGVmll bm5hMQ8wDQYDVQQHEwZWaWVubmExHTAbBgNVBAoTFE15IFRlc3QgT3JnYW5pemF0 aW9uMRMwEQYDVQQLEwpNeSBEZW1vIENBMSswKQYDVQQDEyJNeSBEZW1vIENBIGF0 IE15IFRlc3QgT3JnYW5pemF0aW9uMS4wLAYJKoZIhvcNAQkBFh9rbGF1cy5rb2xv d3JhdG5pa0B3dS13aWVuLmFjLmF0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB gQDIKhCgkG/rSDc8NjDGtJBKW1+fQsoPoBSnMeWOjRQ0YiYomHLZo2XHxsfHsDHj xXE69GkY9SuwYX/UiF7C0H5LhVew5GTACZsZTbqUWR3D0+R4RQTNJRhQzHq4HE0o cWjKRiQWWMqNE6S/M4Eri4SJyoaXzhkXjkboYTf/+Dks1wIDAQABozIwMDAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBT5lsU8wZ72pP5lB5ezzqxi5mk4KTANBgkq hkiG9w0BAQQFAAOBgQA8pZPqoSDBduMtKzNP5A6TerIc7Whm/mwBmiMq0sRHFPWe sCHJkBxF+ryJT6WDsm1RuCdueHgoppnJ6epdqxmtOAcNcn+OQDU5lzSATBu60B5m bH4zRsxwn4L9ts+Q1IbjWXc0P1G+2oQSNfvduS7esrs1RM64h6gUJErzxU5cfg== -----END CERTIFICATE----- ./xotcl-1.6.8/library/actiweb/._COPYRIGHT000644 000765 000024 00000000430 12327000547 020407 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/COPYRIGHT000644 000765 000024 00000003401 12327000547 020173 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/actiweb/._HtmlPlace.xotcl000644 000765 000024 00000000430 12161604471 022042 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/HtmlPlace.xotcl000644 000765 000024 00000002516 12161604471 021634 0ustar00neumannstaff000000 000000 package provide xotcl::actiweb::htmlPlace 1.0 package require -exact xotcl::trace 1.0 package require -exact xotcl::actiweb::httpPlace 1.0 package require -exact xotcl::store::persistence 1.0 package require -exact xotcl::actiweb::agent 1.0 package require -exact xotcl::actiweb::pageTemplate 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::htmlPlace { namespace import ::xotcl::* Class HtmlPlace -superclass Place -parameter {allowExit} HtmlPlace instproc init args { next # # just define a minimal object that can react # with HTML decoration, if the called object # doesn't exist PageTemplateHtml create [self]::start.html my startingObj [self]::start.html if {[my exists allowExit]} { set exitObj [WebObject create [self]::[my set allowExit]] [Place getInstance] exportObjs $exitObj $exitObj proc default {} {after 500 ::exit; return "Server terminates"} } } HtmlPlace instproc default {} { set place [string trimleft [self] :] set msg "Place $place

Place $place

Try one of the following links:
    " foreach o [my exportedObjs] { set o [string trimleft $o :] append msg "
  • $o
  • " } append msg "
\n" } namespace export HtmlPlace } namespace import ::xotcl::actiweb::htmlPlace::* ./xotcl-1.6.8/library/actiweb/._HttpPlace.xotcl000644 000765 000024 00000000430 12326515672 022064 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/HttpPlace.xotcl000644 000765 000024 00000017671 12326515672 021666 0ustar00neumannstaff000000 000000 # -*- Tcl -*- package provide xotcl::actiweb::httpPlace 1.0 package require -exact xotcl::trace 1.0 package require -exact xotcl::actiweb::invoker 1.0 package require -exact xotcl::actiweb::webObject 1.0 package require -exact xotcl::comm::httpd 1.1 package require -exact xotcl::scriptCreation::scriptCreator 1.0 package require -exact xotcl::store::persistence 1.0 package require -exact xotcl::pattern::singleton 1.0 package require -exact xotcl::registry::registry 1.0 package require -exact xotcl::actiweb::agentManagement 1.0 package require -exact xotcl::rdf::tripleRecreator 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::httpPlace { namespace import ::xotcl::* Singleton Place -superclass Invoker -parameter { {exportedObjs ""} {startingObj ""} {startCommand ""} {root $::env(HOME)/public_html} {port 8086} {redirect [list]} {logdir $::xotcl::logdir} {host localhost} {allowImmigrationHosts ""} persistenceFile persistenceDir bccFile bccDir dbPackage {startHTTPServer 1} } # Giving a bccFile (and possibly bccDir) as optional parameter means # that an identical copy database will be created in that # location (e.g. for creating a backup on a second hard drive. Place instproc exportObjs args { foreach obj $args { my lappend exportedObjs [string trimleft $obj :] puts stderr "*** exporting $obj, self=[self], objs=[my set exportedObjs]" } } Place instproc isExportedObj obj { expr {[lsearch [my exportedObjs] [string trimleft $obj :]] != -1} } Place instproc default {} { [self] } Place instproc init args { if {[my set startHTTPServer]} { Httpd [self]::httpd \ -port [my port] \ -root [my root] \ -redirect [my redirect] \ -logdir [my logdir] \ -httpdWrk Place::HttpdWrk } # # PersistenceMgr object for web entities # ##### so ist das nicht toll ... init args sollten anders konfigurierbar sein PersistenceMgr [self]::agentPersistenceMgr -dbPackage multi if {[my exists dbPackage]} { set dbp [my set dbPackage] } else { set dbp "" } if {![my exists persistenceDir]} { my persistenceDir [string trimleft [self] :] } if {![my exists persistenceFile]} { my persistenceFile persistentObjs-[my port] } [self]::agentPersistenceMgr store add $dbp \ -dirName [my persistenceDir] \ -fileName [my persistenceFile] if {[my exists bccDir] || [my exists bccFile]} { if {![my exists bccDir]} { my bccDir [my set persistenceDir] } if {![my exists bccFile]} { my bccFile [my persistenceFile] } [self]::agentPersistenceMgr store add $dbp \ -dirName [my bccDir] \ -fileName [my bccFile] } AgentMgr create [self]::agentMgr RDFCreator create [self]::rdfCreator # # minimal obj for default behavior of the place -> calls go # to web entities default (customize through a redirecting proc # as in HtmlPlace or changing startingObj) # WebObject create [self]::start my startingObj [self]::start Registry [self]::registry ErrorMgr [self]::error ScriptCreator [self]::scriptCreator -dependencyChecking 0 my exportObjs [self]::start [self]::agentMgr [self]::registry next } Place instproc startEventLoop args { if {[llength $args] > 0} { set startCommand [lindex $args 0] ::eval $startCommand } vwait forever ;# if we are in xotclsh call the event loop... } ### ### Mixin-Classes for Http/Wrk that restricts the usable HTTP methods ### Class RestrictHTTPMethods -parameter { {allowedHTTPMethods "GET PUT HEAD POST CGI"} } RestrictHTTPMethods instproc init args { next my lappend workerMixins RestrictHTTPMethods::Wrk } Class RestrictHTTPMethods::Wrk RestrictHTTPMethods::Wrk instproc respond {} { my instvar method [my info parent] instvar allowedHTTPMethods if {[lsearch $allowedHTTPMethods $method] != -1} { return [next] } else { my log Error "Restricted Method $method called" my replyCode 405 my replyErrorMsg } } Class Place::HttpdWrk -superclass Httpd::Wrk Place::HttpdWrk instproc init args { my set place [Place getInstance] next #puts "New Http-Worker: [self class]->[self] on [my set place]" } Place::HttpdWrk instproc parseParams {o m a call} { upvar [self callinglevel] $o obj $m method $a args ### set decodedCall [url decodeItem $call] #my showMsg decodedCall=$decodedCall if {[regexp {^([^ ]*) ?([^ ]*) ?(.*)$} $decodedCall _ \ obj method args]} { #foreach a [my set formData] {lappend args [$a set content]} #puts stderr "Parsed -- Obj: $obj, Method: $method, Args: $args" return 1 } else { puts stderr "could not parse <$decodedCall>" return 0 } } Place::HttpdWrk instproc respond-HEAD {} { my respond-GET; ### sendMsg inhibits content for method HEAD } Place::HttpdWrk instproc respond-GET {} { my instvar fileName resourceName place if {$resourceName eq ""} { my sendMsg [$place default] text/html ;# kind of index.html } elseif {[my parseParams obj method arguments $resourceName]} { if {![my isobject $obj] && [file readable $fileName]} { next ;# let Httpd handle this } else { # # tell the object the query from the URL # $obj set query [my set query] # # If there are no arguments available through the # interface, pass the URL-query parameters (raw) # if {$arguments eq ""} {set arguments [my set query]} # # now invoke the method # set response [$place invokeCall obj status $method $arguments] #puts stderr "RESPONSE: $response" # # let the object's sending strategy mixin choose # the appropriate sending mode # # $obj showClass if {[info exists status] && $status >= 300} { my replyCode $status my replyErrorMsg $response } else { #my lappend replyHeaderFields Cache-Control maxage=0 my lappend replyHeaderFields Pragma no-cache $obj send [self] $response } } } else { my set version 1.0 my replyCode 400 my replyErrorMsg [my callError "Could not parse: " $resourceName] } } Place::HttpdWrk instproc respond-POST {} { my instvar resourceName place my respond-GET } Place::HttpdWrk instproc respond-PUT {} { my instvar resourceName place data #my showCall if {$resourceName ne ""} { if {[my parseParams obj m a $resourceName]} { set obj [string trimleft $obj :] set AMgr ${place}::agentMgr if {[info commands $obj] eq "" && ![$AMgr info agents $obj]} { #puts stderr "Receiving to put --------------------------------$obj $data" set AI [$AMgr parseData $obj $data] #puts stderr "parray --${AI}::agentData------------------------" #parray ${AI}::agentData #puts stderr "parray --${AI}::agentData----------------DONE--------" #$AI showVars #puts stderr "----[$AI exists agentData(agent:script)]----" if {[$AI exists agentData(agent:script)]} { set immigrateResult [$AMgr immigrate $AI] #puts stderr "immigrateResult=<$immigrateResult>" my replyCode 200 my sendMsg $immigrateResult text/plain } else { my set version 1.0 my replyCode 400 my replyErrorMsg "Migration failed" } } else { my set version 1.0 my replyCode 400 my replyErrorMsg "Migration: object name already in use." } } else { my set version 1.0 my replyCode 400 my replyErrorMsg "Migration call must provide object name" } } else { # return the own place name -> any client can call the place via # placename::start ! my sendMsg $place text/plain } } namespace export RestrictHTTPMethods Place namespace eval RestrictHTTPMethods { namespace export Wrk } namespace eval Place { namespace export HttpdWrk } } namespace import ::xotcl::actiweb::httpPlace::* namespace eval RestrictHTTPMethods { namespace import ::xotcl::actiweb::httpPlace::RestrictHTTPMethods::* } namespace eval Place { namespace import ::xotcl::actiweb::httpPlace::Place::* } ./xotcl-1.6.8/library/actiweb/._Invoker.xotcl000644 000765 000024 00000000430 12161605017 021603 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/Invoker.xotcl000644 000765 000024 00000010374 12161605017 021376 0ustar00neumannstaff000000 000000 # $Id: Invoker.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $ package provide xotcl::actiweb::invoker 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::invoker { namespace import ::xotcl::* Class AbstractInvoker AbstractInvoker abstract instproc invokeCall {o method arguments} AbstractInvoker abstract instproc eval {obj method arguments} # # error types are: tclError, invocationError # AbstractInvoker abstract instproc callError {type msg obj arguments} Class Invoker -superclass AbstractInvoker -parameter {{place [self]}} Invoker instproc handleException {response} { if {[my isExceptionObject $response]} { set exceptionObj $response switch [$exceptionObj info class] { ::RedirectException { set obj [$exceptionObj obj] set method [$exceptionObj method] set arguments [$exceptionObj arguments] set response [my eval $obj $method $arguments] } ::ErrorException { set response [$exceptionObj set errorText] } } $exceptionObj destroy } return $response } Invoker instproc invokeCall {o s method arguments} { upvar [self callinglevel] $o obj $s status my instvar place set response "" if {[$place isExportedObj $obj]} { # if method is not given -> call default on the object if {$method eq ""} { set method default } if {[$obj isExportedProc $method]} { #puts stderr "ExportedProcs of $obj: [$obj exportedProcs]" #puts stderr "Call: $obj -- $method -- $arguments" set response [my eval $obj $method $arguments] } else { #puts stderr "ExportedProcs of $obj: [$obj exportedProcs]" set response [my callError invocationError [$place startingObj] \ "Method not found or not exported" \ "$obj $method $arguments"] set status 405 } } else { set called $obj set obj [$place startingObj] set response [my callError invocationError $obj \ "Object '$called' unknown" ""] set status 404 } return [my handleException $response] } # # tests whether "name" is an exception object or not # Invoker instproc isExceptionObject name { if {[Object isobject $name] && [$name istype Exception]} { return 1 } return 0 } # # central eval -- all remote call # are invoked through this method # Invoker instproc eval {obj method arguments} { puts stderr "[clock format [clock seconds] \ -format %Y/%m/%d@%H:%M:%S] \ Eval Call: $obj $method $arguments" if {[catch { set r [::eval $obj $method $arguments] } ei]} { set r [my callError tclError $obj $ei "$obj $method $::errorInfo"] } return $r } Invoker instproc callError {type obj msg arguments} { [my set place]::error $type $obj $msg $arguments } Class ErrorMgr ErrorMgr instproc isHtml o { if {[my isobject $o]} { if {[$o exists contentType]} { if {[$o set contentType] eq "text/html"} { return 1 } } } return 0 } ErrorMgr instproc invocationError {obj msg arguments} { my showCall set ee [ErrorException [self]::[my autoname ee]] $ee instvar errorText if {[my isHtml $obj]} { set errorText "

invocation error: $msg" if {[llength $arguments] > 0} { append errorText ":\n

object: '[lindex $arguments 0]' \n" } else { append errorText \n } if {[llength $arguments] > 1} { append errorText "

call: '[lrange $arguments 1 end]' \n" } } else { set errorText "invocation error: $msg $arguments" } return $ee } ErrorMgr instproc tclError {obj msg arguments} { set ee [ErrorException [self]::[my autoname ee]] if {[my isHtml $obj]} { $ee errorText "

tcl error: '$msg' \n

$arguments
" } else { $ee errorText "tcl error: '$msg'\n$::errorInfo" } return $ee } # # exceptions in invocation behavior # Class Exception # # Execpetion that tells the invoker to redirect the call to # parameters # Class RedirectException -superclass Exception -parameter { {obj ""} {method ""} {arguments ""} } Class ErrorException -superclass Exception -parameter { {errorText ""} } namespace export AbstractInvoker \ Invoker ErrorMgr Exception \ RedirectException ErrorException } namespace import ::xotcl::actiweb::invoker::* ./xotcl-1.6.8/library/actiweb/._pageTemplate.xotcl000644 000765 000024 00000000430 12161606016 022576 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/pageTemplate.xotcl000644 000765 000024 00000004211 12161606016 022362 0ustar00neumannstaff000000 000000 package provide xotcl::actiweb::pageTemplate 1.0 package require xotcl::actiweb::webObject 1.0 package require xotcl::actiweb::invoker 1.0 package require xotcl::mixinStrategy 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::pageTemplate { namespace import ::xotcl::* Class PageTemplate -superclass WebObject PageTemplate instproc init args { next my mixinStrategy ::Send=TypedString } PageTemplate abstract instproc listExportedProcs args PageTemplate abstract instproc simplePage args Class PageTemplateHtml -superclass PageTemplate PageTemplateHtml instproc init args { my contentType text/html next } PageTemplateHtml instproc listExportedProcs args { # # place must be a Html place! # set place [HtmlPlace getInstance] set c " The following options are avaiable on $n: " foreach i [my exportedProcs] { set href [my selfAction "[self] $i"] set app {

$i } append c [subst -nobackslashes $app] } return [my simplePage $place [self] $c] } PageTemplateHtml instproc simplePage {title heading content {closing ""}} { set place [Place getInstance] set c { $title

$heading


$content

$closing


} return [subst -nobackslashes -nocommands $c] } # # builds a simple Form -- args are tupels of the form # {text, name, type, default, size} # # PageTemplateHtml instproc simpleForm {action args} { set action [my selfAction $action] set c {

} foreach {text name type def size} $args { append c " " } append c {
$text:
} return [subst -nobackslashes -nocommands $c] } namespace export PageTemplate PageTemplateHtml } namespace import ::xotcl::actiweb::pageTemplate::* ./xotcl-1.6.8/library/actiweb/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 021403 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/pkgIndex.tcl000644 000765 000024 00000003462 12327774260 021176 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::actiweb::agent 1.0 [list source [file join $dir Agent.xotcl]] package ifneeded xotcl::actiweb::agentManagement 1.0 [list source [file join $dir AgentManagement.xotcl]] package ifneeded xotcl::actiweb::htmlPlace 1.0 [list source [file join $dir HtmlPlace.xotcl]] package ifneeded xotcl::actiweb::httpPlace 1.0 [list source [file join $dir HttpPlace.xotcl]] package ifneeded xotcl::actiweb::invoker 1.0 [list source [file join $dir Invoker.xotcl]] package ifneeded xotcl::actiweb::pageTemplate 1.0 [list source [file join $dir pageTemplate.xotcl]] package ifneeded xotcl::actiweb::placeAccessControl 1.0 [list source [file join $dir PlaceAccessControl.xotcl]] package ifneeded xotcl::actiweb::secureHtmlPlace 1.0 [list source [file join $dir SecureHtmlPlace.xotcl]] package ifneeded xotcl::actiweb::secureHttpPlace 1.0 [list source [file join $dir SecureHttpPlace.xotcl]] package ifneeded xotcl::actiweb::sendStrategy 1.0 [list source [file join $dir SendStrategy.xotcl]] package ifneeded xotcl::actiweb::userMgt 1.0 [list source [file join $dir UserMgt.xotcl]] package ifneeded xotcl::actiweb::webAgent 1.0 [list source [file join $dir WebAgent.xotcl]] package ifneeded xotcl::actiweb::webDocument 1.0 [list source [file join $dir WebDocument.xotcl]] package ifneeded xotcl::actiweb::webObject 1.0 [list source [file join $dir WebObject.xotcl]] ./xotcl-1.6.8/library/actiweb/._PlaceAccessControl.xotcl000644 000765 000024 00000000430 12161612131 023670 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/PlaceAccessControl.xotcl000644 000765 000024 00000004547 12161612131 023470 0ustar00neumannstaff000000 000000 package provide xotcl::actiweb::placeAccessControl 1.0 package require -exact xotcl::comm::httpd 1.1 package require -exact xotcl::actiweb::httpPlace 1.0 package require XOTcl 1 # # Simple Object Pwd Protection with BasicAccessControl # #Usage example: #ConferenceOrgPlace confPlace -port $placeport -root [pwd] \ # -mixin PlaceAccessControl # #confPlace protect conference.html [confData set password] # #confPlace setPasswd conference.html xxx namespace eval ::xotcl::actiweb::placeAccessControl { namespace import ::xotcl::* Class ObjectAccessControl -superclass BasicAccessControl ObjectAccessControl instproc protectedResource {fn method varAuthMethod varRealm} { # check whether access to $fn via $method is protected upvar [self callinglevel] $varAuthMethod authMethod $varRealm realm my instvar root # we check only the current directory, not the parent directories set call [url decodeItem $fn] regsub "^$root" $call "" call set call [string trimleft $call /] set call [string trimleft $call :] regexp {^([^ ]*)} $call _ call set call "$root/$call" foreach i [list $call $call:$method] { #puts stderr "check <$i>" if {[my exists protected($i)]} { set realm [my set protected($i)] set authMethod Basic return 1 } } return 0 } Class PlaceAccessControl PlaceAccessControl instproc init args { next [self]::httpd mixin add ObjectAccessControl [self]::httpd initWorkerMixins } PlaceAccessControl instproc protect {objName id pwd} { set objName [string trimleft $objName :] [self]::httpd protectDir $objName $objName {} if {$pwd ne ""} { my setPassword $objName $id $pwd } } PlaceAccessControl instproc credentialsNotOk {credentials authMethod realm} { #my instvar passwd #parray passwd next } PlaceAccessControl instproc setPassword {realm id pwd} { set httpd [self]::httpd if {[$httpd exists passwd($realm:$id)]} { $httpd unset passwd($realm:$id) $httpd set passwd($realm:$id) $pwd } else { $httpd addRealmEntry $realm "$id $pwd" } #$httpd set passwd($realm:admin) nimda } PlaceAccessControl instproc removeID {realm id} { set httpd [self]::httpd if {[$httpd exists passwd($realm:$id)]} { $httpd unset passwd($realm:$id) } } namespace export ObjectAccessControl PlaceAccessControl } namespace import ::xotcl::actiweb::placeAccessControl::* ./xotcl-1.6.8/library/actiweb/._SecureHtmlPlace.xotcl000644 000765 000024 00000000430 12161606124 023206 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/SecureHtmlPlace.xotcl000644 000765 000024 00000000766 12161606124 023005 0ustar00neumannstaff000000 000000 # $Id: SecureHtmlPlace.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ package provide xotcl::actiweb::secureHtmlPlace 1.0 package require -exact xotcl::actiweb::secureHttpPlace 1.0 package require -exact xotcl::actiweb::htmlPlace 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::secureHtmlPlace { namespace import ::xotcl::* Class SecureHtmlPlace -superclass {SecurePlace HtmlPlace} namespace export SecureHtmlPlace } namespace import ::xotcl::actiweb::secureHtmlPlace::* ./xotcl-1.6.8/library/actiweb/._SecureHttpPlace.xotcl000644 000765 000024 00000000430 12161612344 023222 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/SecureHttpPlace.xotcl000644 000765 000024 00000002311 12161612344 023005 0ustar00neumannstaff000000 000000 package provide xotcl::actiweb::secureHttpPlace 1.0 package require -exact xotcl::actiweb::httpPlace 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::secureHttpPlace { namespace import ::xotcl::* Class SecurePlace -superclass Place -parameter { {port 443} {requestCert 0} {requireValidCert 0} {certfile server.pem} {keyfile server.key} {cafile cacert.pem} {infoCb {}} } SecurePlace instproc startHttpd {} { my instvar port root requestCert requireValidCert \ certfile cafile infoCb keyfile Httpsd h1 -port $port \ -root $root \ -httpdWrk SecurePlace::HttpsdWrk \ -infoCb $infoCb \ -requestCert $requestCert \ -requireValidCert $requireValidCert \ -certfile $certfile -cafile $cafile \ -keyfile $keyfile } SecurePlace instproc init args { my set startHTTPServer 0 next [self] startHttpd } Class SecurePlace::HttpsdWrk -superclass {Httpsd::Wrk Place::HttpdWrk} namespace export SecurePlace namespace eval SecurePlace { namespace export HttpsdWrk } } namespace import ::xotcl::actiweb::secureHttpPlace::* namespace eval SecurePlace { namespace import ::xotcl::actiweb::secureHttpPlace::SecurePlace::* } ./xotcl-1.6.8/library/actiweb/._SendStrategy.xotcl000644 000765 000024 00000000430 12161606406 022605 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/SendStrategy.xotcl000644 000765 000024 00000002337 12161606406 022400 0ustar00neumannstaff000000 000000 package provide xotcl::actiweb::sendStrategy 1.0 package require XOTcl 1 # # some simple sending strategy classes -- to be used as mixins # for web objects # namespace eval ::xotcl::actiweb::sendStrategy { namespace import ::xotcl::* Class SendStrategy SendStrategy abstract instproc send {httpWrk string} # # send the response given from the place as plain text # Class Send=PlainString -superclass SendStrategy Send=PlainString instproc send {httpWrk string} { $httpWrk sendMsg $string text/plain } # # send the response given from the place with content # type of the obj, if it exists # Class Send=TypedString -superclass SendStrategy Send=TypedString instproc send {httpWrk string} { $httpWrk sendMsg $string [my set contentType] } # # send file specified in obj's instvar filename # Class Send=File -superclass SendStrategy Send=File instproc send {httpWrk {response ""}} { if {[my exists contentType]} { $httpWrk sendFile [my set filename] [my set contentType] } else { $httpWrk sendFile [my set filename] "" } } namespace export \ SendStrategy Send=PlainString Send=TypedString Send=File } namespace import ::xotcl::actiweb::sendStrategy::* ./xotcl-1.6.8/library/actiweb/._UserMgt.xotcl000644 000765 000024 00000000430 12161606326 021560 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/UserMgt.xotcl000644 000765 000024 00000004570 12161606326 021354 0ustar00neumannstaff000000 000000 package provide xotcl::actiweb::userMgt 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::userMgt { namespace import ::xotcl::* Class UserMgt Class UserMgt::User -parameter {name password} UserMgt instproc addUser {name password} { [self class]::User [self]::$name -name $name -password $password } UserMgt set exportedInstprocs [list \ addUser \ listUsers \ deleteUser \ userMgtOptions\ ] UserMgt instproc init args { next my exportedProcs [concat [my exportedProcs] [[self class] set exportedInstprocs]] } UserMgt instproc listUsers {} { #showCall set users "" foreach u [my info children] { lappend users [namespace tail $u] } return $users } UserMgt instproc deleteUser {name} { if {[[self class]::User info instances [self]::$name] != ""} { [self]::$name destroy } } UserMgt instproc userMgtOptions {} { return [[self class] set exportedInstprocs] } Class UserMgtHtml -superclass HtmlRep UserMgtHtml instproc addUser args { set place [HtmlPlace getInstance] if {$args eq ""} { set action [url encodeItem "[my htmlCall] [my repObj] [self proc]"] set c {

Name:

Password:

} set c [subst -nobackslashes -nocommands $c] return [my simplePage $place "New User" $c] } else { if {[llength $args] > 1} { set name [lindex $args 0] set password [lindex $args 1] set user [[my repObj] [self proc] $name $password] set c "\n$name entered $place successfully\n" return [my simplePage "New User" "New User" $c] } else { # # error !!! } return [my [self proc]] } } UserMgtHtml instproc listUsers {} { set c "" foreach u [[my repObj] [self proc]] { append c "

$u \n" } return [my simplePage "User List" "User List" $c] } UserMgtHtml instproc userMgtOptions {} { set c "" foreach u [[my repObj] [self proc]] { append c "

$u \n" } return [my simplePage "User Management Options" "User Management Options" $c] } namespace export UserMgt UserMgtHtml } namespace import ::xotcl::actiweb::userMgt::* ./xotcl-1.6.8/library/actiweb/._WebAgent.xotcl000644 000765 000024 00000000430 12161606231 021661 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/WebAgent.xotcl000644 000765 000024 00000003015 12161606231 021446 0ustar00neumannstaff000000 000000 # $Id: WebAgent.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ package provide xotcl::actiweb::webAgent 1.0 package require -exact xotcl::actiweb::agent 1.0 package require -exact xotcl::actiweb::invoker 1.0 package require -exact xotcl::mixinStrategy 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::webAgent { namespace import ::xotcl::* # # Web Agent are special agents that allow us to define another # object in the paramter webfacade as a facade for the web agent # itself and the sub-system shielded by the web agent with an interface # for agents # Class WebAgent -superclass Agent WebAgent instproc init args { next } # # let the web agents facade handle the call -> interprete args # as "method args" # return result of the invoker # #WebAgent instproc invokeFacade {args} { # set a "" # set m "" # set l [llength $args] # set o [my webfacade] # if {$l > 0} { # set m [lindex $args 0] # } # if {$l > 1} { # set a [lrange $args 1 end] # } # # #puts stderr "Web Agent [self]->invoke: OBJ: $o PROC: $m ARGS: $a" # # # # # tell the invoker to redirect the call to the webfacade object # # # set re [RedirectException [self]::[my autoname re] \ # -obj $o -method $m -arguments $a] # # return $re #} #WebAgent instproc default args { # return [next] #} namespace export WebAgent } namespace import ::xotcl::actiweb::webAgent::* ./xotcl-1.6.8/library/actiweb/._WebDocument.xotcl000644 000765 000024 00000000430 12161606333 022404 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/WebDocument.xotcl000644 000765 000024 00000014473 12161606333 022203 0ustar00neumannstaff000000 000000 package provide xotcl::actiweb::webDocument 1.0 package require -exact xotcl::actiweb::webObject 1.0 package require -exact xotcl::comm::httpAccess 1.0 package require -exact xotcl::mixinStrategy 1.0 package require -exact xotcl::actiweb::sendStrategy 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::webDocument { namespace import ::xotcl::* Class WebDocument -superclass WebObject \ -parameter { {content ""} filename } WebDocument instproc init args { my exportProcs content contentType next my mixinStrategy ::Send=TypedString } WebDocument instproc attachFile filename { my filename $filename my set oldSendStrategy [my mixinStrategy ::Send=File] my contentType [Mime guessContentType $filename] } WebDocument instproc detachFile {} { my mixinStrategy [my set oldSendStrategy] my unset contentType my unset filename } WebDocument instproc default args { if {[my exists content]} { return [my content] } return "" } #WebDocument instproc contentLength {} { # my showCall # return [expr {[string length [my content]] + 1}] #} Class TextDocument -superclass WebDocument TextDocument instproc init args { next my contentType text/plain } Class HtmlDocument -superclass TextDocument HtmlDocument instproc init args { next my contentType text/html } Class FileDocument -superclass WebDocument # # class factory creates classes on the fly if they do not exist # already, otherwise return exisiting class # # auch flyweigth Class DocumentClassFactory DocumentClassFactory abstract instproc getClass contentType Class FileDocumentClassFactory -superclass DocumentClassFactory FileDocumentClassFactory instproc getClass contentType { if {[FileDocument info classchildren $contentType] eq ""} { Class ::FileDocument::${contentType} -superclass FileDocument } return ::FileDocument::${contentType} } Class DocumentFactory DocumentFactory abstract instproc create {name args} Class FileDocumentFactory -superclass DocumentFactory FileDocumentFactory instproc create {name class filename} { $class $name #$name contentType [$class set contentType] $name attachFile $filename return $name } Class FileObjectifier FileObjectifier instproc init args { next FileDocumentClassFactory [self]::clFactory FileDocumentFactory [self]::objFactory } # # filename must be given with full path -> # create objects with filename's tail (prefix can be used to # give object name a preceding dir) # FileObjectifier instproc objectifyFile {place filename {prefix ""}} { set obj "" if {[file isfile $filename]} { set type [Mime guessContentType $filename] #if {$type ne "unknown/unknown"} { set fn [string trimleft $prefix/[file tail $filename] /] set class [[self]::clFactory getClass $type] set obj [[self]::objFactory create $fn $class $filename] $place exportObjs $obj #puts stderr "...objectified: $obj of class $class" #} } return $obj } # # objectify a whole directory tree # FileObjectifier instproc objectifyTree {place dir {prefix ""}} { if {[file isdirectory $dir]} { foreach f [glob -nocomplain $dir/*] { if {[file isfile $f]} { my objectifyFile $place $f $prefix } elseif {[file isdirectory $f]} { my objectifyTree $place $f $prefix/[file tail $f] } } } } Class GraphicDirectoryObjectifier -superclass FileObjectifier \ -parameter {{thumbnaildir [::xotcl::tmpdir]}} GraphicDirectoryObjectifier instproc objectifyTree {place dir {prefix ""}} { if {[file isdirectory $dir]} { set indexpage "" set title "" set date "" foreach f [lsort [glob -nocomplain $dir/* $dir/{.date,.title}]] { set exportedfn [string trimleft $prefix/[file tail $f] /] if {[file isfile $f]} { set type [Mime guessContentType $f] if {[string match "image/*" $type]} { set class [[self]::clFactory getClass $type] $class $exportedfn -init -attachFile $f $place exportObjs $exportedfn #puts stderr "...objectified: FN=$exportedfn cl=$class d=$dir o=$exportedfn" ###### set expThumbnaildir [file dirname $exportedfn]/.thumbnail set thumbnaildir [file dirname $f]/.thumbnail if {![file isdirectory $thumbnaildir]} { file mkdir $thumbnaildir } set thumbnail $thumbnaildir/[file tail $f] set expThumbnail $expThumbnaildir/[file tail $f] if {![file exists $thumbnail]} { catch {exec djpeg -pnm $f | \ pnmscale -xscale .2 -yscale .2 | ppmquant 256 | \ ppmtogif > $thumbnail} } $class $expThumbnail -init -attachFile $thumbnail $place exportObjs $expThumbnail #### append indexpage "" \ "$exportedfn
\n" } elseif {[string match *.title $exportedfn]} { set title [my fileContent $f] } elseif {[string match *.date $exportedfn]} { set date

[my fileContent $f]

} } elseif {[file isdirectory $f]} { if {[file exists $f/.title]} { set desc ": [my fileContent $f/.title]" } else { set desc "" } append indexpage "" \ "$exportedfn$desc
\n" my objectifyTree $place $f $exportedfn } set gindex [string trimleft $prefix/gindex.html /] HtmlDocument $gindex -content \ "$title

$title

\ $date$indexpage" #puts stderr "mixins of HtmlDocument=<[$gindex info mixins]>" $gindex mixinStrategy ::Send=TypedString #$gindex showVars receiver exportObjs $gindex } } } GraphicDirectoryObjectifier instproc fileContent {f} { set FILE [open $f r] set content [read $FILE] close $FILE return $content } Class HtmlProxy -superclass HtmlDocument -parameter realSubject HtmlProxy instproc init args { next [Place getInstance] exportObjs [self] } HtmlProxy instproc unknown {m args} { my instvar realSubject ::eval $realSubject $m $args return [my default] } namespace export \ WebDocument TextDocument HtmlDocument FileDocument \ DocumentClassFactory FileDocumentClassFactory \ DocumentFactory FileDocumentFactory \ FileObjectifier GraphicDirectoryObjectifier \ HtmlProxy } namespace import ::xotcl::actiweb::webDocument::* ./xotcl-1.6.8/library/actiweb/._WebObject.xotcl000644 000765 000024 00000000430 12161604645 022040 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/actiweb/WebObject.xotcl000644 000765 000024 00000005564 12161604645 021640 0ustar00neumannstaff000000 000000 # $Id: WebObject.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ package provide xotcl::actiweb::webObject 1.0 package require -exact xotcl::actiweb::sendStrategy 1.0 package require -exact xotcl::mixinStrategy 1.0 package require -exact xotcl::store::persistence 1.0 package require XOTcl 1 namespace eval ::xotcl::actiweb::webObject { namespace import ::xotcl::* # # base interface for all web-entitites # Class WebObject -parameter { {exportedProcs {echo default}} agentInfo {contentType ""} {place ""} } # # default send strategy == send the response from the place # WebObject instproc init args { #my showCall my mixinStrategy ::Send=PlainString my registerPlace my mixinStrategy ::Persistent=Eager my persistenceMgr [my place]::agentPersistenceMgr next } WebObject instproc registerPlace {} { my set place [Place getInstance] my set agentInfo [[my place]::agentMgr register [my selfName]] } WebObject instproc deregisterPlace {} { [my place]::agentMgr deregister [my selfName] } # # seek for the HTTP worker object that has invoked # the current call # WebObject instproc getWorker {} { for {set level 1} {1} {incr level} { if {[catch {set worker [uplevel $level self]}]} { return "" } elseif {[$worker istype Place::HttpdWrk]} { return $worker } } } WebObject instproc getFormData {} { [my getWorker] formData } # # code a call for an action on self; # action is "proc args" # WebObject instproc selfAction {action} { return [url encodeItem "[string trimleft [self] :] $action"] } WebObject instproc action {o action} { return [url encodeItem "[string trimleft $o :] $action"] } WebObject instproc echo {} { return [self] } WebObject instproc error args { return "Error on [self]: Invocation '$args' failed." } WebObject instproc default {} { return "No default behaviour on [self]." } WebObject instproc exportProcs args { my instvar exportedProcs foreach a $args { if {[lsearch $exportedProcs $a] == -1} { lappend exportedProcs $a } } } WebObject instproc isExportedProc p { expr {[lsearch [my set exportedProcs] $p] != -1} } WebObject instproc selfName {} { return [string trimleft [self] :] } WebObject instproc objName {obj} { return [string trimleft $obj :] } WebObject instproc buildAdress {} { my instvar place set a http://[$place host] if {[set p [$place port]]} { append a :$p } } WebObject instproc destroy args { my deregisterPlace next } # # simple class, to be inherited before WebObject, if # every remote method should reach the object # Class ExportAll ExportAll instproc isExportedProc p { return 1 } namespace export WebObject ExportAll } namespace import ::xotcl::actiweb::webObject::* ./xotcl-1.6.8/library/comm/._Access.xotcl000644 000765 000024 00000000430 12161601702 020701 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Access.xotcl000644 000765 000024 00000133731 12161601702 020477 0ustar00neumannstaff000000 000000 # -*- tcl -*- $Id: Access.xotcl,v 1.9 2007/08/14 16:38:26 neumann Exp $ set httpAccessVersion 1.0 package provide xotcl::comm::httpAccess $httpAccessVersion package require -exact xotcl::comm::pcache 1.0 package require -exact xotcl::comm::mime 1.0 package require -exact xotcl::comm::connection 1.0 package require -exact xotcl::trace 1.0 package require XOTcl 1 namespace eval ::xotcl::comm::httpAccess { namespace import ::xotcl::* variable os variable VERSION if {[catch {set os [exec uname -sr]}]} { if {[catch {set os [exec uname -a]}]} { set os unknownOS } } if {![info exists VERSION]} { set VERSION 1.0 } # assert is used only for invariants in the source proc assert {f r} { set got [eval $f] if {$got != $r} { puts stderr "assertion failed: \[$f\] == $r (got $got)" } } # resolve and checkUrl implement URL handling (primarily completion) proc checkUrl {url} { #puts stderr "checkUrl: <$url>" if {![regexp {^([^:]+:/)/([^/]+)(/.*)?$} $url _ scheme network path]} { regexp {^([^:]+:)(/.*)?$} $url _ scheme path } if {![info exists path]} { # no access scheme provided, try some heuristics... if {[regexp {^[./]} $url]} { # expand leading "." to pwd if {[regexp {^\.(.*)$} $url _ url]} { set url [pwd]$url } return file:$url } else { set url http://$url regsub {///$} $url // url return $url } } if {$path eq ""} {set path /} return [expr {[info exists network] ? "$scheme/$network$path" : "$scheme$path"}] } # resolving a relative url with respect to a base url (based on rfc 1808) proc resolve {rel base {childTagName ""}} { if {$base eq ""} { return [checkUrl $rel] } if {$rel eq ""} { return $base } if {[regexp {^[^:]+:/} $rel _]} { return [checkUrl $rel] } if {![regexp {^([^:]+:/)/([^/]+)(/.*)$} $base _ baseScheme baseNetwork basePath]} { regexp {^([^:]+:)(/.*)$} $base _ baseScheme basePath } elseif {[regexp {^[^:/]+:} $rel]} { return $rel } regexp {^(.*)\#.*$} $basePath _ basePath regexp {^(.*)[?].*$} $basePath _ basePath if {[regexp {^//([^/]+)/(.*)$} $rel _ relNetwork relPath]} { return $baseScheme/$relNetwork/$relPath } if {[info exists baseNetwork]} { append baseScheme /$baseNetwork } #puts stderr rel=<$rel> if {![string match "/*" $rel]} { #puts stderr rel<$rel>base<$basePath> if {[string match \#* $rel]} { set r $basePath$rel } elseif {![regsub {/([^/]*)$} $basePath /$rel r]} { set r /$rel } while {[regsub -all {/\./} $r / r]} {} regsub {/\.$} $r / r while {[regsub -all {/[^/.]+/\.\./} $r / r]} {} # remove leading /../ (netscapes navigator does this) while {[regsub {^/\.\./} $r / r]} {} set rel $r #puts stderr finalrel<$r> } #if {$childTagName ne ""} if {1} { upvar 1 $childTagName childTag catch {unset childTag} if {[regexp {^(.+)\#(.+)$} $rel _ rel childTag]} { #puts stderr childTag=$childTag,url=$baseScheme$rel. } } return $baseScheme$rel } assert {resolve "" http://mohegan/} http://mohegan/ assert {resolve http://mohegan/ ""} http://mohegan/ assert {resolve http://mohegan ""} http://mohegan/ assert {resolve http://mohegan/ http://nestroy} http://mohegan/ assert {resolve test.html http://127.0.0.1/} http://127.0.0.1/test.html assert {resolve test http://nestroy/} http://nestroy/test assert {resolve test file:/u/neumann/old} file:/u/neumann/test assert {resolve /test http://nestroy/} http://nestroy/test assert {resolve //mohegan/index.html http://nestroy/} http://mohegan/index.html assert {resolve //mohegan/index.html http://nestroy/} http://mohegan/index.html assert {resolve index.html http://nestroy/dir/} http://nestroy/dir/index.html assert {resolve ./index.html http://nestroy/dir/} http://nestroy/dir/index.html assert {resolve ././index.html http://nestroy/dir/} http://nestroy/dir/index.html assert {resolve ../index.html http://nestroy/dir/} http://nestroy/index.html assert {resolve ../../index.html http://nestroy/dir/} http://nestroy/index.html assert {resolve ../../../test file:/u/neumann/old} file:/test assert {resolve newdir/ http://nestroy/dir/} http://nestroy/dir/newdir/ assert {resolve /newdir/ http://nestroy/dir/} http://nestroy/newdir/ assert {resolve file:/u/neumann/ice.html ""} file:/u/neumann/ice.html assert {resolve \#label http://nestroy/h.html} http://nestroy/h.html assert {resolve mailto:user@host http://nestroy/h.html} mailto:user@host assert {resolve ../../../../mis2001/folien/081101.ppt http://wwwi.wu-wien.ac.at/Studium/Abschnitt_2/LVA_ws01/IT/index.html} http://wwwi.wu-wien.ac.at/mis2001/folien/081101.ppt ############################################################## # Every object of class Access informs the (possibly empty) list of # informObjects during its lifecycle with the following messages # # startCb: when the request for the object is created # and was classified and initialized # # notifyCb: when the type of the incming data is dertermined # (typically after parsing the http header) # # incCb: when new data is available # # endCb: when the request is finished sucessfully and the object # is going to be destroyed # # cancelCb: when the request is finished nonsucessfully and the object # is going to be destroyed # # All these messages receive the name of the Access object # as first parameter, incCb has two more arguments (totalsize # and currentsize) # caching: # 0 no caching # 1 volatile cache (does not check cache, keeps spool file for back button) # 2 persistent cache Class Access -parameter { {method GET} {blocking 0} {httpVersion 1.1} {headers {}} url query data contentType path caching sinkClass parentUrl } Access instproc informObject x { foreach i $x { my lappend informObjects $i } } Access instproc method x { my set method [string toupper $x] } Access instproc unknown {m args} { error "Method '$m' with args '$args' is unknown for [self class]" } Access proc checkRunning {} { foreach u [my array names running] { puts stderr "... running: $u" } puts stderr "... -----------" } Access proc createRequest args { #my showCall set informobject {} set allowJoin 1 set nargs {} foreach {a v} $args { switch -exact -- $a { -url {set url $v; lappend nargs $a $v} -informObject {set informobject $v; lappend nargs $a $v} -parentRequest {set parentRequest $v} -allowJoin {set allowJoin $v} default {lappend nargs $a $v} } } #if {[my array exists running]} {parray [self]::running} if {[my exists running($url)] && $allowJoin} { my showMsg "we can join running($url)=[my set running($url)]" # we can join the request. # requests are joined by adding the informobjects to # the existing request set token [my set running($url)] # delegation to a different request works only so easy # when loading to a file... $token informObject $informobject return $token } else { set token [my autoname ::req] if {[info exists parentRequest]} { set token ${parentRequest}$token } #my showMsg "TOKEN = $token $url" return [eval my create $token $nargs] } } Access instproc running {} { #my showCall [self class] set running([my url]) [self] } Access instproc stop {} { #showCall my instvar url if {[[self class] exists running($url)]} { #puts stderr "my unset [[self class] set running($url)] [self class] unset running($url) #if {[my array exists running]} { parray [self class]::running } } else { #puts stderr "not running($url)" #if {[my array exists running]} { parray [self class]::running } } } #Access instproc destroy args { # my showCall # next #} Access instproc init args { #my showCall my instvar method url if {![my exists informObjects]} { my set informObjects {} } next if {![my exists caching]} { if {$method eq "GET"} { set defaultCaching 2 } else { set defaultCaching 1 } my caching $defaultCaching } #my showVars set url [string trim $url] my initialize if {[my classify $url]} { #my showVars # now inform all interested objects that we have the object my doCallbacks startCb #my showVars blocking # trigger the transfer... (might be blocking or not) my $method if {![my exists finished]} { # the request is not finished if {[my blocking]} { #my showMsg "waiting" my vwait finished #my showMsg "waiting DONE" } } } } Access instproc getContent {} { [my set sink] content } ######################################### Access instproc timeout t { my set timeout [::after $t [self] timeoutOccured] } Access instproc timeoutOccured {} { #my showCall my unset timeout my abort "timeout exceeded" } Access instproc timeoutFinish {} { if {[my exists timeout]} { after cancel [my set timeout] my unset timeout } } ######################################### Access instproc initialize {} { #my showCall my set state 0 my set meta {} my set currentsize 0 my set totalsize 0 } Access instproc classify {url} { my instvar host path port method #my showVars caching if {[my caching] > 1 && [persistentCache isValidated $url]} { #puts stderr "*** cacheable && validated" #showVars #persistentCache dump set access CacheAccess } elseif {[regexp -nocase {^http://([^/:]+)(:([0-9]+))?(/.*)?$} $url \ _ host y givenPort path]} { if {$givenPort ne ""} {set port $givenPort } {set port 80} switch -exact $method { PROPFIND - PROPPATCH - COPY - MKCOL - MOVE - LOCK - UNLOCK { package require xotcl::comm::dav set access Dav } default {set access Http} } } elseif {[regexp -nocase {^https://([^/:]+)(:([0-9]+))?(/.*)$} $url \ _ host y givenPort path]} { if {$givenPort ne ""} {set port $givenPort } {set port 443} set access Https } elseif {[regexp -nocase {^file:(.*)$} $url _ path]} { set access File } elseif {[regexp -nocase {^ftp://([^/]+)/(.*)$} $url _ host path]} { package require -exact xotcl::comm::ftp 0.9 set access Ftp } elseif {[regexp -nocase {^imap://([^/]+)/(.*)$} $url _ host path]} { package require xotcl::comm::imap set access Imap } elseif {[regexp -nocase {^cmd:/(.*)$} $url _ path]} { set access xotcl::Cmd } elseif {[regexp -nocase {^ldap://([^/:]+)?(:([0-9]+))?(/.*)$} \ $url _ host y givenPort path]} { if {$givenPort ne ""} { set port $givenPort } my showMsg "*** ldap://<$host>:<$port>/<$path>" package require xotcl::comm::ldap set access Ldap } else { #my set state 0 my abort "Unsupported URL: '$url'" return 0 } my class $access #my showMsg "class of request = $access" return 1 } Access instproc revisit {} { my class ReAccess my initialize my [my set method] } ### dummy stubs for 'close' and 'GET' for error cases Access instproc close {} { } Access instproc GET {} { if {[my exists errormsg]} { ;# the error was already reportet my finish } else { my abort "unknown error" } } Access instproc headerDone {} { my instvar caching sink if {[my exists ignoreBody]} return if {[my exists sinkClass] && $caching>0 } { error "can´t set both sinkclass and caching" } switch $caching { 2 { set sink [CacheFileSink create [self]::cfs] #my showMsg "[self class] result goes to cache" $sink notifyCb [self] } 1 { set sink [CacheFileSink create [self]::cfs -persistent 0] #my showMsg "result goes to volatile cache" $sink notifyCb [self] } 0 { if {[my exists sinkClass]} { set sink [[my sinkClass] create [self]::s] } } } my doCallbacks notifyCb } Access instproc mkSpoolFile {{name ""}} { if {![my exists fileName]} { my set fileName [persistentCache newEntry [my url] [self] [my caching] $name] } } Access instproc block {} { my set block } Access instproc kill {} { my showCall my set state -1; #interrupted my finish } Access instproc abort {msg} { #my showCall #my showVars my instvar state errormsg if {[catch {::printError "[self] ($state): $msg"} err]} { puts stderr "\n$err\nERROR [self] ($state): $msg\n" } #my set error [list $msg $::errorInfo $::errorCode] my caching 0 if {[my exists ignoreBody]} { my unset ignoreBody } set state -2 ;# error set errormsg $msg my finish } Access instproc finish {} { #my showCall my timeoutFinish my close #my showVars state ignoreBody # state is "interrupted" or "error" if {[my set state] < 0} { set action cancelCb set success 0 } else { set action endCb #set state ok set success 1 } if {[my exists ignoreBody]} { my stop #my set finished $success set cmd [my set ignoreBody] my unset ignoreBody #my showMsg "executing... <$cmd>" eval my $cmd } else { if {[my exists sink]} { [my set sink] $action [self] } #catch {after cancel $after} ;# ???? my doCallbacks $action my stop my set finished $success } } Access instproc eof {} { #my showCall #my showMsg "c [my set currentsize]== t [[self set totalsize]]" #my set state eof my finish } Access instproc doCallbacks {cb} { #my showCall if {[my exists ignoreBody]} { my showMsg "ignoring callback" } else { foreach obj [my set informObjects] { #my showMsg "*** $obj $cb [self]" #puts stderr "------------ calling: $obj $cb [self]" if {[catch {$obj $cb [self]} errormsg]} { puts stderr "--------------$cb:errormsg=$errormsg, \ errorInfo=$::errorInfo, \ errorCode=$::errorCode." } #puts stderr "------------ calling DONE: $obj $cb [self]" } } } Access instproc shutdown {} { #my showMsg "state=[my set state] > 3" if {[my set state] > 3} { my set mustDestroy 1 } else { #my showVars #my showStack #my showMsg "DESTROY !!!" if {[my set state] > -2} { my destroy } } } Class FileAccess -superclass Access FileAccess instproc initialize args { my caching 0 next } FileAccess instproc close {} { } FileAccess instproc block {} { my showTimeStart set S [open [my set fileName] r] fconfigure $S -translation binary set block [::read $S] ::close $S my showTimeEnd return $block } FileAccess instproc GET {} { my instvar path response totalsize currentsize \ fileName informObjects set fileName $path set totalsize [file size $path] set response "file 200 OK" my headerDone my set state 4 set currentsize $totalsize #my showVars informObjects foreach obj $informObjects { $obj incCb [self] $totalsize $currentsize } my eof } Class File -superclass FileAccess File instproc GET {} { my instvar path #puts stderr path=$path,exists=[file exists $path] if {![file exists $path]} { my abort "No such file '$path'" return } if {![my exists contentType]} { my contentType [Mime guessContentType $path] } my set sink [FileSink create [self]::fas -fileName $path] #puts stderr ****sink=$sink,[$sink info class] #puts stderr "*** before next ([self class])" next #puts stderr "*** after next ([self class])" } Class CacheAccess -superclass File CacheAccess instproc GET {} { my instvar url my path [persistentCache cacheFileName $url] my contentType [persistentCache contentType $url] my set meta [persistentCache meta $url] next } Class ReAccess -superclass File ReAccess instproc GET {} { my instvar fileName sink my set block "" my set currentsize 0 my caching 0 if {![info exists fileName]} { set fileName [$sink set fileName] } my set path $fileName next } Class Cmd -superclass Access Cmd instproc init args { if {![my exists caching]} { my caching 0 } next } Cmd instproc GET {} { my instvar path block totalsize currentsize \ response informObjects state if {[catch {set block [eval $path]} error]} { my contentType text/plain set block $error } else { my contentType text/html } set totalsize [string length $block] set response "cmd 200 OK" my headerDone my set state 4 set currentsize $totalsize foreach obj $informObjects { $obj incCb [self] $totalsize $currentsize #$obj endCb [self] } #set state eof my finish } Cmd instproc block args { my instvar block return $block } #Class NetAccess -superclass Access -parameter {host port} Class NetAccess -superclass Access NetAccess instproc initialize args { if {![my exists blocksize]} {my set blocksize 512} my set readMethod read next } NetAccess instproc read {} { #my instvar S blocksize block #set block [::read $S $blocksize] my instvar S block blocksize set block [::read $S $blocksize] } NetAccess instproc gzread {} { my instvar S Z blocksize block puts -nonewline $Z [::read $S $blocksize] set block [::read $Z] #puts stderr len=[string length $block],block=<$block> } NetAccess instproc gzopen {} { my instvar Z S readMethod requireModules {zipchan libzipchan.so} fconfigure $S -translation binary set Z [zipchan] set readMethod gzread } NetAccess instproc close {} { #my showMsg "**** close persistent=[my exists persistent]" if {![my exists persistent]} { foreach stream {S Z} { if {[my exists $stream]} { ::close [my set $stream] my unset $stream } } } my stop } NetAccess instproc hold {} { my instvar S $S hold } NetAccess instproc resume {} { my instvar S $S resume } NetAccess instproc readData {} { #my showCall if {[catch { #puts stderr "??????????????readMethod=[my set readMethod]" my [my set readMethod] my pushBlock } err]} { puts stderr ERR=$err my set block "" my abort $err } } NetAccess instproc pushBlock {} { #my showCall my instvar block if {[set n [string length $block]]} { my instvar currentsize totalsize informObjects sink #my showVars n currentsize totalsize incr currentsize $n if {$currentsize > $totalsize} { set totalsize $currentsize } #my showMsg "total=$totalsize current=$currentsize" if {[my exists ignoreBody]} { #puts stderr "ignoring: <$block>" } else { if {[info exists sink]} { $sink incCb [self] $totalsize $currentsize } foreach obj $informObjects { #my showMsg "call incbCb $totalsize $currentsize $obj [$obj info class]" $obj incCb [self] $totalsize $currentsize #my showMsg "done incbCb $totalsize $currentsize" } } } else { #my showVars n return [my eof] } } Class Http -superclass NetAccess ;### -parameter {query {httpVersion 1.0}} Http set proxyfilter httpProxyRequired Http set proxyhost {} Http set proxyport {} Http set accept */* if {[info exists argv0]} { Http set useragent "[file tail $argv0] httpAccess/$httpAccessVersion xotcl/$::xotcl::version ($os)" } Http proc proxyfilter {host phostv pportv} { my instvar proxyfilter proxyhost proxyport upvar \#1 $phostv phost $pportv pport switch -- $proxyfilter { httpProxyRequired { if {[string length $proxyhost]} { if {![string length $proxyport]} { set proxyport 8080 } set phost $proxyhost set pport $proxyport } } } } Http instproc initialize args { if {![my exists port]} {my set port 80} if {![my exists httpVersion]} {my set httpVersion 1.1} next #my showMsg "result queried from net" } Http instproc GET {} { #my showCall if {[my exists query]} { my instvar query caching my append url ?$query my append path ?$query if {$caching == 2} {set caching 1} my showVars caching $query } my open } Http instproc HEAD {} { my open } Http instproc POST {} { # we have query and data only for a uniform interface for # forms that cann pass the attribute value pairs always via # query. if {[my exists query]} { my data [my query] } my open } Http instproc PUT {} { my open } # Http1.1 Http instproc OPTIONS {} { my showCall my open } # Http1.1 Http instproc TRACE {} { my showCall } # Http1.1 Http instproc DELETE {} { #my showCall my open } Http instproc openConnection {host port reuse} { return [Connection make [self] $host $port $reuse _] } Http instproc open {} { #my showCall my instvar url S state host port path if {$state > 0} { puts stderr "... [self]:$proc ignoring request in state $state" return } Http proxyfilter $host phost pport if {[info exists phost] && [string length $phost]} { set usePort $pport set useHost $phost set path $url } else { set usePort $port set useHost $host } set S [my openConnection $useHost $usePort [expr {[my httpVersion]>1.0}]] if {[$S exists error]} { my abort [$S set error] return } set state 2 my running $S event writable [self] ask } Http instproc ask {} { my instvar url S state host port path \ method headers data caching $S event writable [self] {} if {[pwdManager checkAvailableCredentials $url credentials]} { eval lappend headers $credentials #my showMsg "*** new headers = <$headers>" } if {$caching==2 && [persistentCache ifModifiedHeader $url ifModified]} { eval lappend headers $ifModified #puts stderr "new headers = <$headers>" } # Send data in cr-lf format, but accept any line terminators $S translation {auto crlf} #my showMsg "'$method $path HTTP/[my httpVersion]' headers {$headers}" $S puts "$method $path HTTP/[my httpVersion]" if {[$S exists error]} { my abort "Connection refused by host '$host' port '$port'\n\ [$S set error]" return } $S puts "Accept: [Http set accept]" $S puts "Host: $host" $S puts "User-Agent: [Http set useragent]" foreach {tag value} $headers { regsub -all \[\n\r\] $value {} value set tag [string trim $tag] if {[string length $tag]} { #my showMsg "+++ <$tag: $value>" $S puts "$tag: $value" } } if {[my exists data]} { $S puts "Content-Length: [string length $data]" $S puts "Content-Type: [my contentType]" $S puts "" $S translation {auto binary} $S puts-nonewline $data } else { $S puts "" } $S flush if {[$S exists error]} { my instvar host port my abort "Connection refused by host '$host' port '$port'\n\ [$S set error]" } else { set state 3 $S event readable [self] headerStart } } Http instproc headerStart {} { #my showCall my instvar S response set n [$S gets response] #my showVars n response if {[$S exists error]} { my instvar host port my abort "Error on connection to host '$host' port '$port'\n\ [$S set error]" return } #my showMsg "n=$n, eof=[$S eof]" if {$n == -1 && ![$S eof]} { #my showMsg "******************************input pending, no full line" return } my instvar responseCode responseHttpVersion if {[regexp {^HTTP/([0-9.]+) +([0-9]+) *} $response _ \ responseHttpVersion responseCode]} { #my showMsg "response valid: '$response'" $S event readable [self] header } else { my instvar host port my abort "Unexpected response from $host:$port\n $n: '$response'" } } Http instproc header {} { my instvar S meta totalsize if {[$S gets line]} { #my showMsg "line=$line" if {[regexp -nocase {^content-type:(.+)$} $line _ type]} { my contentType [string trim $type] } elseif {[regexp -nocase {^content-length:(.+)$} $line _ length]} { set totalsize [string trim $length] } if {[regexp -nocase {^([^:]+): *(.+)$} $line _ key value]} { lappend meta [string tolower $key] $value } } else { my headerDone } } Http array set expectsBody \ {GET 1 HEAD 0 POST 1 PUT 0 DELETE 1 OPTIONS 0 TRACE 1} Http instproc headerDone {} { #my showVars meta my instvar S meta method responseCode responseHttpVersion [self class] instvar expectsBody set expectBody $expectsBody($method) array set v [my set meta] if {([info exists v(connection)] && $v(connection) eq "close") || \ $responseHttpVersion < 1.1} { $S makePersistent 0 } else { $S makePersistent 1 } switch $responseCode { 200 {} 204 { #set state empty my finish set block "" set expectBody 0 return } 301 - 302 { # the request is redirected to another server my set ignoreBody [list redirect $v(location)] # RFC2068 Note: When automatically redirecting a POST request after # receiving a 302 status code, some existing HTTP/1.0 user agents # will erroneously change it into a GET request. #my method GET my showMsg "redirect '[my url]' --> '$v(location)'" } 304 { ;# Not Modified, use cached version my set ignoreBody cacheAccess set expectBody 1 #my showMsg "result comes from cache" } 401 { my set ignoreBody \ [list resubmitAuthenticated $v(www-authenticate)] #my showMsg "resubmitAuthenticated $v(www-authenticate)" if {[my exists resubmitAuthenticated]} { if {[my set resubmitAuthenticated] > 5} { my abort "Too many wrong passwords given" } else { my incr resubmitAuthenticated } } else { my set resubmitAuthenticated 1 } set expectBody 1 } 404 { my instvar url #my showVars my set ignoreBody [list abort "File Not Found on Server '$url'"] set expectBody 1 } default { #my showVars responseCode } } next if {![my exists S]} {;# this request was already canceled return } if {[info exists v(transfer-encoding)]} { if {$v(transfer-encoding) == "chunked"} { $S translation {auto binary} my set state 4 $S event readable [self] readChunkedLength } else { my abort "Unexpected Transfer encoding '$v(transfer-encoding)'" } } else { # yahoo does not send a content length for a get request #if {$totalsize == 0 && ($responseCode > 300 || !$expectsBody($method) )} #my showVars method totalsize expectsBody($method) expectBody # the following is used currently for Actiweb-Agents: # the reponse of a PUTS contains a BODY! if {!$expectBody && [::info exists v(content-length)] && $v(content-length) > 0} { set expectBody 1 #my showMsg "setting expectBody 1" } if {!$expectBody} { #$S event readable [self] "" #set state eof my finish set block "" } else { ### To avoid CRLF problmes we set the translation for ### the body entity to binary $S translation binary my set state 4 $S event readable [self] readData } } } Http instproc cacheAccess {} { # there is an actual version of the document in the cache #showCall persistentCache validated [my url] #my close my class CacheAccess #my showMsg "result comes from cache [persistentCache cacheFileName $url]" my caching 0 ;# should be really: toCache 0 my GET } Http instproc redirect location { # the request is redirected to another server if {$location ne [my url] } { #my showVars my url $location my initialize my classify $location my [my set method] } } Http instproc resubmitAuthenticated headerField { #my showCall # the server requires authentification my instvar path method if {[pwdManager checkRequestedAuthentification $method $path $headerField \ type realm]} { my instvar url caching method headers array set v $headers #my showVars catch {unset v(Authorization)} set headers [array get v] pwdManager removePasswd $realm my close if {[pwdManager requireCredentials $realm $url]} { my initialize if {$caching == 2} {set caching 1} my $method } } else { my abort "unknown authentication method '$headerField'" } } Http instproc readChunkedLength {} { #my showCall my instvar S chunkLength totalsize set length [$S gets lengthString] if {$length > 0} { set chunkLength [expr 0x$lengthString] #my showVars lengthString chunkLength if {$chunkLength == 0} { $S event readable [self] readChunkedTrailer } else { incr totalsize $chunkLength $S translation {binary} $S event readable [self] readChunkedData } } } Http instproc readChunkedTrailer {} { #my showCall my instvar S state block set size [$S gets line] if {$size != 0} { showObj [self] my abort "expected trailer size 0, got size $size" } else { #set state eof my finish set block "" #showObj [self] } } Http instproc readChunkedData {} { #my showCall my instvar S block totalsize currentsize chunkLength set block [$S readSize $chunkLength] set received [string length $block] #my showVars block #my showVars currentsize totalsize chunkLength received if {$chunkLength == $received} { $S translation {auto binary} $S event readable [self] readChunkedLength } else { incr chunkLength -$received } my pushBlock } Http instproc readData {} { #my showCall my instvar S block totalsize currentsize set block [$S read] #puts stderr "????? bl=[string length $block]" if {[$S exists error]} { set block "" my abort [$S set error] return } my pushBlock #my showMsg "c [my set currentsize]== t [[self set totalsize]]" if {$currentsize == $totalsize && [my exists S] && [$S exists persistent]} { #my showMsg "PERSITENT, end of entity reached" #my set state eof my finish set block "" #showObj [self] } if {[my exists mustDestroy]} { #my showMsg "mustDestroy was set" my destroy } } Http instproc close {} { #my showCall if {[my exists S]} { [my set S] close #unset S } #next } Http instproc freeConnection {} { #showCall my instvar S #::puts stderr "[self] freeing $S !!!!!!!!!!!!!!!!!!!!!!!" unset S } #Access instproc makeZombie {} { # my showMsg "procs= [my info procs], i [Object info instcommands]" # my class Zombie #} #Class Zombie #Zombie instproc unknown {m args} { # my showMsg "+++ zombie method '$m' called" #} Class Https -superclass Http Https instproc initialize args { #my showCall package require tls if {![my exists port]} { my set port 443} next ### temporary solution, FIXME: ### zur zeit muss man den secure-webserver.xotcl und ### secure-webclient.xotcl jedenfalls aus dem xotcl/apps/xocomm-apps ### verzeichnis starten, da haben wir mal die cfg files in unserem ### baum.... source .ssl/ssl-configuration.xotcl ### } Https instproc openConnection {host port reuse} { set S [Connection make [self] $host $port $reuse reused] if {$reused} { #my showMsg "reusing $S" } else { my showMsg "make the socket ([$S socket]) secure ..." set cmd [list $S importSSL] foreach attr {cafile cadir certfile cipher command keyfile \ model request require ssl2 ssl3 tls1} { if {[sslClientConfig exists $attr]} { lappend cmd -$attr [sslClientConfig set $attr] } } my showMsg "the assembled command is... ´$cmd´" eval $cmd puts stderr "CHANNELS= [file channels]" } return $S } ####################################################################### Object pwdManager pwdManager proc requirePasswd {realm username password} { # used by ftp and imap my instvar user area upvar [self callinglevel] $password passwd if {[my exists pwd($realm)]} { #my showMsg "*** reusing password for $realm" set passwd [my set pwd($realm)] return 1 } else { userPwd user $username if {[userPwd show $realm user($realm) passwd]} { set area($realm/$username) $realm return 1 } } return 0 } pwdManager proc storePasswd {realm username password} { # used by ftp and imap my instvar pwd user set pwd($realm) $password set user($realm) $username } pwdManager proc removePasswd {realm} { if {[my exists pwd($realm)]} { my unset pwd($realm) my unset user($realm) } } pwdManager proc requireCredentials {realm url} { regexp {^(.*/)[^/]*$} $url _ path if {[my exists pwd($realm)]} { #my showMsg "*** register url=$url for ther realm=$realm" my set area($path) $realm return 1 } else { my instvar pwd user if {[info exists ::env(USER)]} { set USER $::env(USER) } elseif {[info exists ::env(USERNAME)]} { set USER $::env(USERNAME) } else { set USER unknown } userPwd user $USER if {[userPwd show $realm user($realm) pwd($realm)]} { #my showMsg "*** setting password for realm '$realm' url=$path" my set area($path) $realm return 1 } } return 0 } pwdManager proc encodeCredentials {authMethod realm} { #my showCall switch $authMethod { basic {set credential [my encodeCredentialsBasic $realm]} digest {set credential [my encodeCredentialsDigest $realm]} } return $credential } pwdManager proc encodeCredentialsBasic {realm} { my instvar pwd user return [list Authorization \ "Basic [base64 encode $user($realm):$pwd($realm)]"] } pwdManager proc encodeCredentialsDigest {realm} { #my showCall package require tcu; #FIXME: noch nicht in distribution my instvar digestResponseData my mkDigestResponseData $realm set digestResponse {} foreach {t v} [array get digestResponseData] { append digestResponse " $t = \"$v\"," } return [list Authorization "Digest [string trimright $digestResponse ,]"] } pwdManager proc mkDigestResponseData {realm} { #my showCall my instvar pwd user digestResponseData requestUri # RFC 2617 # credentials = "Digest" digest-response # digest-response = 1#( username | realm | nonce | digest-uri # | response | [ algorithm ] | [cnonce] | # [opaque] | [message-qop] | # [nonce-count] | [auth-param] ) # username = "username" "=" username-value # username-value = quoted-string # digest-uri = "uri" "=" digest-uri-value # digest-uri-value = request-uri ; As specified by HTTP/1.1 # message-qop = "qop" "=" qop-value # cnonce = "cnonce" "=" cnonce-value # cnonce-value = nonce-value # nonce-count = "nc" "=" nc-value # nc-value = 8LHEX # response = "response" "=" request-digest # request-digest = <"> 32LHEX <"> # LHEX = "0" | "1"| ...| "e" | "f" set digestResponseData(username) $user($realm) set digestResponseData(uri) $requestUri set digestResponseData(cnonce) "TEST" set digestResponseData(nc) 00000001 set digestResponseData(response) [my mkRequestDigest] #parray digestResponseData } pwdManager proc mkRequestDigest {} { # returns a string of 32 hex digits, which proves that the user # knows a password #A1 = unq(username-value) ":" unq(realm-value) ":" passwd my instvar digestResponseData pwd requestMethod requestUri append A1 $digestResponseData(username)\ : $digestResponseData(realm) : $pwd($digestResponseData(realm)) if {![my exists digestResponseData(qop)] || $digestResponseData(qop) eq "auth"} { append A2 $requestMethod : $requestUri } elseif {$digestResponseData(qop) eq "auth-int"} { #A2 = Method ":" digest-uri-value ":" H(entity-body) append A2 $requestMethod : $requestUri: "" } if {[my exists digestResponseData(qop)]} { append reqDigest $digestResponseData(nonce) : \ $digestResponseData(nc) : \ $digestResponseData(cnonce): \ $digestResponseData(qop) set reqDigest [md5 [md5 $A1]:$reqDigest:[md5 $A2]] } else { set reqDigest [md5 [md5 $A1]:$digestResponseData(nonce):[md5 $A2]] } return $reqDigest } pwdManager proc checkAvailableCredentials {url returnCredentials} { # we start a fresh request and check, whether we have sent for this url # (directory) already some credentials in an earlier reqhest. my instvar authMethod regexp {^(.*/)[^/]*$} $url _ path if {[my exists area($path)]} { set realm [my set area($path)] upvar [self callinglevel] $returnCredentials credentials #my showMsg "*** adding credentials for realm=$realm and $path" set credentials [my encodeCredentials $authMethod $realm] return 1 } return 0 } pwdManager proc checkRequestedAuthentification {reqMethod path headerField typeVar realmVar} { # check for which realm with which authentification method the # server wants an authentification #my showCall upvar [self callinglevel] $typeVar type $realmVar realm my instvar authMethod digestResponseData requestUri requestMethod set requestUri $path set requestMethod $reqMethod if {[regexp {^Basic realm="(.*)"$} $headerField _ realm]} { set type basic;# FD: musste da lassen wg. call by reference set authMethod $type return 1 } elseif {[regsub {^Digest } $headerField _ headerField]} { set type digest ;# FD: musste da lassen wg. call by reference set authMethod $type foreach pair [split $headerField ,] { if {[regexp {^(.*) *= *(".*")$} $pair _ n v]} { set digestResponseData([string trim $n]) [string trim [string trim $v] \"] } } set realm $digestResponseData(realm) return 1 } return 0 } ####################################################################### # test classes Class Sink Sink instproc startCb {r} { my set contentLength 0 next } Sink instproc notifyCb {r} { next } Sink instproc incCb {r t c} { my set contentLength $t next } Sink instproc endCb {r} { next #showCall } Sink instproc cancelCb {r} { next #showCall } Sink instproc content {} { next #showCall } Sink instproc contentLength {} { my set contentLength #showCall } Class TimeSink -superclass Sink TimeSink instproc startCb {r} { my set startTime [clock clicks] next } TimeSink instproc notifyCb {r} { my set notifyTime [clock clicks] next } TimeSink instproc endCb {r} { my set endTime [clock clicks] next my reportTimes } TimeSink instproc cancelCb {r} { my set endTime [clock clicks] next } TimeSink instproc reportTimes {} { my instvar startTime endTime notifyTime set bytes [my contentLength] set grossSecs [expr {($endTime-$startTime)/1000000.0}] set grossKbps [expr {($bytes/1000.0)/$grossSecs}] set netSecs [expr {($endTime-$notifyTime)/1000000.0}] set netKbps [expr {($bytes/1000.0)/$netSecs}] #if {[catch {set netKbps [expr {($bytes/1000.0)/$netSecs}]}]} { # set netKbps 0 #} set headSecs [expr {$grossSecs-$netSecs}] foreach v {grossSecs grossKbps netSecs netKbps headSecs} { set $v [format %.2f [set $v]] } my showMsg "got $bytes bytes in $grossSecs ($headSecs+$netSecs) seconds,\ $grossKbps ($netKbps) KB/S" } Class ParallelSink -superclass Sink -parameter { {httpVersion 1.1} {sinkClass TimeSink} {maxsimultaneous 20} } ParallelSink instproc init args { next my set running 1 my set numrequests 0 my set sumbytes 0 my set blocked {} } ParallelSink instproc startCb r { #my showCall my incr running my incr numrequests #puts stderr "... running++ [my set running]" } ParallelSink instproc endCb r { #my showCall my incr sumbytes [$r set currentsize] my done $r } ParallelSink instproc cancelCb r { #my showCall my done $r } ParallelSink instproc done r { #my showCall my instvar blocked $r shutdown my incr running -1 #puts stderr "... running-- [my set running] [llength [Http info instances]]" #puts stderr [Http info instances] #foreach i [Http info instances] {puts stderr "\t$i: [$i set method] [$i set url]"} #puts stderr RUNNING=[my set running] if {[llength $blocked] > 0} { set newreq [lindex $blocked 0] set blocked [lrange $blocked 1 end] my scheduleRequest [lindex $newreq 0] [lindex $newreq 1] [lindex $newreq 2] } elseif {[my set running] < 1} { my set done 1 } } ParallelSink instproc scheduleRequest {method url {parentUrl ""}} { my instvar requests blocked running maxsimultaneous if {$running > $maxsimultaneous} { lappend blocked [list $method $url $parentUrl] } else { set cmd [list Access createRequest -url $url \ -sinkClass [my sinkClass] \ -informObject [self] \ -method $method \ -timeout 25000 \ -caching 0 -allowJoin 0 -httpVersion [my httpVersion]] if {$parentUrl ne ""} { lappend cmd -parentUrl $parentUrl } set r [eval $cmd] } } ParallelSink instproc requests {urls} { my showTimeStart foreach url $urls { my scheduleRequest GET $url } my wait my showTimeEnd } ParallelSink instproc wait {} { my instvar running if {$running > 0} { set savedValue $running #my showMsg ".......... waiting for initially $running requests" if {[catch {my vwait done} err]} { my showMsg "vwait returned: $err " } #my showMsg "$savedValue requests FINISHED " } } Class MemorySink -superclass Sink MemorySink instproc incCb {r t c} { my append d [$r block] next } MemorySink instproc content {} { return [my set d] } MemorySink instproc contentLength {} { if {[my exists d]} { return [string length [my set d]] } else { return 0 } } Class FileSink -superclass Sink -parameter fileName ### write methods #FileSink instproc startCb {r} { # next #} FileSink instproc notifyCb {r} { #my showVars next my instvar file fileName if {[info exists fileName]} { set file [::open $fileName w] fconfigure $file -translation binary } else { # we have no filename; we assume the sink must be a dummy sink # that deletgates its work to some other FileSink my class ShadowFileSink my notifyCb $r } } FileSink instproc incCb {r t c} { next if {[my exists file]} { if {$r == "req0"} { puts stderr "*******************************************************" puts stderr [$r block] puts stderr "*******************************************************" } puts -nonewline [my set file] [$r block] } } FileSink instproc endCb {r} { #my showCall next my close } FileSink instproc cancelCb {r} { next my close } FileSink instproc close {} { if {[my exists file]} { ::close [my set file] my unset file } } ### read methods FileSink instproc content {} { next my instvar file fileName set file [::open $fileName r] fconfigure $file -translation binary set d [read [my set file]] my close return $d } FileSink instproc contentLength {} { next if {[my exists fileName]} { return [file size [my set fileName]] } else { return 0 } } Class ShadowFileSink -superclass Sink ShadowFileSink instproc notifyCb {r} { next my set token $r } ShadowFileSink instproc content {} { my instvar token next return [[$token set sink] content] } ShadowFileSink instproc contentLength {} { my instvar token next return [[$token set sink] contentLength] } Class CacheFileSink -superclass FileSink -parameter {{persistent 1}} CacheFileSink instproc notifyCb req { #my showCall if {![my exists fileName]} { my instvar persistent set url [$req set url] my set fileName [persistentCache newEntry $url $req $persistent ""] } # it is important to execute next after setting the fileName... next } CacheFileSink instproc endCb req { #my showCall my instvar persistent next if {$persistent} { persistentCache entryDone [$req set url] } } CacheFileSink instproc cancelCb req { next if {[my exists fileName]} { file delete [my set fileName] my unset fileName } } CacheFileSink instproc destroy {} { #my showCall if {[my exists fileName] && ![my set persistent]} { #my showMsg "file delete $fileName" file delete [my set fileName] my unset fileName } next } #=========================================================== Class SimpleRequest -parameter { {caching 0} {useFileSink 0} {blocking 1} {timing 0} url fileName timeout httpVersion method headers data query contentType informObject } SimpleRequest instproc fileName x { my set fileName $x my set useFileSink 1 } SimpleRequest instproc init args { my instvar useFileSink fileName sink caching token #my showMsg "Starting Request" next if {[info exists fileName]} { set sink [FileSink create [self]::sink -fileName $fileName] } elseif {$useFileSink || $caching > 0} { set sink [FileSink create [self]::sink] } else { set sink [MemorySink create [self]::sink] } #my showMsg "class of sink = [$sink info class]" if {[my set timing]} { $sink mixin TimeSink } set cmd [list Access createRequest \ -url [my url] \ -informObject $sink \ -blocking [my blocking] \ -caching $caching] foreach optionalParameter { timeout httpVersion method headers data query contentType informObject } { if {[my exists $optionalParameter]} { lappend cmd -$optionalParameter [my set $optionalParameter] } } #my showMsg "cmd=$cmd" set token [eval $cmd] #if {[my success]} { # $sink reportTimes # #puts stderr <[$sink content]> #} } SimpleRequest instproc success {} { if {[my exists token]} { return [expr {[[my set token] set finished] == 1}] } return 0 } SimpleRequest instproc destroy {} { if {[my exists token]} { [my set token] destroy } next } SimpleRequest instproc getContent {} { [my set sink] content } SimpleRequest instproc getContentLength {} { [my set sink] contentLength } #SimpleRequest instproc destroy args { next } ####################################################################### namespace export \ Access FileAccess File CacheAccess ReAccess \ Cmd NetAccess Http Https Sink TimeSink \ ParallelSink MemorySink FileSink \ ShadowFileSink CacheFileSink SimpleRequest } namespace import ::xotcl::comm::httpAccess::* ./xotcl-1.6.8/library/comm/._Connection.xotcl000644 000765 000024 00000000430 12161600406 021577 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Connection.xotcl000644 000765 000024 00000016110 12161600406 021364 0ustar00neumannstaff000000 000000 # -*- tcl -*- $Id: Connection.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $ package provide xotcl::comm::connection 1.0 package require XOTcl 1 namespace eval ::xotcl::comm::connection { namespace import ::xotcl::* Class Connection -parameter {host port req socket handle} Connection proc make {r host port reuse reusedVar} { #my showCall my instvar openConnections upvar [self callinglevel] $reusedVar reused if {$reuse} { set handle $host:$port-[$r set blocking] #if {[array exists openConnections]} {parray openConnections} if {![info exists openConnections($handle)]} { # there is no persistent connection, we create a new one set reused 0 set openConnections($handle) \ [Connection new -host $host -port $port -req $r -handle $handle] #my showMsg "$openConnections($handle) CONNECTION add for $handle added" } else { # there is a persistent connection set reused 1 set c $openConnections($handle) $c instvar req #::puts stderr "$c CONNECTION reuse for $handle ($c) new req=$r" if {[info exists req]} { # the persistent connection is active with some request $req #::puts stderr "$c CONNECTION req $req already active" } else { # the persistent connection is currently not active $c set req $r } } return $openConnections($handle) } else { set reused 0 return [Connection new -host $host -port $port -req $r] } } Connection proc removeHandle handle { #my showVars #puts stderr "***************** unsetting $handle ***************" if {[my exists openConnections($handle)]} { my unset openConnections($handle) } } Connection instproc init args { ;# the constructor creates the socket my set blocked {} next if {[my exists socket]} { my set keepOpen 1 } else { my set keepOpen 0 if {[catch {my socket [socket -async [my host] [my port]]} msg]} { my set error $msg return } } ::fconfigure [my socket] -blocking false -buffersize 16384 } #Connection instproc STATUS {ctx} { # my instvar socket # ::puts stderr "*** $ctx: $socket blocking=[::fconfigure $socket -blocking]" #} Connection instproc destroy {} { ;# the destructor closes the socket #my showCall if {[my exists handle]} { #my showVars handle # the connection was created via make [self class] removeHandle [my handle] #::puts stderr "my CONNECTION close and destroy [my handle]" } else { #::puts stderr "my CONNECTION close and destroy" } # in cases of errors we might not have a socket yet if {[my exists socket]} { close [my socket] } next } Connection instproc translation {translation} { #showCall ::fconfigure [my socket] -translation $translation } Connection instproc importSSL args { #my showCall package require tls eval tls::import [my socket] $args } Connection instproc fconfigure args { #my showCall eval ::fconfigure [my socket] $args } Connection instproc event {type r method} { #my showCall my instvar req blocked # is the request in the argument list the currently active request? if {[info exists req] && $r == $req} { # a request can overwrite its active request if {$method eq ""} { ::fileevent [my socket] $type "" #my showMsg "CONNECTION clear for [my socket]" } else { #my showMsg "CONNECTION register for [my socket]" ::fileevent [my socket] $type [list $r $method] } } else { #my showMsg "event BLOCKING current request=$req, new=$r $method" #my showMsg "event BLOCKING rd=[::fileevent [my socket] readable]" #my showMsg "event BLOCKING wr=[::fileevent [my socket] writable]" #my showMsg "event BLOCKING bl=$blocked" ::lappend blocked $r $type $method } } Connection instproc hold {} { my set continueCmd [list ::fileevent [my socket] readable \ [::fileevent [my socket] readable]] ::fileevent $socket readable {} #my showVars continueCmd } Connection instproc resume {} { #my showCall if {[my exists continueCmd]} { eval [my set continueCmd] my unset continueCmd } } Connection instproc puts {string} { #my showCall if {[catch {::puts [my socket] $string} msg]} { ::puts stderr message=$msg } } Connection instproc puts-nonewline {string} { #my showCall if {[catch {::puts -nonewline [my socket] $string} msg]} { ::puts stderr message=$msg } } Connection instproc gets {var} { #my showCall upvar [self callinglevel] $var result if {[catch {set n [::gets [my socket] result]} msg]} { my set error $msg #my showMsg "CONNECTION error" return 0 } #my showMsg "n=$n, result=<$result>" return $n } Connection instproc read {} { #my showCall my instvar socket if {[catch {set result [::read $socket [::fconfigure $socket -buffersize]]} msg]} { my set error $msg return "" } #my showMsg Done return $result } Connection instproc readSize {length} { if {[catch {set result [::read [my socket] $length]} msg]} { my set error $msg return 0 } return $result } Connection instproc flush {} { #my showCall if {[catch {::flush [my socket]} msg]} { my set error $msg } } Connection instproc eof {} { #my showCall if {[my exists error]} { return 1 } else { return [::eof [my socket]] } } Connection instproc close {} { #my showCall my instvar req socket blocked if {![info exists socket]} return ;# error during connection open ::fileevent $socket readable "" ::fileevent $socket writable "" $req freeConnection if {[my exists persistent]} { my flush #::puts stderr "[self] PERSISTENT CONNECTION wanna close" if {$blocked eq ""} { ::fileevent $socket readable [list [self] destroy] unset req } else { #my showVars blocked set req [lindex $blocked 0] set type [lindex $blocked 1] set method [lindex $blocked 2] set blocked [lrange $blocked 3 end] #my showMsg "in persistent connection unblock $type [list $req $method]" ::fileevent $socket $type [list $req $method] } } else { #my showMsg "in nonpersistent connection blocked=$blocked" if {$blocked ne ""} { set req [lindex $blocked 0] set type [lindex $blocked 1] set method [lindex $blocked 2] set nblocked [lrange $blocked 3 end] close $socket unset socket if {[my exists handle]} { [self class] removeHandle [my handle] } if {[my exists error]} { #my showMsg "UNSETTING ERROR -----------" my unset error } my init set blocked $nblocked ::fileevent $socket $type [list $req $method] #my showMsg "REANIMATE $socket $type [list $req $method]" #my showVars } else { #my showMsg "Nothing blocked: readable=[::fileevent $socket readable]" my destroy } } } Connection instproc makePersistent {p} { if {$p} { my set persistent 1 } else { if {[my exists persistent]} { my unset persistent #my showMsg "no longer persistent" } } } namespace export Connection } namespace import ::xotcl::comm::connection::* if {[info command bgerror] eq ""} { proc bgerror {msg} { puts stderr "******* bgerror $msg $::errorInfo*****"} } ./xotcl-1.6.8/library/comm/._COPYRIGHT000644 000765 000024 00000000430 12327000555 017723 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/COPYRIGHT000644 000765 000024 00000003401 12327000555 017507 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/comm/._Dav.xotcl000644 000765 000024 00000000430 12161602263 020215 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Dav.xotcl000644 000765 000024 00000010625 12161602263 020007 0ustar00neumannstaff000000 000000 # $Id: Dav.xotcl,v 1.4 2006/02/18 22:17:33 neumann Exp $ package provide xotcl::comm::dav 1.0 package require XOTcl 1 namespace eval ::xotcl::comm::dav { package require xotcl::comm::httpAccess namespace import ::xotcl::* Class Dav -superclass Http Dav instproc initialize args { my instvar contentType #showCall set contentType text/xml next } Dav instproc PROPFIND {} { #showCall # extra dav headers # Depth: ("0" | "1" | "infinity") [infinity is the default] # body is a propfind XML-Element # # # # # this should be set by the clients # # # # my open } Dav instproc PROPPATCH {} { #showCall # body is a propertyupdate XML-Element # # # # set xmlReqBody($method) " # # # # # # # " my open } Dav instproc MKCOL {} { #showCall # invoked without a request body (may contain a message body?) my open } Dav instproc GET {} { #showCall # invoked without a request body and without extra header # back to HTTP class next } Dav instproc HEAD {} { #showCall # invoked without a request bodyand without extra header # back to HTTP class next } Dav instproc POST {} { #showCall # the same as in RFC2068 # back to HTTP class next } Dav instproc DELETE {} { #showCall # extra dav headers # Depth: ("0" | "1" | "infinity") # invoked without a request body my open } Dav instproc PUT {} { #showCall # PUT for Non-Collection Resources --> RFC2068 # PUT for Collections --> MKCOL # next } Dav instproc COPY {} { #showCall # extra dav headers # If: [see 9.4 WebDAV] # Destination: [see RFC2396 for the definition of absolutURI] # Depth: ("0" | "1" | "infinity") # Overwrite: ("T" | "F") # body is a propertybehavior XML-Element # # # # my open } Dav instproc MOVE {} { #showCall # extra dav headers # If: [see 9.4 WebDAV] # Destination: [see RFC2396 for the definition of absolutURI] # Depth: "infinity" [see 8.9.2] # Overwrite: ("T" | "F") # body is a propertybehavior XML-Element # see COPY my open } Dav instproc LOCK {} { #showCall # extra dav headers # If: [see 9.4 WebDAV] # Destination: [see RFC2396 for the definition of absolutURI] # Depth: ("0" | "1" | "infinity") # Timeout: [see 9.8 WebDAV] # Authorization: (defined in HTTP1.1 in 14.8) # body is a lockinfo XML-Element # # # # # # # my open } # The Lock-Token request header is used with the UNLOCK method to # identify the lock to be removed. Dav instproc UNLOCK {} { my instvar headers #showCall # extra dav headers # Lock-Token: [see 8.11 in WebDAV] # invoked without a request body my open } #--------------------- # Utility # #--------------------- #? Object xmlReqBodyManager xmlReqBodyManager proc requireXmlReqBody {request} { } #? Object davHeaderManager davHeaderManager proc requireDavHeader {request} { } #LOCK /DAV/welcome.html HTTP/1.1 #Host: wawog #Connection: close namespace export Dav \ xmlReqBodyManager davHeaderManager } namespace import ::xotcl::comm::dav::* ./xotcl-1.6.8/library/comm/._Ftp.xotcl000644 000765 000024 00000000430 12161602316 020233 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Ftp.xotcl000644 000765 000024 00000011124 12161602316 020020 0ustar00neumannstaff000000 000000 # $Id: Ftp.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ package provide xotcl::comm::ftp 1.0 package require xotcl::comm::httpAccess package require XOTcl 1 namespace eval ::xotcl::comm::ftp { namespace import ::xotcl::* Class Ftp -superclass NetAccess -parameter {user passwd} Ftp instproc initialize args { #my showCall my instvar port caching user passwd loginMsg resp blocksize set port 21 set blocksize 1024 set caching 0 set user ftp set passwd cineast@ set loginMsg {} set resp(connect) {220 provideUser} set resp(provideUser) {331 providePasswd} set resp(providePasswd) {230 loginFinished} set resp(loginFinished) {227 pasv} set resp(pasv) {200 type} set resp(type-list) {150 list} set resp(type-retr) {150 retr 550 retry-retrieve} set resp(transfer) {226 transferDone} next } Ftp instproc err {state reply} { my abort "Error in $state: $reply" } Ftp instproc queryServer {query state} { my instvar S puts $S $query flush $S fileevent $S readable [::list [self] response $state] } Ftp instproc response {state} { #my showCall my instvar S code msg set reply [gets $S] #my showVars reply if {[regexp {^([0-9]+)[-](.*)$} $reply _ code msg]} { fileevent $S readable [::list [self] responseMulti $state] } else { regexp {^([0-9]+) (.*)$} $reply _ code msg my responseEnd $state } } Ftp instproc responseMulti {state} { # multi line response my instvar S code msg set m [gets $S] if {[regexp "^$code " $m]} { my responseEnd $state } else { # try to strip code and dash regexp "^$code-(.*)\$" $m _ m append msg \n$m } } Ftp instproc responseEnd {state} { my instvar S code msg resp fileevent $S readable {} #puts stderr "code=$code, msg=<$msg>" foreach {c newState} $resp($state) { if {$c == $code} { return [my $newState] } } my err $state "expected=$resp($state), got $code $msg" } Ftp instproc GET {} { my instvar S host port url regexp {^(.*):([0-9]+)$} $host _ host port my running # rb running my $url ;# ??? # proxy ? set S [socket -async $host $port] fconfigure $S -blocking false -translation {auto crlf} fileevent $S readable [::list [self] response connect] } Ftp instproc provideUser {} { my instvar user msg loginMsg set loginMsg $msg my queryServer "USER $user" provideUser } Ftp instproc providePasswd {} { my instvar passwd # if {[pwdManager requirePasswd "Ftp $user\@$host" $user password]} { # my queryServer "PASS $password" providePasswd # } my queryServer "PASS $passwd" providePasswd } Ftp instproc loginFinished {} { my instvar msg loginMsg append loginMsg \n$msg my queryServer "PASV" loginFinished } Ftp instproc pasv {} { my instvar S D msg set d {([0-9]+)} if {[regexp "\[(]$d,$d,$d,$d,$d,$d" $msg _ 1 2 3 4 p1 p2]} { if {[catch {set D [socket -async $1.$2.$3.$4 [expr {$p1*256 + $p2}]]} err ]} { return [my err $proc $err] } fconfigure $D -blocking no -translation binary } else { return [my err $proc $msg] } my queryServer "TYPE I" pasv } Ftp instproc type {} { my instvar path if {$path=={}} { my queryServer "LIST" type-list } elseif {[regexp /$ $path]} { my queryServer "LIST $path" type-list } else { my queryServer "RETR $path" type-retr } } Ftp instproc retry-retrieve {} { my instvar path url append url / my queryServer "LIST $path/" type-list } Ftp instproc list {} { my instvar S D contentType set contentType text/dirlist my headerDone fileevent $S readable [::list [self] response transfer] fileevent $D readable [::list [self] readData] } Ftp instproc read {} { # the method read is called by the more general method readData my instvar D block blocksize if {[::eof $D]} { set block "" close $D unset D } else { #puts stderr blocksize=$blocksize set block [::read $D $blocksize] #puts stderr read:[string length $block]bytes } } Ftp instproc transferDone {} { my instvar D S if {[info exists D]} { fileevent $S readable {} set block "" close $D unset D } my finish } Ftp instproc retr {} { my instvar S D msg totalsize contentType path regexp {[(]([0-9]+)[ ]+[Bb]ytes} $msg _ totalsize set contentType [Mime guessContentType $path] my headerDone if {[info exists S]} { # file dialog was not canceled fileevent $S readable [::list [self] response transfer] fileevent $D readable [::list [self] readData] fconfigure $D -translation binary } } namespace export Ftp } namespace import ::xotcl::comm::ftp::* ./xotcl-1.6.8/library/comm/._Httpd.xotcl000644 000765 000024 00000000430 12161612102 020557 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Httpd.xotcl000644 000765 000024 00000066677 12161612102 020373 0ustar00neumannstaff000000 000000 # # The XOTcl class Httpd implements an HTTP/1.0 and HTTP/1.1 server with # basic functionality. # # Gustaf Neumann (neumann@wu-wien.ac.at) set VERSION 1.1 package provide xotcl::comm::httpd $VERSION package require XOTcl 1 #package require xotcl::comm::httpAccess package require -exact xotcl::comm::connection 1.0 package require -exact xotcl::trace 1.0 package require -exact xotcl::comm::mime 1.0 namespace eval ::xotcl::comm::httpd { namespace import ::xotcl::* Class Httpd -parameter { {port 80} ipaddr {root ./} {logdir $::xotcl::logdir} {httpdWrk Httpd::Wrk} {redirects [list]} {workerTimeout 10000} } Httpd proc Date seconds {clock format $seconds -format {%a, %d %b %Y %T GMT} -gmt true} Httpd instproc checkRoot {} { my instvar root set root [string trimright $root /] if {![file isdir $root]} { puts stderr "Warning: create root directory '$root'" file mkdir $root } # make directory absolute set currentdir [pwd] cd $root set root [pwd] #puts stderr "[self] root=$root" cd $currentdir } proc ! string { set f [open [::xotcl::tmpdir]log w+]; puts $f "[clock format [clock seconds]] $string" close $f} Httpd instproc init args { my instvar port logdir logfile redirects if {![my exists workerMixins]} { my set workerMixins {} #puts stderr "resetting workermixins of [self]" } next set proto [string trim [namespace tail [my info class]] :d] puts stderr "Starting XOTcl [string toupper $proto] server $::VERSION\ [string tolower $proto]://[info hostname]:$port/" # Start a server by listening on the port if {[my exists ipaddr]} {set ip "-myaddr [my set ipaddr]"} {set ip ""} my set listen [eval [list socket -server [list [self] accept]] $ip $port] #my set listen [socket -server [list [self] accept] $port] my checkRoot if {![file isdir $logdir]} {file mkdir $logdir} set logfile [open $logdir/serverlog-$port a+] my array set requiresBody \ {GET 0 HEAD 0 POST 1 PUT 1 DELETE 0 OPTIONS 0 TRACE 0} } Httpd instproc destroy {} { # destructor catch {close [my set listen]} catch {close [my set logfile]} next } Httpd instproc accept {socket ipaddr port} { # Accept a new connection and set up a handler #puts stderr "using workermixins of [self] {[my set workerMixins]}" [my set httpdWrk] new -childof [self] -socket $socket -ipaddr $ipaddr \ -port $port -mixin [my set workerMixins] } Httpd instproc redirect list { foreach {pattern hostport} $list { my lappend redirects $pattern $hostport } } Class Httpd::Wrk -parameter {socket port ipaddr} Httpd::Wrk array set codes { 200 {Data follows} 201 {Created} 204 {No Content} 302 {Moved Temporarily} 304 {Not Modified} 400 {Bad Request} 401 {Unauthorized} 402 {Payment Required} 403 {Forbidden} 404 {Not Found} 405 {Method Not Allowed} 406 {Not Acceptable} 408 {Request Timeout} 411 {Length Required} 500 {Internal Server Error} 503 {Service Unavailable} 504 {Service Temporarily Unavailable} } Httpd::Wrk instproc formData {} {my set formData} Httpd::Wrk instproc init args { # Constructor my instvar socket port ipaddr my set formData [list] my set replyHeaderFields [list] next my makeConnection $socket my log Connect "$ipaddr $port" my connection translation {auto crlf} my connection event readable [self] firstLine } Httpd::Wrk instproc makeConnection {socket} { Connection create [self]::connection -socket $socket -req [self] } Httpd::Wrk instproc close {} { # logical close of a single request #my showCall my instvar version timeout meta set eof [my connection eof] if {$version > 1.0 && !$eof} { #my showMsg "!EOF in http/$version" my connection flush set timeout [after [[my info parent] workerTimeout] [self] destroy] ### reset parameters, worker will be potentially reused if {[array exists meta]} { unset meta array set meta {} } unset version if {[my exists user]} { my unset user my unset realm } foreach c [my set formData] { $c destroy } my set replyHeaderFields [list] my set formData {} #my showVars my connection translation {auto crlf} my connection event readable [self] firstLine } elseif {$eof} { #my showMsg "Destroy in http/$version" # the client side has closed the connection my destroy } else { #my showMsg "!EOF in http/$version ???" # we close the conneciton actively (e.g. forced by an error) my connection flush #puts stderr "DESTROY----this line should never show up" my destroy } } Httpd::Wrk instproc destroy {} { #my showCall if {[my isobject [self]::connection]} { my connection close } next } Httpd::Wrk instproc freeConnection {} { } Httpd::Wrk instproc firstLine {} { # Read the first line of the request #my showCall my instvar method resourceName hasFormData query fileName \ version timeout if {[info exists timeout]} { after cancel $timeout unset timeout } my lappend replyHeaderFields Date [Httpd Date [clock seconds]] set n [my connection gets firstLine] if {$n > 0} { #::puts stderr "[self] firstline=<$firstLine>" # parse request line, ignore HTTP version for now if {[regexp {^(POST|GET|PUT|HEAD|OPTIONS) ([^?]+)(\??)([^ ]*) *HTTP/(.*)$} \ $firstLine _ method resourceName hasFormData query version]} { set resourceName [string trimright [string trimleft $resourceName ./] " "] # construct filename [my info parent] instvar root set fileName $root/[url decodeName $resourceName] #puts stderr ---[encoding convertfrom utf-8 $fileName]---- set fileName [encoding convertfrom utf-8 $fileName] # my decode-formData $query my log Query $firstLine if {[my exists forceVersion1.0]} { set version 1.0 } my connection makePersistent [expr {$version > 1.0}] my connection event readable [self] header } else { set version 1.0 set resourceName ??? set method ??? my log Error "bad first line:$firstLine" my replyCode 400 my replyErrorMsg } } elseif {![my connection eof]} { #my showMsg "+++ not completed EOF=[my connection eof]" } else { set version 1.0 #my showMsg "+++ n=negative ($n) EOF=[my connection eof] version set to 1.0" my close } } Httpd::Wrk instproc header {} { # Read the header #my showCall my instvar method data if {[my connection gets line] > 0} { #puts stderr line=$line if {[regexp -nocase {^([^:]+): *(.+)$} $line _ key value]} { my set meta([string tolower $key]) $value } } else { #puts stderr line-EMPTY if {[my exists meta(content-length)] && [my set meta(content-length)]>0} { #puts stderr "we have content-length [my set meta(content-length)]" set data "" my connection translation binary my connection event readable [self] receive-body } elseif {[my exists meta(content-type)] && [regexp -nocase {multipart/form-data; *boundary=} \ [my set meta(content-type)]]} { #puts stderr "formdata" set data "" my connection event readable [self] receive-body } else { #puts stderr "no-content-length, triggering respond" my connection event readable [self] "" [my info parent] instvar requiresBody if {$requiresBody($method)} { my replyCode 411 my replyErrorMsg } else { my check-redirect } } } } Httpd::Wrk instproc receive-body {} { ;# ... now we have to read the body #my showCall my instvar method data meta set d [my connection read] if {$d ne ""} { append data $d #my showMsg "datal=[string length $data], cl=$meta(content-length)" if {[string length $data] >= $meta(content-length)} { my connection event readable [self] "" if {$method eq "POST"} { my decode-POST-query } my check-redirect } } else { ;# 0 byte, must be eof... my showMsg "received 0 bytes" my connection event readable [self] "" if {[string length $data] < $meta(content-length)} { my replyCode 404 my replyErrorMsg } else { my check-redirect } } } Httpd::Wrk instproc unmodified mtime { my instvar meta if {[info exists meta(if-modified-since)]} { set ms $meta(if-modified-since) regexp {^([^;]+);(.*)$} $ms _ ms options if {[catch {set mss [clock scan $ms]}]} { regsub -all -- {-} $ms " " ms if {[catch {set mss [clock scan $ms]}]} { set ms [lreplace $ms end end] set mss [clock scan $ms] } } return [expr {$mtime <= $mss}] } return 0 } Httpd::Wrk instproc check-redirect {} { [my info parent] instvar redirects my instvar resourceName hasFormData query set resource $resourceName$hasFormData$query foreach {pattern hostport} $redirects { #puts stderr "match <$pattern> <$resource> [regexp $pattern $resource]" if {[regexp $pattern $resource]} { #puts stderr "do redirect to $hostport/$resource" my replyCode 302 location $hostport/$resource my replyErrorMsg return } } my respond } Httpd::Wrk instproc respond {} { # Respond to the query # the request was read completely... This method is wellsuited for mixins! my respond-[my set method] } Httpd::Wrk instproc respond-GET {} { #my showCall my instvar fileName my sendFile $fileName } Httpd::Wrk instproc respond-HEAD {} { # Respond to the query my instvar fileName if {[file readable $fileName]} { my replyCode 200 \ Last-Modified [Httpd Date [file mtime $fileName]] \ Content-Type [Mime guessContentType $fileName] \ Content-Length [file size $fileName] my connection puts "" #my log Done "$fileName [Mime guessContentType $fileName]" my close } else { my replyCode 404 my replyErrorMsg } } Httpd::Wrk instproc respond-OPTIONS {} { # Respond to the query my replyCode 200 \ Allow "OPTIONS, GET, HEAD, POST" \ Public "OPTIONS, GET, HEAD, POST" my connection puts "" my close } Httpd::Wrk instproc respond-PUT {} { my instvar data method fileName my replyCode [expr {[file writable $fileName] ? 200 : 201}] my connection puts "" set out [open $fileName w] fconfigure $out -translation binary puts -nonewline $out $data my log Done "$fileName [Mime guessContentType $fileName]" close $out my close } Httpd::Wrk instproc respond-CGI {} { my instvar fileName if {[file executable $fileName]} { my replyCode 200 my connection puts [exec $fileName] ;# no parameter handling yet my close } else { my replyCode 403 my replyErrorMsg } } Httpd::Wrk instproc new-formData {} { set arg [Object create [self]::[my autoname formData]] my lappend formData $arg return $arg } Httpd::Wrk instproc decode-formData {query} { #my showCall foreach pair [split [string trimleft $query \n] &] { set arg [my new-formData] if {[regexp {^(.+)=(.*)$} $pair _ name content]} { $arg set name [url decodeItem $name] $arg set content [url decodeItem $content] } else { $arg set content [url decodeItem $pair] } } } Httpd::Wrk instproc decode-POST-query {} { if {[my exists meta(content-type)]} { set ct [my set meta(content-type)] if {[regexp -nocase {application/x-www-form-urlencoded} $ct]} { #my showMsg "ordinary FORM" my decode-formData [my set data] return } elseif {[regexp -nocase {multipart/form-data; *boundary=(.*)$} $ct \ _ boundary]} { #my showMsg "multipart FORM" set parts [my set data] set bl [expr {[string length $boundary]+2}] while {[set endIDX [string first --$boundary $parts]] > -1} { set part [string range $parts $bl [expr {$endIDX-1}]] if {[set endHD [string first \r\n\r\n $part]] > -1} { set arg [my new-formData] if {[catch {Mime multipart-decode-header \ [string range $part 0 [expr {$endHD-1}]] \ $arg} msg]} { my replyCode 406 my replyErrorMsg $msg return 0 } $arg set content [string range $part \ [expr {$endHD + 4}] \ [expr {[string length $part] -3}]] #$arg showVars } set parts [string range $parts [expr {$endIDX+2}] end] } } } } Httpd::Wrk instproc respond-POST {} { my replyCode 405 my replyErrorMsg #my respond-CGI } Httpd::Wrk instproc replyErrorMsg {{msg ""} args} { my instvar replyCode [self class] instvar codes foreach {tag value} $args {my connection puts "$tag: $value"} my sendText "\nStatus Code: $replyCode\n\ $msg

\n\ Status Code $replyCode: $codes($replyCode)
\n\ Resource Name: [my set resourceName]\n" my close ;# close must be last call } Httpd::Wrk instproc replyCode {code args} { #my showCall my instvar version [self class] instvar codes my set replyCode $code my connection puts "HTTP/$version $code $codes($code)" foreach {tag value} [my set replyHeaderFields] {my connection puts "$tag: $value"} foreach {tag value} $args {my connection puts "$tag: $value"} if {$code >= 400} { my log Error "$code $codes($code)\tmeta: [my array get meta]" } else { my log Done "$code $codes($code)" } } Httpd::Wrk instproc sendText {response {type text/html}} { #my showCall my connection puts "Content-Type: $type" # bei einer leeren Responses blockieren Klienten und melden Fehler if {$response eq ""} { set response " " } my connection puts "Content-Length: [string length $response]\n" if {[my set method] ne "HEAD"} { my connection fconfigure -translation {auto binary} my connection puts-nonewline $response } else { my showMsg HEAD! } } Httpd::Wrk instproc sendMsg {response {type text/html}} { # my showCall my replyCode 200 my sendText $response $type my close } Httpd::Wrk instproc sendDir {dirName} { [my info parent] instvar root set title "Directory listing" set reply "$title

$title

\n\n" set oldpwd [pwd] cd $root set dirs ""; set files "" foreach f [lsort -dictionary [glob -nocomplain ./$dirName/*]] { set full [file join $root $f] set pname [string trimleft $f ./] if {[file isdir $full]} { append pname / } if {![catch {set size [file size $full]}]} { # it is not a broken link set entry "" append entry \ \ " \ " \ \n if {[string match */ $pname]} {append dirs $entry} else {append files $entry} } } append reply $dirs $files "
"$pname" " $size " [clock format [file mtime $full]]
\n" cd $oldpwd my sendMsg $reply return } Httpd::Wrk instproc sendFile {fn {type ""}} { #my showCall if {[file isdirectory $fn]} { set full [file join $fn index.html] if {[file readable $full]} { set fn $full } else { my sendDir [my set resourceName] return } } #puts stderr "readable '$fn' [file readable $fn]" if {[file readable $fn]} { set mtime [file mtime $fn] if {[my unmodified $mtime]} { my replyCode 304 my replyErrorMsg return } if {$type eq ""} {set type [Mime guessContentType $fn]} my replyCode 200 \ Last-Modified [Httpd Date $mtime] \ Content-Type $type \ Content-Length [file size $fn] my connection puts "" my connection fconfigure -translation binary ;#-buffersize 65536 set localFile [open $fn] fconfigure $localFile -translation binary -buffersize 65536 fcopy $localFile [my connection set socket] \ -command [list [self] fcopy-end $localFile] } else { my replyCode 404 my replyErrorMsg } } Httpd::Wrk instproc fcopy-end {localFile args} { # End of fcopy close $localFile my connection fconfigure -blocking false ;# fconfigure changes blocking in 8.3.2! my close } Httpd::Wrk instproc log {reason arg} { # trivial logging my instvar port ipaddr if {[my exists user]} { set user [my set user]/[my set realm] } {set user -} [my info parent] instvar logfile puts $logfile "[clock format [clock seconds]] $user $ipaddr:$port\t$reason\t$arg" flush $logfile } ######################################################################### Class Httpsd -superclass Httpd -parameter { {port 443} {httpdWrk Httpsd::Wrk} {requestCert 0} {requireValidCert 0} {certfile filename.crt} {keyfile filename.key} {cafile cacert.pem} {infoCb {}} } Httpsd instproc init args { package require tls proc tls::password {} { puts stderr "getting passwd" return pemp } next } Class Httpsd::Wrk -superclass Httpd::Wrk Httpsd::Wrk instproc firstLine {} { my set forceVersion1.0 1 my lappend replyHeaderFields Connection close next } Httpsd::Wrk instproc makeConnection {socket} { Connection create [self]::connection -socket $socket -req [self] [my info parent] instvar \ keyfile certfile cafile infoCb requestCert requireValidCert # SSL-enable a regular Tcl channel - it need not be a socket, but # must provide bi-directional flow. Also setting session parameters # for SSL handshake. www.sensus.org/tcl/tls.htm # -request bool --> Request a certificate from peer during SSL # handshake. (default: true) # -require bool --> Require a valid certificate from peer during SSL # handshake. If this is set to true then -request must also be set # to true. (default: false) # -server bool --> Handshake as server if true, else handshake as # client.(default: false) my connection importSSL -server 1 \ -certfile $certfile \ -keyfile $keyfile \ -cafile $cafile \ -request $requestCert \ -require $requireValidCert \ -command $infoCb } ######################################################################### ### ### Mixin-Classes for respond patterns ### mixes into Http and Httpd::Wrk ### Class Httpd::Responder Httpd::Responder instproc init args { next my lappend workerMixins Httpd::Responder::Wrk my set respondpatterns {} # Example how to register new methods: regexp is matched with the triple # (HTTP-METHOD URL HASFORMDATA) where HASFORMDATA is empty when no # parameters are given. The parsed components of the url etc. are # available as instvars my actions {^GET cgi[-]bin [?]} respond-CGI } Httpd::Responder instproc actions {regexp method} { my lappend respondpatterns $regexp $method } Class Httpd::Responder::Wrk Httpd::Responder::Wrk instproc respond {} { my instvar fileName method resourceName hasFormData [my info parent] instvar respondpatterns ### auch das ist ein kandidat fuer eine chain of responsibility foreach {pattern action} $respondpatterns { if {[regexp $pattern "$method $resourceName $hasFormData"]} { my $action return } } next } ### ### Mixin-Classes for Access Control ### mixes into Http and Httpd::Wrk ### Class Httpd::AccessControl Httpd::AccessControl abstract instproc protectedResource {fn method varAuthMethod varRealm} Httpd::AccessControl abstract instproc credentialsNotOk {wrk credentials authMethod realm} Httpd::AccessControl abstract instproc addRealmFile {realm authFile} Httpd::AccessControl abstract instproc addRealmEntry {realm passwds} Httpd::AccessControl abstract instproc protectDir {realm path methods} Class Httpd::AccessControl::Wrk Httpd::AccessControl::Wrk instproc respond {} { my instvar fileName method digestChallengeData set controller [my info parent] if {[$controller protectedResource $fileName $method authMethod realm]} { #my showMsg "*** Protected resource: $fileName $method" if {![my exists meta(authorization)] || [$controller credentialsNotOk [self] \ [my set meta(authorization)] $authMethod $realm]} { my unauthorizedAccess $realm return } } next } ########################################################################### ## Basic Access Control ########################################################################### Class Httpd::BasicAccessControl -superclass Httpd::AccessControl Httpd::BasicAccessControl instproc initWorkerMixins {} { my lappend workerMixins [self class]::Wrk } Httpd::BasicAccessControl instproc init args { next my initWorkerMixins } Httpd::BasicAccessControl instproc protectedResource {fn method varAuthMethod varRealm} { #my showCall # check whether access to $fn via $method is protected upvar [self callinglevel] $varAuthMethod authMethod $varRealm realm # we check only the current directory, not the parent directories if {[string match */ $fn]} { set path $fn } else { set path [file dirname $fn]/ } foreach i [list $path $path:$method] { if {[my exists protected($i)]} { set realm [my set protected($i)] set authMethod Basic return 1 } } return 0 } Httpd::BasicAccessControl instproc credentialsNotOk {wrk credentials authMethod realm} { # check whether $credentials are sufficient for $realm regexp {^(.*):(.*)$} [base64 decode [lindex $credentials 1]] _ user pwd #puts stderr "passwd($realm:$user)=[my exists passwd($realm:$user)]" $wrk set user $user $wrk set realm $realm if {[my exists passwd($realm:$user)]} { return [expr {[my set passwd($realm:$user)] != $pwd}] } return 1 } Httpd::BasicAccessControl instproc addRealmEntry {realm passwds} { if {[llength $passwds] == 1} { my addRealmFile [lindex $passwds 0] } else { foreach {name pwd} $passwds { #puts stderr "realm='$realm' adding user: $name pw: $pwd" my set passwd($realm:$name) $pwd } } } Httpd::BasicAccessControl instproc addRealmFile {realm authFile} { set FILE [open $authFile r] while {![eof $FILE]} { foreach {name pwd} [split [gets $FILE] :] { my addRealmEntry $realm [list $name $pwd] } } close $FILE } Httpd::BasicAccessControl instproc protectDir {realm path methods} { my instvar root my checkRoot set resource $root/$path ;# resources are currently directories if {$methods == {}} { my set protected($resource) $realm ;#for every method } else { foreach m $methods { my set protected($resource:$m) $realm ;#for selected methods } } } Class Httpd::BasicAccessControl::Wrk -superclass Httpd::AccessControl::Wrk Httpd::BasicAccessControl::Wrk instproc unauthorizedAccess {realm} { my set digestChallengeData(realm) $realm my replyCode 401 www-authenticate "Basic realm=\"$realm\"" my replyErrorMsg "Unauthorized request for realm '$realm'" } ########################################################################### ## Digest Access Control ########################################################################### Class Httpd::DigestAccessControl -superclass Httpd::BasicAccessControl Httpd::DigestAccessControl instproc init args { package require tcu next my lappend workerMixins [self class]::Wrk } Httpd::DigestAccessControl instproc credentialsNotOk {wrk credentials authMethod realm} { # check whether $credentials are sufficient for $realm my showMsg "Digest Authentication ..." # HELP FD: hier muss ich noch überprüfen, ob die digest-header # (credentials) ok sind. Hier habe ich probleme auf die sachen, # die der worker gesendet (bspw. nonce) hat zu kommen. Ich # weiß, man kann mit [my info children] daran kommen. Aber, # was ist, wenn man mehrere Worker hat? ## Fredj, das sollte kein Problem sein: das credentialsNotOk wird ## vom aktuellen worker (respond) aufgerufen. man kann dem *NotOk ## den worker mitgeben, oder die beiden Methoden etwas umorganisieren. return } Class Httpd::DigestAccessControl::Wrk -superclass Httpd::BasicAccessControl::Wrk Httpd::DigestAccessControl::Wrk instproc unauthorizedAccess {realm} { my set digestChallengeData(realm) $realm my replyCode 401 www-authenticate "Digest [my digestChallenge]" my replyErrorMsg "Unauthorized request for realm '$realm'" } Httpd::DigestAccessControl::Wrk instproc digestChallenge {} { my showCall my instvar digestChallengeData my mkDigestChallengeData set digestResponse {} foreach {t v} [array get digestChallengeData] { append digestResponse "$t = \"$v\", " } regsub {, $} $digestResponse {} digestResponse return $digestResponse } Httpd::DigestAccessControl::Wrk instproc mkDigestChallengeData {} { my showCall my instvar digestChallengeData # RFC 2617 # challenge = "Digest" digest-challenge # digest-challenge = 1#( realm | [ domain ] | nonce | # [ opaque ] |[ stale ] | [ algorithm ] | # [ qop-options ] | [auth-param] ) # domain = "domain" "=" <"> URI ( 1*SP URI ) <"> # URI = absoluteURI | abs_path # nonce = "nonce" "=" nonce-value # nonce-value = quoted-string # opaque = "opaque" "=" quoted-string # stale = "stale" "=" ( "true" | "false" ) # algorithm = "algorithm" "=" ( "MD5" | "MD5-sess" | token ) # qop-options = "qop" "=" <"> 1#qop-value <"> # qop-value = "auth" | "auth-int" | token # FD: hier würde man die nötigen parametern (nonce,domain,opaque, # etc.) berechnen und in dem asso. Array speichern. # FD: minimale Anforderung set digestChallengeData(nonce) [my genNonce] set digestChallengeData(opaque) [base64 encode [self]:my-self-spcified-string] set digestChallengeData(algorithm) "MD5" ;#default set digestChallengeData(qop) "auth" set digestChallengeData(domain) [array names [my info parent]::protected] } Httpd::DigestAccessControl::Wrk instproc genNonce {} { my showCall my instvar digestChallengeData set timeStamp [clock seconds] set nonce [base64 encode [md5 $timeStamp:[self]]] return $nonce } # # example usage: #Httpd h1 -port 8081 -root [glob ~/wafe] #Httpd h2 -port 9086 -root $root \ -mixin {Httpd::Responder Httdp::BasicAccessControl} \ -addRealmEntry test {test test} -protectDir test "" {} \ -redirect {^(mailman|pipermail|cgi-bin) http://alice.wu-wien.ac.at:80} namespace export Httpd Httpsd namespace eval Httpd { namespace export Wrk \ AccessControl BasicAccessControl DigestAccessControl \ Responder } namespace eval Httpsd { namespace export Wrk } #namespace eval Responder {namespace export Wrk} #namespace eval AccessControl {namespace export Wrk} #namespace eval BasicAccessControl {namespace export Wrk} #namespace eval DigestAccessControl {namespace export Wrk} } namespace import ::xotcl::comm::httpd::* namespace eval Httpd {namespace import ::xotcl::comm::httpd::Httpd::*} namespace eval Httpsd {namespace import ::xotcl::comm::httpd::Httpsd::*} #namespace eval Responder {namespace import ::xotcl::comm::httpd::Responder::*} #namespace eval AccessControl {namespace import ::xotcl::comm::httpd::AccessControl::*} #namespace eval BasicAccessControl {namespace import ::xotcl::comm::httpd::BasicAccessControl::*} #namespace eval DigestAccessControl {namespace import ::xotcl::comm::httpd::DigestAccessControl::*} ./xotcl-1.6.8/library/comm/._Imap.xotcl000644 000765 000024 00000000430 12161602407 020371 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Imap.xotcl000644 000765 000024 00000013041 12161602407 020156 0ustar00neumannstaff000000 000000 # $Id: Imap.xotcl,v 1.4 2006/02/18 22:17:33 neumann Exp $ package provide xotcl::comm::imap 1.0 package require XOTcl 1 namespace eval ::xotcl::comm::imap { package require xotcl::comm::httpAccess namespace import ::xotcl::* Class Imap -superclass NetAccess -parameter {user} Imap instproc initialize args { my instvar port caching tokenCounter resp token set port 143 set caching 1 set resp(connect) {"[*] OK" login} set resp(login) {"A[0-9]+ OK" loginFinished "A[0-9]+ NO" login} set resp(loginFinished) {"[*] [0-9]+" inboxSize "[*] OK" inboxSelected} set resp(mailSelected) {"[*] [0-9]+ FETCH" fetchBody "A[0-9]+ OK " ignoreLine "[*] " ignoreLine} set resp(heads) {"[*] [0-9]+ FETCH" fetchHeaders "A[0-9]+ OK " ignoreLine "[*] " ignoreLine} set tokenCounter 0 next set token NONE } Imap instproc err {state reply} { my abort "Error in $state: $reply" } Imap instproc token {} { my instvar tokenCounter return [format {A%.4d} [incr tokenCounter]] } Imap instproc imapString {input} { regsub -all {(["\])} $input {\\\1} output ;#" return \"$output\" } Imap instproc queryServer {query state} { #my showCall my instvar S token set token [my token] puts $S "$token $query" #puts stderr "$token $query" flush $S fileevent $S readable [list [self] response $state] } Imap instproc response {state} { my instvar S resp msg token set msg [gets $S] #my showVars msg token foreach {c newState} $resp($state) { if {![regexp {^[*]} $msg] && ![regexp ^$token $msg]} { my showMsg "$state: token=$token IGNORING $msg" return } if {[regexp ^$c $msg]} { #my showMsg "$state NEWSTATE $newState" return [my $newState] } } my err $state "expected=$resp($state), got $msg" } Imap instproc GET {} { my instvar state S path host port user inbox mailNr # number at end of path is the message number in the mailbox if {[regexp {^([^/]+)/([^/]+)/([0-9]+)$} $path _ user inbox mailNr]} { } elseif {[regexp {^([^/]+)/([^/]+)/?$} $path _ user inbox]} { } else { my abort "invalid imap path $path" } regexp {^(.*):([0-9]+)$} $host _ host port # proxy ? if {[catch {set S [socket -async $host $port]} err]} { my abort "Could not open connection to host '$host:$port'\n $err" } else { fconfigure $S -blocking false fileevent $S readable [list [self] response connect] } } Imap instproc login {} { my instvar user host password if {[pwdManager requirePasswd "Imap $user\@$host" $user password]} { my queryServer "login $user [my imapString $password]" login } else { what now? } } Imap instproc loginFinished {} { my instvar user host password inbox pwdManager storePasswd "Imap $user\@$host" $user $password my queryServer "select $inbox" loginFinished } Imap instproc inboxSize {} { my instvar msg nrMails regexp {^[*] ([0-9]+) EXISTS} $msg _ nrMails } Imap instproc inboxSelected {} { my instvar msg contentType nrMails mailNr if {[info exists mailNr]} { set contentType text/plain my body-state my queryServer "fetch $mailNr rfc822" mailSelected } else { my instvar header inbox block host user block set contentType text/html my body-state set what "Mailbox $inbox of $user@$host" set block "$what\n" append block "

$what

\n" \ "The following $nrMails messages are in this mailbox:" \ "

\n

\n" my pushBlock my set state 4 my finish } } } namespace export Imap } namespace import ::xotcl::comm::imap::* ./xotcl-1.6.8/library/comm/._Ldap.xotcl000644 000765 000024 00000000430 12161602354 020364 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Ldap.xotcl000644 000765 000024 00000007737 12161602354 020170 0ustar00neumannstaff000000 000000 package provide xotcl::comm::ldap 1.0 package require xotcl::wafecompat ; # Get 'requireModules'. package require XOTcl 1 namespace eval ::xotcl::comm::ldap { namespace import ::xotcl::* requireModules { ldapOpen ldaplibGen.so } Class Ldap -superclass NetAccess -parameter {host port dn attributes scope filter} Ldap instproc initialize args { my instvar port mapToC useCache my set port 389 my set useCache 0 set mapToC(one) onelevel set mapToC(sub) subtree set mapToC(base) base next } Ldap proc urlDecode string { set toParse $string set parsed "" while {1} { if {[regexp {^([^%]*)%(..)(.*)$} $toParse _ front hex toParse]} { append parsed $front [binary format c 0x$hex] } else { append parsed $toParse break } } return $parsed } Ldap instproc getUrlcomponents {} { showCall my instvar path dn attributes scope filter url set path [Ldap urlDecode $path] puts stderr "___ path=<$path>" if {[regexp -nocase {^/([^?]*)(\?([^?]*)(\?([^?]*)(\?([^?]*))?)?)?$} \ $path _ dn a attributes s scope f filter]} { if {$scope eq ""} { set scope "base" } if {$filter eq ""} { set filter "(objectClass=*)" } } else { set errmsg "*** Ldap Url trail=<$path> does not match!\n" append errmsg "___ RFC 1959 says:\n" append errmsg " ldap://:/\[?\[??\]\]\n" append errmsg "___ Cineast and Netscape uses:\n" append errmsg " ldap://:/\[?\[?\[?\]\]\]" my abort "Unsupported URL: '$url' \n $errmsg" } } Ldap instproc GET {} { my instvar contentType totalsize state currentsize informObjects block showCall set contentType text/html my getUrlcomponents if {"start" ne $state } { puts stderr "... [self]:$proc ignoring request in state $state" return } my open my search my body-state set totalsize [string length $block] set currentsize $totalsize foreach obj $informObjects { $obj incCb [self] $totalsize $currentsize } my eof } Ldap instproc open {} { showCall my instvar port host ldapHandle set ldapHandle [ldapOpen $host $port] } Ldap instproc bind {} { my instvar ldapHandle showCall } Ldap instproc search {} { showVars my instvar url ldapHandle searchHandle dn attributes scope filter results mapToC path set searchHandle [ldapSearch $ldapHandle $dn \ $mapToC($scope) $filter [split $attributes ,] false results] set nentries [ldapCountEntries $ldapHandle $searchHandle] puts stderr "*** nentries = $nentries" if {!$nentries} {set results ""} my response } Ldap instproc getAttrs {dn} { } Ldap instproc makeUrl {dn} { showCall my instvar port host scope filter attributes set tmpUrl ldap://$host:$port/$dn?$attributes?$scope?$filter return "$dn" } Ldap instproc response {} { showCall my instvar block results attrsVals ldapHandle searchHandle set block " LDAP searching result!!

Result

\n
    \n" foreach {resDN} $results { append block "
  • [my makeUrl $resDN]

    \n

      \n" ldapAttributes $ldapHandle $searchHandle $resDN attrsVals foreach {a v} [array get attrsVals] { append block "
    • $a = $v

      \n" } append block "

    \n" } append block "
\n \n" } # destructor: Close Connection to LDAP-Server and unbind Ldap instproc destroy {} { showCall my instvar ldapHandle if {[catch {ldapUnbind $ldapHandle} error]} { return $error } my freeSearchHandle } Ldap instproc close {} { showCall my destroy next } Ldap instproc freeSearchHandle {} { showCall my instvar searchHandle if {[info exists searchHandle]} { ldapFreeSearch $searchHandle } } namespace export Ldap } namespace import ::xotcl::comm::ldap::* ./xotcl-1.6.8/library/comm/._Mime.xotcl000644 000765 000024 00000000430 12161602336 020373 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/Mime.xotcl000644 000765 000024 00000016305 12161602336 020166 0ustar00neumannstaff000000 000000 # $Id: Mime.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $ package provide xotcl::comm::mime 1.0 package require XOTcl 1 namespace eval ::xotcl::comm::mime { namespace import ::xotcl::* ####################################################################### Class MimeTypeLoader MimeTypeLoader instproc loadMimeTypes {file} { if {![file exists $file]} return puts stderr "Loading Mime types from $file" set f [open $file r] set content [read $f] close $f regsub -all "\\\\ *\n" $content " " content foreach line [split $content \n] { set line [string trim $line] if {[regexp ^\# $line]} continue if {$line eq ""} continue regsub -all " +" $line " " line #puts stderr <$line> while {$line ne ""} { if {[regexp {^ *([^ ]+)=\"([^\"]+)\" *(.*)$} $line _ key value line]} { set v([string tolower $key]) $value } elseif {[regexp {^ *([^ ]+)=([^ ]+) *(.*)$} $line _ key value line]} { set v([string tolower $key]) $value } else { set tokens [split $line] if {![regexp / [lindex $line 0]]} { puts stderr "Mime: cannot parse line '$line' in $file" } else { set v(exts) [join [lrange $tokens 1 end] ,] set v(type) [lindex $tokens 0] } break } } if {[info exists v(exts)] && [info exists v(type)]} { set v(exts) [string tolower $v(exts)] set v(type) [string tolower $v(type)] foreach ext [split $v(exts) ,] { set ext [string trimleft $ext .] #puts stderr "ext '$ext', contentType = '$v(type)'" my set extTable($ext) $v(type) } unset v(exts) v(type) } else { puts stderr "invalid mime entry in $file" } } } MimeTypeLoader instproc guessContentType {name} { my loadMimeTypes ~/.mime.types my mixin {} return [next] } Class MIME MIME instproc guessContentType {name} { my instvar extTable nameTable if {[regexp {\.([a-zA-Z0-9]+)$} $name _ ext]} { catch {set contentType $extTable([string tolower $ext])} } if {![info exists contentType]} { foreach namePattern [array names nameTable] { if {[regexp $namePattern $name]} { set contentType text/plain break } } } if {![info exists contentType]} { set contentType unknown/unknown } return $contentType } MIME instproc multipart-decode-header {header obj} { $obj instvar name filename contentType foreach line [split $header \r] { set line [string trim $line \n] #puts stderr line=$line if {[regexp -nocase {^Content-Disposition: *([^;]+);(.*)$} $line _ \ dispo detail]} { if {$dispo ne "form-data"} { error "Unknown Content Disposition '$line'" } if {![regexp -nocase { name *= *"([^\"]+)"} $line _ name]} { error "can't parse form-data name '$line'" } regexp -nocase {filename *= *"([^\"]+)"} $line _ filename } elseif {[regexp -nocase {^Content-Type: *([^; ]+)} $line _ contentType]} { } else { my showMsg "ignoring '$line'" } } } MIME create Mime -mixin MimeTypeLoader Mime array set nameTable { README text/plain } Mime array set extTable { gif image/gif xpm image/x-xpixmap xbm image/x-xbitmap jpg image/jpeg png image/x-png html text/html htm text/html xml text/xml css text/css ps application/postscript pdf application/pdf doc application/msword xls application/msexel } ################################################################## Class FormData FormData instproc encode list {;#RFC 1867 my showCall } FormData formData ################################################################## Class Base64 Base64 instproc init args { my instvar base64 base64_en # Emit base64 encoding for a string set i 0 foreach char {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ a b c d e f g h i j k l m n o p q r s t u v w x y z \ 0 1 2 3 4 5 6 7 8 9 + /} { set base64($char) $i set base64_en($i) $char incr i } next } Base64 instproc encode string { my instvar base64_en set result {} set length 0 foreach {a b c} [split $string {}] { scan $a %c x if {$c ne ""} { scan $b %c y scan $c %c z append result \ $base64_en([expr {($x>>2) & 0x3F}]) \ $base64_en([expr {(($x<<4) & 0x30) | (($y>>4) & 0xF)}]) \ $base64_en([expr {(($y<<2) & 0x3C) | (($z>>6) & 0x3)}]) \ $base64_en([expr {$z & 0x3F}]) } elseif {$b ne ""} { scan $b %c y append result \ $base64_en([expr {($x>>2) & 0x3F}]) \ $base64_en([expr {(($x<<4) & 0x30) | (($y>>4) & 0xF)}]) \ $base64_en([expr {($y<<2) & 0x3C}]) \ = } else { append result \ $base64_en([expr {($x>>2) & 0x3F}]) \ $base64_en([expr {($x<<4) & 0x30}]) \ == } if {[incr length 4] >= 72} { append result \n set length 0 } } return $result } Base64 instproc decode string { my instvar base64 set output {} set group 0 set j 18 foreach char [split $string {}] { if {$char != "="} { set group [expr {$group | ($base64($char) << $j)}] if {[incr j -6] < 0} { scan [format %06x $group] %2x%2x%2x a b c append output [format %c%c%c $a $b $c] set group 0 set j 18 } } else { scan [format %04x $group] %2x%2x a b if {$j==6} { append output [format %c $a] } else { append output [format %c%c $a $b] } break } } return $output } Base64 base64 ################################################################## Class Url Url instproc encode list { set result "" set sep "" foreach i $list { append result $sep [my encodeItem $i] if {$sep != "="} { set sep = } else { set sep & } } return $result } Url instproc encodeItem string { my instvar httpFormMap set alphanumeric a-zA-Z0-9. if {![info exists httpFormMap]} { for {set i 1} {$i <= 256} {incr i} { set c [format %c $i] if {![string match \[$alphanumeric\] $c]} { set httpFormMap($c) %[format %.2x $i] } } # these are handled specially array set httpFormMap { " " + \n %0d%0a } } regsub -all \[^$alphanumeric\] $string {$httpFormMap(&)} string regsub -all \n $string {\\n} string regsub -all \t $string {\\t} string regsub -all {[][{})\\]\)} $string {\\&} string return [subst $string] } Url instproc hexToChar hex { ::scan $hex %x h #my showMsg "::scan $hex %x h -> $h" format %c $h } Url instproc decodeItem string { #my showCall set result "" regsub -all {\+} $string " " string regsub -all {%0d%0a} $string "\n" string regsub -all {%([a-fA-F0-9][a-fA-F0-9])} $string {[my hexToChar \1]} string return [subst -novariables -nobackslashes $string] } Url instproc decodeName string { #my showCall set result "" regsub -all {%0d%0a} $string "\n" string regsub -all {%([a-fA-F0-9][a-fA-F0-9])} $string {[my hexToChar \1]} string return [subst -novariables -nobackslashes $string] } Url instproc decode string { #my showCall set result "" foreach i [split $string &=] { lappend result [decodeItem $i] } #my showVars result return $result } Url url namespace export Mime url base64 } namespace import ::xotcl::comm::mime::* #puts stderr "importing ::xotcl::comm::mime::* to [namespace current]" ./xotcl-1.6.8/library/comm/._PCache.xotcl000644 000765 000024 00000000430 12161602215 020623 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/PCache.xotcl000644 000765 000024 00000016015 12161602215 020414 0ustar00neumannstaff000000 000000 # -*- Tcl -*- $Id: PCache.xotcl,v 1.9 2007/08/14 16:38:26 neumann Exp $ # Persistent Cache object, using gdbm # Configuration: # The persistent cache is kept in a directory which is determined by # the following three rules. # # 1) the global variable "CACHE_DIR", which has to be set, # before this file is loaded # 2) If "CACHE_DIR" is not set, the global variable "homedir" # is checked, which is assumed to be the home directory # of the Cineast browser # 3) As a last resource the tmp directory is used as the cache directory # # Additionally, the cache directory can be specified after loading of this # file (before the first open) through the instance variable "dir" # in the object persistentCache. package provide xotcl::comm::pcache 1.0 #package require xotcl::package package require XOTcl 1 namespace eval ::xotcl::comm::pcache { namespace import ::xotcl::* variable CACHE_DIR variable homeDir if {![info exists CACHE_DIR]} { if {![info exists homeDir]} { set homeDir [::xotcl::tmpdir] } set CACHE_DIR $homeDir/cache2 } Object persistentCache persistentCache set dir $CACHE_DIR persistentCache proc flush { {cmd {}} } { my instvar DBID if {[info exists DBID]} { $DBID close } if {{} ne $cmd } { if {[catch {eval $cmd} err]} {puts stderr err=$err} } my open ;# UZ: wenn hier das self weggenommen wird, crashed das lintFilter #open ;# UZ: wenn hier das self weggenommen wird, crashed das lintFilter } # the open method for the first invocation persistentCache proc open {} { my instvar dir DBID package require xotcl::store set DBID [Storage someNewChildStore] if {![file isdirectory $dir]} { # if the cache directory does not exist, create it.. file mkdir $dir } # the open method for later invocations, doing the real work my proc open {} { my instvar dir DBID $DBID open $dir/index } # invoke the method open } persistentCache proc clear {} { my instvar cacheFileName contentType meta entry validated dir my flush [list eval file delete -force $dir/index \ [glob -nocomplain $dir/\[0-9\]*::*]] foreach var {cacheFileName contentType meta entry validated} { catch {unset $var} } } persistentCache proc clearEntry {url} { my instvar DBID cacheFileName contentType meta entry validated my inCache $url if {[info exists cacheFileName($url)]} { my flush [list eval file delete -force $cacheFileName($url)] foreach var {cacheFileName contentType meta entry validated} { my showMsg "unset ${var}($url)" catch {unset ${var}($url)} } catch {$DBID unset $url} } } persistentCache proc lazyFlush {} { my instvar flushPending if {[info exists flushPending]} { after cancel $flushPending } set flushPending [after 100 [self] flush] } persistentCache proc newEntry {url access doCache name} { my instvar cacheFileName contentType meta dir if {$name ne ""} { #$access set caching 0 return $name } elseif {$doCache} { set cacheFileName($url) $dir/[pid]-$access set contentType($url) [$access set contentType] set meta($url) [$access set meta] return $cacheFileName($url) } else { # we use the Memory cache only for non-persistent cache entries # which are deleted when the program terminates set fileName $dir/v[pid]-$access MemoryCache + $url $fileName return $fileName } } persistentCache proc entryDone {url} { my instvar entry cacheFileName contentType DBID meta if {![info exists DBID]} { open } $DBID set $url [list \ cacheFileName $cacheFileName($url) \ contentType $contentType($url) \ meta $meta($url) ] my lazyFlush #my showMsg "size=[file size $cacheFileName($url)]" set entry($url) 1 my set validated($url) 1 } persistentCache proc inCache {url} { my instvar entry if {[info exists entry($url)]} { set result 1 } else { my instvar cacheFileName contentType meta DBID if {![info exists DBID]} { open } set result [$DBID set $url] my lazyFlush if {$result ne ""} { set entry($url) 1 array set r $result set cacheFileName($url) $r(cacheFileName) set contentType($url) $r(contentType) set meta($url) $r(meta) set result 1 } else { set result 0 } } return $result } persistentCache proc validated {url} { my set validated($url) 1 } persistentCache proc invalidate {url} { if {[my exists validated($url)]} { my unset validated($url) } } persistentCache proc isValidated {url} { if {[my exists validated($url)]} { return 1 } return 0 } persistentCache proc ifModifiedHeader {url ifModVar} { set result 0 if {[my inCache $url]} { #puts stderr inCache:$url upvar [self callinglevel] $ifModVar ifModifiedHeader my instvar meta array set m $meta($url) if {[info exists m(last-modified)]} { set ifModifiedHeader [list If-Modified-Since $m(last-modified)] set result 1 } } else { #puts stderr "url=$url is not in cache" } return $result } persistentCache proc dump {} { my instvar DBID puts stderr DUMP: foreach k [$DBID names] { puts stderr $k puts stderr " [$DBID set $k]" } } persistentCache proc cacheFileName {url} { my instvar cacheFileName return $cacheFileName($url) } persistentCache proc contentType {url} { my instvar contentType return $contentType($url) } persistentCache proc meta {url} { my instvar meta return $meta($url) } persistentCache proc destroy {} { #my showCall next } #persistentCache flush ########################################################### Cache Object MemoryCache MemoryCache proc query {url entry} { my instvar cache if {[info exists cache($url)]} { upvar [self callinglevel] $entry e #puts stderr "-->[self] [self proc] finds: $url" set e $cache($url) return 1 } return 0 } MemoryCache proc + {url entry} { #puts stderr "-->[self class]:[self] [self proc] $url" my set cache($url) $entry } MemoryCache proc - {url} { #puts stderr "-->[self class]:[self] [self proc] $url" catch {my unset cache($url)} } MemoryCache proc destroy {} { my instvar cache foreach url [array names cache] { set f $cache($url) if {[regexp ^/ $f]} { #my showMsg "trying to remove $f [file exists $f]" file delete -force $f } } next } Object instproc allInstances {} { # Diese Methode ermittelt rekursiv alle direkten und indirekten # Instanzen einer Klasse ::set inst [my info instances] foreach s [my info subclass] { foreach i [$s allInstances] { ::lappend inst $i } } return $inst } # onExit is automatically called when wafe terminates proc onExit {} { #puts stderr "allinstances of Access: [Access allInstances]" #foreach i [Access allInstances] { # if {[info command $i] eq ""} continue # $i destroy #} #MemoryCache clear persistentCache flush #Trace statReport } namespace export persistentCache MemoryCache } namespace import ::xotcl::comm::pcache::* ./xotcl-1.6.8/library/comm/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 020720 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/comm/pkgIndex.tcl000644 000765 000024 00000002311 12327774260 020503 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::comm::connection 1.0 [list source [file join $dir Connection.xotcl]] package ifneeded xotcl::comm::dav 1.0 [list source [file join $dir Dav.xotcl]] package ifneeded xotcl::comm::ftp 1.0 [list source [file join $dir Ftp.xotcl]] package ifneeded xotcl::comm::httpAccess 1.0 [list source [file join $dir Access.xotcl]] package ifneeded xotcl::comm::httpd 1.1 [list source [file join $dir Httpd.xotcl]] package ifneeded xotcl::comm::imap 1.0 [list source [file join $dir Imap.xotcl]] package ifneeded xotcl::comm::ldap 1.0 [list source [file join $dir Ldap.xotcl]] package ifneeded xotcl::comm::mime 1.0 [list source [file join $dir Mime.xotcl]] package ifneeded xotcl::comm::pcache 1.0 [list source [file join $dir PCache.xotcl]] ./xotcl-1.6.8/library/._COPYRIGHT000644 000765 000024 00000000430 12327000561 016765 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/COPYRIGHT000644 000765 000024 00000003401 12327000561 016551 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/lib/._changeXOTclVersion.xotcl000644 000765 000024 00000000430 12161600406 023020 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/changeXOTclVersion.xotcl000644 000765 000024 00000005074 12161600406 022614 0ustar00neumannstaff000000 000000 # # this is a maintenance program for XOTcl that allows us to change the # version information across the whole distribution automatically. # # this program assumes that pwd is in xotcl-full-X.X* directory or subdir # set XOTCL_MAJOR_VERSION 1 set XOTCL_MINOR_VERSION 6 set XOTCL_RELEASE_LEVEL .6 # example settings: # 1.0 #set XOTCL_MAJOR_VERSION 1 #set XOTCL_MINOR_VERSION 0 #set XOTCL_RELEASE_LEVEL .3 # # 0.9.3 #set XOTCL_MAJOR_VERSION 0 #set XOTCL_MINOR_VERSION 9 #set XOTCL_RELEASE_LEVEL .3 #set XOTCL_MAJOR_VERSION 0 #set XOTCL_MINOR_VERSION 9 #set XOTCL_RELEASE_LEVEL .3 #set XOTCL_RELEASE_LEVEL .4 #set XOTCL_RELEASE_LEVEL .5 set XOTCL_VERSION $XOTCL_MAJOR_VERSION.$XOTCL_MINOR_VERSION set FULL_VERSION $XOTCL_VERSION$XOTCL_RELEASE_LEVEL if {![regexp {((^.*/xotcl-)([0-9.]*))/?} [pwd] _ topdirname topdirprefix oldversion]} { error "this program assumes that pwd is in xotcl-X.X* directory" } puts "Prior version is: $oldversion" puts "New version is: $FULL_VERSION" puts "Working in: $topdirname" cd $topdirname puts "... make clean first" if {[file exists Makefile]} { exec make clean } foreach file [exec find . -name configure.in] { puts "... updating $file" set F [open $file]; set c [read $F]; close $F set newFile "" foreach line [split $c \n] { set newLine $line if {[regexp {^XOTCL_MAJOR_VERSION=[0-9]} $line]} { set line "XOTCL_MAJOR_VERSION=$XOTCL_MAJOR_VERSION" } elseif {[regexp {^XOTCL_MINOR_VERSION=[0-9]} $line]} { set line "XOTCL_MINOR_VERSION=$XOTCL_MINOR_VERSION" } elseif {[regexp {^XOTCL_RELEASE_LEVEL=} $line]} { set line "XOTCL_RELEASE_LEVEL=$XOTCL_RELEASE_LEVEL" } elseif {[regexp {^define\(XOTclVersion, .*$} $line]} { set line "define(XOTclVersion, $XOTCL_MAJOR_VERSION.$XOTCL_MINOR_VERSION$XOTCL_RELEASE_LEVEL)" } append newFile $line\n } set F [open $file w]; puts $F $newFile; close $F } set newtopdirname $topdirprefix$FULL_VERSION if {$oldversion != $FULL_VERSION} { puts "topdir: $topdirname->$newtopdirname" file rename -force $topdirname $newtopdirname } cd $newtopdirname foreach file [exec find . -name configure.in] { set dir [file dirname $file] set oldpwd [pwd] cd $dir exec autoconf cd $oldpwd } # determine last configure command cd $newtopdirname if {[catch {set configurecmd [exec fgrep {$ ./configure} config.log]}]} { set configurecmd "./configure" } else { regsub {^ +\$ } $configurecmd "" configurecmd } #puts $configurecmd cd $newtopdirname/ puts "Configuring in [pwd]" eval exec $configurecmd puts "ok ... version is now $FULL_VERSION" ./xotcl-1.6.8/library/lib/._COPYRIGHT000644 000765 000024 00000000430 12327000631 017531 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/COPYRIGHT000644 000765 000024 00000003401 12327000631 017315 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/lib/._htmllib.xotcl000644 000765 000024 00000000430 12161607604 020755 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/htmllib.xotcl000644 000765 000024 00000043307 12161607604 020552 0ustar00neumannstaff000000 000000 # # htmllib.xotcl # # Author: Antti Salonen, as@fishpool.fi # # Copyright: # # This software is copyrighted by Fishpool Creations Oy Ltd. The following # terms apply to all files associated with the software unless explicitly # disclaimed in individual files. # # The authors hereby grant permission to use, copy, modify, distribute, # and license this software and its documentation for any purpose, provided # that existing copyright notices are retained in all copies and that this # notice is included verbatim in any distributions. No written agreement, # license, or royalty fee is required for any of the authorized uses. # Modifications to this software may be copyrighted by their authors # and need not follow the licensing terms described here, provided that # the new terms are clearly indicated on the first page of each file where # they apply. # # IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY # FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY # DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE # IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE # NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR # MODIFICATIONS. # package provide xotcl::htmllib 1.0 package require XOTcl 1 namespace eval ::xotcl::htmllib { namespace import ::xotcl::* @ @File { description { This package provides the class HtmlBuilder, which can be used to generate HTML documents, or a part of a document. } authors { Antti Salonen, as@fishpool.fi } date { $Date: 2006/09/27 08:12:40 $ } } # # the compressed parameter means that minimal HTML page are created # i.e. that space indentation is turned off # Class HtmlBuilder -parameter { {compressed 0} } ## The constructor. ## ## The HtmlBuilder object has two instance variables. The document Tcl list ## contains the document as a list of strings. The document is stored as a list ## rather than a single string to allow further indentation of the whole ## document when necessary. ## The indentLevel variable is the level of indentation, which is generally ## increased for the contents of any HTML element that may contain block-level ## elements. Typical examples would be
    ,
  • , and so forth. HtmlBuilder instproc init {} { my instvar document indentLevel set document [list] set indentLevel 0 return } HtmlBuilder instproc clear {} { my instvar document indentLevel set document [list] set indentLevel 0 return } HtmlBuilder instproc getDocument {} { my instvar document return $document } HtmlBuilder instproc toString {} { my instvar document compressed set rvalue "" foreach line $document { if {$compressed == "0"} { append rvalue "$line\n" } else { ## only new line for closing tags at the beginnig ## of a document element if {[string equal -length 2 ", for ## example, is not required by the HTML specification, using the closing method ## is necessary to have the document properly indented. # Add a string to the document within ... HtmlBuilder instproc addStringStrong {str} { my addString "$str" return } # Add a string to the document within ... HtmlBuilder instproc addStringEmphasized {str} { my addString "$str" return } # Add a comment to the document HtmlBuilder instproc addComment {str} { my addString "" return } HtmlBuilder instproc addLineBreak {} { my addString "
    " return } ## startDocument - Start an HTML document. Currently all documents are HTML 4.0 ## Transitional. HTML, BODY, HEAD and TITLE elements are added/started here. ## Optional arguments: ## -title documentTitle (empty if not given) ## -stylesheet externalStyleSheet ## -bgcolor backgroundColour (deprecated in HTML 4.0) HtmlBuilder instproc startDocument {args} { set title "" foreach {name value} $args { switch -- $name { -title { set title $value } -stylesheet { set stylesheet $value } -bgcolor { set bgcolor $value } } } my addString {} my addWhiteSpace my addString {} my addStringIncr {} my addString "$title" if {[info exists stylesheet]} { my addString "" } my addStringDecr {} my addWhiteSpace if {[info exists bgcolor]} { my addStringIncr "" } else { my addStringIncr {} } return } ## endDocument - end an HTML document HtmlBuilder instproc endDocument {} { my addStringDecr {} my addString {} return } ## startParagraph - start a P element ## Optional arguments: ## Common HTML arguments HtmlBuilder instproc startParagraph {args} { set attributes [HtmlBuilder parseArguments $args [list] [list]] my addStringIncr "" return } ## endParagraph - end a P element HtmlBuilder instproc endParagraph {} { my addStringDecr {

    } return } ## startAnchor - start an A element ## Optional arguments: ## -href URI ## -name cdata ## -target frameTarget ## Common HTML arguments HtmlBuilder instproc startAnchor {args} { set attributes [HtmlBuilder parseArguments $args \ [list "HREF" "NAME" "TARGET"] [list]] my addStringIncr "" return } ## endAnchor - end an A element HtmlBuilder instproc endAnchor {args} { my addStringDecr {} return } ## addAnchor - add an A element, using content as the visible link. ## Optional arguments: ## -href URI ## -name cdata ## -target frameTarget ## Common HTML arguments HtmlBuilder instproc addAnchor {content args} { eval my startAnchor $args my addString $content my endAnchor return } ## startUnorderedList - start a UL element ## Optional arguments: ## Commmon HTML arguments HtmlBuilder instproc startUnorderedList {args} { set attributes [HtmlBuilder parseArguments $args [list] [list]] my addStringIncr "" return } ## endUnorderedList - end a UL element HtmlBuilder instproc endUnorderedList {} { my addStringDecr {
} return } ## startListItem - start an LI element ## Optional arguments: ## Common HTML arguments HtmlBuilder instproc startListItem {args} { set attributes [HtmlBuilder parseArguments $args [list] [list]] my addStringIncr "" return } ## endListItem - end an LI element HtmlBuilder instproc endListItem {} { my addStringDecr {} return } ## add a simple list item HtmlBuilder instproc addListItem {content} { my startListItem my addString $content my endListItem } ## startTable - start a TABLE element. Note that if the -border argument isn't ## used, by default the table are created with borders (). ## Optional arguments: ## -border pixels ## -cellpadding length ## -cellspacing length ## -summary text ## -width length ## -bgcolor color spec ## Common HTML arguments HtmlBuilder instproc startTable {args} { set attributes [HtmlBuilder parseArguments $args \ [list "BORDER" "CELLPADDING" "CELLSPACING" "SUMMARY" \ "WIDTH" "BGCOLOR"] [list]] if {[lsearch $args "-border"] == -1} { append attributes " BORDER" } my addStringIncr "" return } ## endTable - end a TABLE element HtmlBuilder instproc endTable {} { my addStringDecr {
} return } ## startTableRow - start a TR element ## Optional arguments: ## Common HTML arguments HtmlBuilder instproc startTableRow {args} { set attributes [HtmlBuilder parseArguments $args [list "VALIGN"] [list]] my addStringIncr "" return } ## endTableRow - end a TR element HtmlBuilder instproc endTableRow {} { my addStringDecr {} return } ## startTableCell - start a TD element ## Optional arguments: ## -colspan number ## -rowspan number ## -align left|center|right|justify|char ## -valign top|middle|bottom|baseline ## -bgcolor ## -width ## Common HTML arguments HtmlBuilder instproc startTableCell {args} { set attributes [HtmlBuilder parseArguments $args \ [list "COLSPAN" "ROWSPAN" "ALIGN" "VALIGN" \ "BGCOLOR" "WIDTH"] [list]] my addStringIncr "" return } ## endTableCell - end a TD element HtmlBuilder instproc endTableCell {} { my addStringDecr {} return } # # add a simple table cell which just contains a string # HtmlBuilder instproc addTableCell {{string ""} args} { eval my startTableCell $args my addString $string my endTableCell } ## startTableHeaderCell - start a TH element ## Optional arguments: ## -colspan number ## -rowspan number ## -align left|center|right|justify|char ## -valign top|middle|bottom|baseline ## Common HTML arguments HtmlBuilder instproc startTableHeaderCell {args} { set attributes [HtmlBuilder parseArguments $args \ [list "COLSPAN" "ROWSPAN" "ALIGN" "VALIGN"] [list]] my addStringIncr "" return } ## endTableHeaderCell - end a TH element HtmlBuilder instproc endTableHeaderCell {} { my addStringDecr {} return } ## startForm - start a FORM element ## Required arguments: ## -action URI ## Optional arguments: ## -method get|post ## Common HTML arguments HtmlBuilder instproc startForm {args} { set attributes [HtmlBuilder parseArguments $args \ [list "ACTION" "METHOD" "ENCTYPE"] [list]] my addStringIncr "" return } ## endForm - end a FORM element HtmlBuilder instproc endForm {} { my addStringDecr {} return } ## addInput - add in INPUT element ## Required arguments: ## -type ## -name ## Optional arguments: ## -value ## -size ## -maxlength ## -checked ## Common HTML arguments HtmlBuilder instproc addInput {args} { set attributes [HtmlBuilder parseArguments $args \ [list "TYPE" "NAME" "VALUE" "SIZE" "MAXLENGTH"] \ [list "CHECKED"]] my addString "" return } ## addTextArea - start a TEXTAREA element ## First parameter: value - Default value of the text area ## Required arguments: ## -rows ## -cols ## Optional arguments: ## -name ## Common HTML Arguments HtmlBuilder instproc addTextArea {value args} { set attributes [HtmlBuilder parseArguments $args \ [list "ROWS" "COLS" "NAME"] [list]] my addString "$value" return } ## startOptionSelector - start a SELECT element ## Optional arguments: ## -name ## -size ## -multiple ## Common HTML arguments HtmlBuilder instproc startOptionSelector {args} { set attributes [HtmlBuilder parseArguments $args \ [list "NAME" "SIZE"] [list "MULTIPLE"]] my addStringIncr "" return } ## endOptionSelector - end a SELECT element HtmlBuilder instproc endOptionSelector {} { my addStringDecr "" return } ## startOption - start an OPTION element ## Optional arguments: ## -value ## -selected ## Common HTML arguments HtmlBuilder instproc startOption {args} { set attributes [HtmlBuilder parseArguments $args \ [list "VALUE"] [list "SELECTED"]] my addStringIncr "" return } ## endOption - end an OPTION element HtmlBuilder instproc endOption {} { my addStringDecr "" return } ## addImage - add an IMG element ## Required arguments: ## -src ## -alt ## -align (deprecated in HTML 4.0) ## Optional arguments: ## Common HTML arguments HtmlBuilder instproc addImage {args} { set attributes [HtmlBuilder parseArguments $args \ [list "SRC" "ALT" "ALIGN"] [list]] my addString "" return } ## startBlock - start a DIV element (a generic block-level container) ## Optional arguments: ## Common HTML attributes HtmlBuilder instproc startBlock {args} { set attributes [HtmlBuilder parseArguments $args [list] [list]] my addStringIncr "" return } ## endBlock - end a DIV element HtmlBuilder instproc endBlock {} { my addStringDecr "" return } ## addHorizontalRule - add an HR element ## Optional arguments: ## Common HTML arguments HtmlBuilder instproc addHorizontalRule {args} { set attributes [HtmlBuilder parseArguments $args [list] [list]] my addString "" return } namespace export HtmlBuilder } namespace import ::xotcl::htmllib::* ./xotcl-1.6.8/library/lib/._make.xotcl000644 000765 000024 00000000430 12161600406 020230 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/make.xotcl000644 000765 000024 00000010342 12161600406 020016 0ustar00neumannstaff000000 000000 # $Id: make.xotcl,v 1.4 2006/09/27 08:12:40 neumann Exp $ ### inEachDir changes now to each directory ### install clears tgarget directory before installing ### Object file added (for better -n processing) #lappend auto_path .. package require XOTcl 1 1 namespace import -force ::xotcl::* ### Object make # # shared lib add files for pkgIndex.tcl # make proc mkIndex {name} { #puts stderr "+++ mkIndex in [pwd]" set fls {} foreach f [glob -nocomplain *tcl] { if {![file isdirectory $f]} { set F [open $f]; set c [read $F]; close $F if {[string match "*package provide*" $c]} { lappend fls $f } } } set so [glob -nocomplain *[info sharedlibextension]] # loading libxotcl into xotclsh crashes on some systems foreach lib [list libxotcl$::xotcl::version[info sharedlibextension] \ xotcl$::xotcl::version.dll] { set p [lsearch -exact $so $lib] if {$p != -1} { set so [lreplace $so $p $p] #puts stderr "new so=<$so>" } } #puts stderr "[pwd]: call so=<$so>" set fls [concat $fls $so] if {$fls ne ""} { if {[file exists pkgIndex.tcl]} { file delete -force pkgIndex.tcl } #puts stderr "callinglevel <[self callinglevel]> $fls" #puts stderr "[pwd]:\n\tcall eval pkg_mkIndex -direct . $fls" if {[catch {eval pkg_mkIndex -direct . $fls} errs]} { puts stderr "!!! $errs" } #puts stderr "[pwd] done" } foreach addFile [glob -nocomplain *.add] { if {[file exists $addFile]} { puts stderr "Appending $addFile to pkgIndex.tcl in [pwd]" set OUT [file open pkgIndex.tcl a] set IN [file open $addFile] puts -nonewline $OUT [read $IN] close $IN; close $OUT } } #puts stderr "+++ mkIndex name=$name, pwd=[pwd] DONE" } make proc inEachDir {path cmd} { #puts stderr "[pwd] inEachDir $path [file isdirectory $path]" if { [file isdirectory $path] && ![string match *CVS $path] && ![string match *SCCS $path] && ![string match *Attic $path] && ![string match *dbm* $path] } { set olddir [pwd] cd $path eval make $cmd $path set files [glob -nocomplain *] cd $olddir foreach p $files { my inEachDir $path/$p $cmd } #puts stderr "+++ change back to $olddir" } } make proc in {path cmd} { if {[file isdirectory $path] && ![string match *CVS $path]} { set olddir [pwd] cd $path eval make $cmd $path cd $olddir } } ### tcl file-command rename file tcl_file Object file -requireNamespace rename open file::open proc open {f {mode r}} { file open $f $mode } #file proc open {f {mode r}} { ::open $f $mode } file array set destructive { atime 0 attributes 0 copy 1 delete 1 dirname 0 executable 0 exists 0 extension 0 isdirectory 0 isfile 0 join 0 lstat 0 mkdir 1 mtime 0 nativename 0 owned 0 pathtype 0 readable 0 readlink 0 rename 1 rootname 0 size 0 split 0 stat 0 tail 0 type 0 volumes 0 writable 0 } foreach subcmd [file array names destructive] { file proc $subcmd args { #puts stderr " [pwd] call: '::tcl_file [self proc] $args'" eval ::tcl_file [self proc] $args } } ### minus n option Class make::-n foreach f [file info commands] { if {$f eq "unknown" || $f eq "next" || $f eq "self"} continue if {![file exists destructive($f)] || [file set destructive($f)]} { #puts stderr destruct=$f make::-n instproc $f args { puts "--- [pwd]:\t[self proc] $args" } } else { #puts stderr nondestruct=$f make::-n instproc $f args { set r [next] #puts "??? [self proc] $args -> {$r}" return $r } } } ### command line parameters if {![info exists argv] || $argv eq ""} {set argv -all} if {$argv eq "-n"} {set argv "-n -all"} Class Script Script proc create args { eval lappend args $::argv eval next $args } Script instproc unknown args { puts stderr "$::argv0: Unknown option ´-$args´ provided" } Script instproc n {} {file mixin make::-n} Script instproc all {} { make inEachDir . mkIndex } Script instproc dir {dirName} { cd $dirName } Script instproc target {path} { make set target $path } Script create main #puts stderr "+++ make.xotcl finished." #if {[set ::tcl_platform(platform)] eq "windows"} { # exit #} ./xotcl-1.6.8/library/lib/._makeDoc.xotcl000644 000765 000024 00000000430 12161612240 020655 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/makeDoc.xotcl000644 000765 000024 00000005277 12161612240 020456 0ustar00neumannstaff000000 000000 package require XOTcl 1 1.6 namespace import ::xotcl::* @ @File { description { Documentation tool for the XOTcl distribution.
Usage: 'makeDoc docdir filename ?filename ...?'
Called by Makefile. } } lappend auto_path [file dirname [info script]] #package require xotcl::package #package verbose 1 package require -exact xotcl::xodoc 1.0 set fileList "" puts "XOTcl Documentation Tool" puts "------------------------" if {$argc > 1} { set DOCDIR [lindex $argv 0] puts "Documenting to directory $DOCDIR:" if {![file isdirectory $DOCDIR]} { file mkdir $DOCDIR } set files [lrange $argv 1 end] foreach file $files { puts "...$file" if {[catch {XODoc documentFileAsHTML $file $DOCDIR} fb]} { puts stderr "\terror processing $file:\n[string replace $::errorInfo 400 end ...]" } else { lappend fileList $file $fb } } } else { error "usage: xodoc docdir filename ?filename ...?" } set filesHtml "" set filesDir "" ## write index page foreach {f fb} $fileList { set dir . regexp {^(.*)/[^/]*$} $f _ dir if {$fb ne "langRef-xotcl"} { set tail ", " if {$dir != $filesDir} { append filesHtml "
  • Directory '$dir':
    " set filesDir $dir set tail "" } append filesHtml "$tail[file tail $f]" } } # # # XOTcl - Documentation # # #

    Lanuage Reference - Index

    set content { The Extended Object Tcl (XOTcl) Documentation contains the following parts:

    XOTcl Language Documentation

    Package and Script Documentation

    This section of the documentation is under work...
      $filesHtml

    Tcl Online Information

    } set content [subst -nobackslashes -nocommands $content] set f [open $DOCDIR/index.html w] puts $f $content close $f puts "Documentation finished" ./xotcl-1.6.8/library/lib/._metadataAnalyzer.xotcl000644 000765 000024 00000000430 12161607642 022612 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/metadataAnalyzer.xotcl000644 000765 000024 00000030246 12161607642 022405 0ustar00neumannstaff000000 000000 package provide xotcl::metadataAnalyzer 1.0 package require XOTcl 1 namespace eval ::xotcl::metadataAnalyzer { namespace import ::xotcl::* @ @File { description { XOTcl file analyzer for @ metadata. E.g.\ used for doumentation with xoDoc (but in the static variant StaticMetadataAnalyzer which uses the dynamic variant in this file). <@p> Sample sample usage: <@pre> package require xotcl::metadataAnalyzer # instantiate metadata analyzer object MetadataAnalyzer @::m # make this object be known to @ and turn @ metadata processing on @ analyzerObj @::m @ onOff 1 # read in some metadata tags (in sample file) & execute the file source lib/testx.xotcl # turn @ metadata processing off again @ onOff 0 # print out all collected metadata puts [@::m print] } } @ Class MetadataToken { description { Each collected metadata element is stored in a token object. MetadataToken is superclass of token object classes. Each metadata token has two interesting parameters: <@p> "properties" contains list of all described metadata properties. E.g. can be printed with <@pre> foreach p [my set properties] { if {[my exists $p]} { append c " $p=[my set $p]\n" } } "name" contains the method, object, ... name of the metadata element. <@p> All metadata token are aggregated by @. Therefore, <@pre> foreach mdt [@ info children] { if {[$mdt istype MetadataToken]} {$mdt print} } prints all token. } } Class MetadataToken -parameter { {name ""} {properties ""} } @ MetadataToken proc sortTokenList {l "token list"} { description {Sort a token list with names. Since names are autonames, this means order of appearance in the program.} } MetadataToken proc sortTokenList l { foreach t $l { set names([$t set name]) $t } set sortedNames [lsort [array names names]] set sortedList "" foreach n $sortedNames { lappend sortedList $names($n) } return $sortedList } MetadataToken instproc evaluateMetadata md { my instvar properties foreach {p v} $md { # only append property, if its not already there # otherwise just overwrite the value if {[lsearch $properties $p] == -1} { my lappend properties $p } my set $p $v } } @ MetadataToken instproc printProperties {} { description {Print metadata properties to stdout.} } MetadataToken instproc printProperties {} { set c "" foreach p [my set properties] { if {[my exists $p]} { append c " [my capitalize $p]=[my set $p]\n" } } return $c } MetadataToken instproc capitalize string { if {$::tcl_version >= 8.3} { string toupper $string 0 0 } else { return "[string toupper [string range $string 0 0]][string range $string 1 end]" } } @ MetadataToken abstract instproc print {} { description { Abstract method for printing a token to stdout. } } MetadataToken abstract instproc print {} @ Class FileToken -superclass MetadataToken { description { Token for @File Metadata. } } Class FileToken -superclass MetadataToken FileToken instproc print {} { set c "FILE=[my set name]\n" append c [my printProperties] return $c } @ Class ConstraintToken -superclass MetadataToken { description { Token for @Constraint Metadata. } } Class ConstraintToken -superclass MetadataToken ConstraintToken instproc print {} { set c "CONSTRAINT=[my set name]\n" append c [my printProperties] return $c } @ Class PackageToken -superclass MetadataToken { description { Token for Package metadata. Contains additional parameters: "version" of the package and "type"= either "require" or "provide". } } Class PackageToken -superclass MetadataToken -parameter { {version ""} {type ""} } @ Class ObjToken -superclass MetadataToken { description { Token for Object metadata. Contains additional parameters: "procList" = list of all proc token and "cl"= class name. } } Class ObjToken -superclass MetadataToken -parameter { {procList ""} cl } ObjToken instproc printProcs {} { set c " PROCS:\n" set pl [MetadataToken sortTokenList [my procList]] if {[my istype ClassToken]} { set pl [concat [MetadataToken sortTokenList [my instprocList]] $pl] } foreach p $pl { append c " [$p set name]\n" } return $c } ObjToken instproc print {} { set c "OBJECT=[my set name]\n" if {[my exists cl]} {append c " CLASS=[my set cl]\n"} if {[my exists heritage]} {append c " HERITAGE=[my set heritage]\n"} append c [my printProperties] set pl [MetadataToken sortTokenList [my procList]] if {[my istype ClassToken]} { set pl [concat [MetadataToken sortTokenList [my instprocList]] $pl] } foreach p $pl { append c [$p print] } return $c } @ Class ClassToken -superclass ObjToken { description { Token for Class metadata. Contains additional parameters: "instprocList" = list of all instproc token. } } Class ClassToken -superclass ObjToken -parameter { {instprocList ""} } ClassToken instproc print {} { regsub "^OBJECT=" [next] "CLASS=" r return $r } @ Class MetaClassToken -superclass ClassToken { description { Token for Meta-Class metadata. } } Class MetaClassToken -superclass ClassToken MetaClassToken instproc print {} { regsub "^CLASS=" [next] "META-CLASS=" r return $r } @ Class MethodToken -superclass MetadataToken { description { Token for Method metadata. Contains additional parameters: "arguments" of the method, "returnValue" of the method, "obj" name, "abstract" = 0 or 1 (whether its an abstract method or not). } } Class MethodToken -superclass MetadataToken -parameter { arguments returnValue obj {abstract 0} } # Prints out method information MethodToken instproc print {} { set c " METHOD=[my set name], ARGUMENTS= " if {[my exists arguments]} { foreach {arg argDescription} [my set arguments] { # ignore argDescription and default values if {[llength $arg] > 1} {set arg [lindex $arg 0]} append c $arg " " } } append c "\n [my printProperties]" return $c } @ Class ProcToken -superclass MethodToken { description { Token for Proc metadata } } Class ProcToken -superclass MethodToken ProcToken instproc print {} { regsub "^ METHOD=" [next] " PROC=" r return $r } @ Class InstprocToken -superclass MethodToken { description { Token for Instproc metadata. } } Class InstprocToken -superclass MethodToken InstprocToken instproc print {} { regsub "^ METHOD=" [next] " INSTPROC=" r return $r } @ Class MetadataAnalyzer { description "Handler class for building a metadata runtime structure" } Class MetadataAnalyzer -parameter { {objList ""} {packageList ""} {knownMetaclasses "Class"} {ns ""} fileToken {constraintList ""} } MetadataAnalyzer instproc init args { next } MetadataAnalyzer instproc handleMethod {obj type name {argList ""} {doc ""}} { #puts stderr "+++Method $type $name $argList $doc" set procClass ProcToken set objCl ObjToken if {$type eq "instproc"} { set procCl InstprocToken set objCl ClassToken } set t [$procClass create [my autoname ::xotcl::@::t]] set n [$t set name [string trimleft $name :]] $t set obj $obj set objFound 0 foreach o [my set objList] { if {[$o set name] == $obj} { set objFound 1 if {$type eq "instproc" && ![$o istype ClassToken]} { $o class ClassToken } break } } if {$objFound == 0} { set o [$objCl create [my autoname ::xotcl::@::t]] $o set name $obj my lappend objList $o } $o lappend ${type}List $t $t set arguments $argList $t evaluateMetadata $doc return $t } MetadataAnalyzer instproc handleObj {class name args} { my instvar knownMetaclasses objList extensions set objCl ObjToken if {[lsearch $class $knownMetaclasses] != -1} { set objCl ClassToken } # if an instproc/proc has created an entry for this obj/class # -> use it and overwrite it with new info if {[set idx [lsearch $name $objList]] != -1} { set t [lindex $objList $idx] $t class $objCl } else { set t [$objCl create [my autoname ::xotcl::@::t]] my lappend objList $t } $t set name $name set la [llength $args] # evaluate -superclass argument if {($la == 3 || $la == 2) && [lindex $args 0] eq "-superclass"} { set heritage [$t set heritage [lindex $args 1]] foreach h $heritage { if {[lsearch $h $knownMetaclasses] != -1} { # A new metaclass was defined lappend knownMetaclasses $name $t class MetaClassToken } } } # evaluate documentation set doc "" if {$la == 1} { set doc [lindex $args 0] } elseif {$la == 3} { set doc [lindex $args 2] } $t evaluateMetadata $doc $t set cl $class #puts stderr "+++Obj $name $args" } MetadataAnalyzer instproc handleFile doc { if {[my exists fileToken]} { [my set fileToken] evaluateMetadata $doc } } MetadataAnalyzer instproc handleConstraint {constraint name args} { set t [ConstraintToken create [my autoname ::xotcl::@::t]] my lappend constraintList $t $t set name $name set doc [lindex $args 0] $t evaluateMetadata $doc } MetadataAnalyzer instproc handlePackage args { #puts "$args" if {[llength $args] > 2} { set type [lindex $args 1] if {$type eq "provide" || $type eq "require"} { set t [PackageToken create [my autoname ::xotcl::@::t]] my lappend packageList $t $t set name [lindex $args 2] $t set type $type if {[llength $args] > 3} { $t set version [lindex $args 3] } } } } @ MetadataAnalyzer instproc print {} { description "Print all collected token information to stdout. This method is also an exmaple how the tokens can be used." } MetadataAnalyzer instproc print {} { my instvar extensions packageList set c "" if {[llength $packageList] > 0} { append c "PACKAGES:" foreach t $packageList { if {[$t type] eq "provide"} { append c " Package provided: [$t name] [$t version]\n" } elseif {[$t type] eq "require"} { append c " Package required: [$t name] [$t version]\n" } } } if {[my exists fileToken]} { append c [[my set fileToken] print] } if {[my exists constraintToken]} { append c [[my set constraintToken] print] } if {[info exists extensions]} { # Add list of extensions. foreach extension $extensions { append c "\nExtensions: [$extension name], " \ "Description: [$extension description]" } } set objList [MetadataToken sortTokenList [my objList]] if {[llength $objList]>0} { foreach obj $objList {append c [$obj print]} } return $c } @ Class AnalyzerCmd { description {Class that overload the unknown mechanism of @ to provide metadata analysis.} } Class AnalyzerCmd -parameter { {analyzerObj ""} {onOff 0} } AnalyzerCmd instproc unknown args { my instvar analyzerObj onOff if {!$onOff} {return [next]} if {[llength $args] > 1} { set abstract 0 if {[lindex $args 1] eq "abstract"} { if {[llength $args] > 2} { set p [lindex $args 2] if {$p eq "proc" || $p eq "instproc"} { set args [lreplace $args 1 1] set abstract 1 } } } switch [lindex $args 1] { proc - instproc { set r [eval $analyzerObj handleMethod $args] if {$abstract} {$r abstract 1} return $r } default { switch [lindex $args 0] { @File { return [$analyzerObj handleFile [lindex $args 1]] } @Constraint { return [eval $analyzerObj handleConstraint $args] } default { return [eval $analyzerObj handleObj $args] } } } } } puts stderr "Unknown @ metadata: '$args'" } @ AnalyzerCmd @ { description {Recreate @ with metadata analyis funtionality.} } AnalyzerCmd @ namespace export \ MetadataToken FileToken ConstraintToken PackageToken ObjToken \ ClassToken MetaClassToken MethodToken ProcToken InstprocToken \ MetadataAnalyzer AnalyzerCmd } namespace import ::xotcl::metadataAnalyzer::* ./xotcl-1.6.8/library/lib/._mixinStrategy.xotcl000644 000765 000024 00000000430 12161607655 022177 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/mixinStrategy.xotcl000644 000765 000024 00000005645 12161607655 021777 0ustar00neumannstaff000000 000000 package provide xotcl::mixinStrategy 1.0 package require XOTcl 1 namespace eval ::xotcl::mixinStrategy { namespace import ::xotcl::* @ @File { description { These methods provide support for managing "strategies", i.e. mixin-classes, where only one kind of a family of conformant mixins should be registered. <@p> Naming convertions for strategies: All strategies must follow the naming convention 'kind=implementation'. Examples are the persistency strategy 'eager' specfied as 'persistent=eager' or the persistency strategy 'lazy' (specified as 'persistent=lazy') }} @ Object instproc mixinStrategy {strategy "Strategy to be added" } { description { This method adds or replaces a new strategy from the mixin list. Strategies are named following the convention mentioned above. } return "old strategy" } Object instproc mixinStrategy {strategy} { regexp {:?([^:=]+)=} $strategy _ kind set mixins "" set oldStrategy "" foreach mixin [my info mixin] { if {[string match *${kind}=* $mixin]} { lappend mixins $strategy set oldStrategy $mixin } else { lappend mixins $mixin } } if {$oldStrategy eq ""} { lappend mixins $strategy } my mixin $mixins return $oldStrategy } @ Object instproc mixinQueryStrategy {kind "strategy kind"} { description { This method searches the mixin list for a mixin of this kind (starting with $kind=) } return "returns the maching strategy" } Object instproc mixinQueryStrategy {kind} { set m [my info mixin] return [::lindex $m [::lsearch -glob $m $kind=*]] } @ Object instproc add {construct "(inst) 'filter' or 'mixin'" args "to be added"} { description "add the specified (inst) 'filters' or 'mixins'" return "empty" } Object instproc add {kind args} { if {$kind != {instfilter} && $kind != {instmixin} && $kind != {filter} && $kind != {mixin}} { error "Usage: [self proc] ..." } ::set classes [my info $kind] eval ::lappend classes $args my $kind $classes #puts stderr "$kind of [self] are now: ´[my info $kind]´" } @ Object instproc remove {construct "(inst) 'filter' or 'mixin'" args "to be removed"} { description "remove the specified (inst) 'filters' or 'mixins'" return "empty" } Object instproc remove {kind args} { if {$kind != {instfilter} && $kind != {instmixin} && $kind != {filter} && $kind != {mixin}} { error "Usage: [self proc] ..." } ::set classes [my info $kind] foreach c $args { ::set pos [::lsearch $classes $c] if {$pos == -1} { error "$kind ´$c´ could not be removed" } else { set $classes [::lreplace $classes $pos $pos] } } my $kind $classes # puts stderr "$kind of [self] are now: ´[my info $kind]´" } } ./xotcl-1.6.8/library/lib/._package.xotcl000644 000765 000024 00000000430 12161603517 020714 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/package.xotcl000644 000765 000024 00000010005 12161603517 020476 0ustar00neumannstaff000000 000000 package provide xotcl::package 1.0 package require -exact xotcl::mixinStrategy 1.0 package require XOTcl 1 rename package tcl_package namespace eval ::xotcl::package { namespace import ::xotcl::* @ @File {description { Represent Tcl package loading command by an XOTcl object. Enables tracking, tracing, and verbose output of package loading } } @ Object package { description { Supports all Tcl package options plus present and verbose. } } @ package proc present {args "packageName or -exact packageName"} { description { Check whether a package is present or not. Similar to Tcl's package present, but works with Tcl < 8.3 } } @ package proc verbose {v "1 or 0"} { description { Toggle verbose output on/off. If on, package prints the locations from where packages are loaded to the screen. Default is off. } } Object package package set component . package set verbose 0 package proc unknown args { #puts stderr "unknown: package $args" namespace eval :: tcl_package $args } package proc verbose value { my set verbose $value } package proc present args { if {$::tcl_version<8.3} { my instvar loaded switch -exact -- [lindex $args 0] { -exact {set pkg [lindex $args 1]} default {set pkg [lindex $args 0]} } if {[info exists loaded($pkg)]} { return $loaded($pkg) } else { error "not found" } } else { namespace eval :: tcl_package present $args } } package proc require args { my instvar component verbose uses loaded set prevComponent $component if {[catch {set v [eval package present $args]} msg]} { #puts stderr "we have to load $msg" switch -exact -- [lindex $args 0] { -exact {set pkg [lindex $args 1]} default {set pkg [lindex $args 0]} } set component $pkg lappend uses($prevComponent) $component set v [namespace eval :: tcl_package require $args] if {$v ne "" && $verbose} { set path [lindex [tcl_package ifneeded $pkg $v] 1] puts "... $pkg $v loaded from '$path'" set loaded($pkg) $v ;# loaded stuff needed for Tcl 8.0 } } set component $prevComponent return $v } Object package::tracker package::tracker set verbose 0 package::tracker proc storeEntry {table index} { my instvar verbose $table set ${table}($index) "[package set component] [info script]" if {$verbose} { puts "... $table $index loaded from [info script]" } } package::tracker proc dump {} { my instvar class object instproc proc if {[info exist class]} { parray class } if {[info exist object]} { parray object } if {[info exist instproc]} { parray instproc } if {[info exist proc]} { parray proc } } package::tracker proc start {} { ::Class add mixin [self]::M ::Object add mixin [self]::M } Class package::tracker::M package::tracker::M instproc create {cls args} { set table [string tolower [string trimleft [self] :]] package::tracker storeEntry $table [lindex $args 0] next $cls add mixin [self class] } package::tracker::M instproc instproc args { package::tracker storeEntry instproc [self]->[lindex $args 0] next } package::tracker::M instproc proc args { package::tracker storeEntry proc [self]->[lindex $args 0] next } #package::tracker set verbose 1 #package::tracker start # #Class A #A instproc p args { # puts A #} #A proc pp args { # a call #} #Object o #o proc ppp args { # another call #} #puts stderr ==================================================== #package::tracker dump #puts stderr AUTO_PATH=$auto_path. namespace export package namespace eval package { namespace export tracker namespace eval tracker { namespace export M } } } namespace import ::xotcl::package::* namespace eval package { namespace import ::xotcl::package::package::* namespace eval tracker { namespace import ::xotcl::package::package::tracker::* } } ./xotcl-1.6.8/library/lib/._pkgIndex-package.add000644 000765 000024 00000000430 12161603563 022063 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/pkgIndex-package.add000644 000765 000024 00000000121 12161603563 021643 0ustar00neumannstaff000000 000000 package ifneeded xotcl::package 1.0 [list source [file join $dir package.xotcl]] ./xotcl-1.6.8/library/lib/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 020533 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/pkgIndex.tcl000644 000765 000024 00000002607 12327774260 020326 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::htmllib 1.0 [list source [file join $dir htmllib.xotcl]] package ifneeded xotcl::metadataAnalyzer 1.0 [list source [file join $dir metadataAnalyzer.xotcl]] package ifneeded xotcl::mixinStrategy 1.0 [list source [file join $dir mixinStrategy.xotcl]] package ifneeded xotcl::script 1.0 [list source [file join $dir Script.xotcl]] package ifneeded xotcl::staticMetadataAnalyzer 1.0 [list source [file join $dir staticMetadata.xotcl]] package ifneeded xotcl::test 1.38 [list source [file join $dir test.xotcl]] package ifneeded xotcl::trace 1.0 [list source [file join $dir trace.xotcl]] package ifneeded xotcl::upvar-compat 1.0 [list source [file join $dir upvarcompat.xotcl]] package ifneeded xotcl::wafecompat 1.0 [list source [file join $dir wafecompat.tcl]] package ifneeded xotcl::xodoc 1.0 [list source [file join $dir xodoc.xotcl]] package ifneeded xotcl::package 1.0 [list source [file join $dir package.xotcl]] ./xotcl-1.6.8/library/lib/._Script.xotcl000644 000765 000024 00000000430 12161607557 020575 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/Script.xotcl000644 000765 000024 00000001531 12161607557 020363 0ustar00neumannstaff000000 000000 package provide xotcl::script 1.0 package require XOTcl 1 namespace eval ::xotcl::script { namespace import ::xotcl::* @ @File {description { A small package to instantiate an object, that represents a script. } } @ Class Script { description { An object of type Script becomes automatically the command line arguments evaluated as "-" method calls during creation, e.g. <@pre> Script s -set r 5 and a call with cmd-line "-set v 6" of the script, results in an object s with two vars set: r to 5, and v to 6. } } Class Script Script proc create args { eval lappend args $::argv eval next $args } Script instproc unknown args { puts stderr "$::argv0: Unknown option ´-$args´ provided" } namespace export Script } namespace import ::xotcl::script::* ./xotcl-1.6.8/library/lib/._staticMetadata.xotcl000644 000765 000024 00000000430 12161607722 022253 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/staticMetadata.xotcl000644 000765 000024 00000004664 12161607722 022053 0ustar00neumannstaff000000 000000 package provide xotcl::staticMetadataAnalyzer 1.0 package require -exact xotcl::metadataAnalyzer 1.0 package require XOTcl 1 namespace eval ::xotcl::staticMetadataAnalyzer { namespace import ::xotcl::* @ @File { description { XOTcl file static analyzer for @ metadata. E.g. used for doumentation with xoDoc. I.e. allows for reading in a file and evaluating the metadata-related info only. } } @ Class StaticMetadataAnalyzer -superclass MetadataAnalyzer { description { Metadata analyzer class that allows for reading in files and evaluation of the metadata content in the file. } } Class StaticMetadataAnalyzer -superclass MetadataAnalyzer \ -parameter {{namespace ::}} StaticMetadataAnalyzer instproc cmdsplit {cmd} { # from Jeffrey's tkcon set inc {} set cmds {} foreach cmd [split [string trimleft $cmd] \n] { if {{} ne $inc } { append inc \n$cmd } else { append inc [string trimleft $cmd] } if {[info complete $inc] && ![regexp {[^\\]\\$} $inc]} { if {[regexp "^\[^#\]" $inc]} {lappend cmds $inc} set inc {} } } if {[regexp "^\[^#\]" $inc]} {lappend cmds $inc} return $cmds } StaticMetadataAnalyzer instproc evaluateCommands {c} { my instvar namespace foreach command [my cmdsplit $c] { #puts stderr "$command===========================" if {[regexp "^ *:*@ " $command]} { #puts stderr "$command===========================" namespace eval $namespace $command } elseif {[regexp "^ *package " $command]} { #puts stderr "$command===========================" namespace eval $namespace [list my handlePackage $command] } elseif {[regexp "^ *namespace *eval *(\[^\{\]*) *\{(.*)\}\[^\}\]*$" $command _ namespace nsc]} { #puts stderr "$command===========================" namespace eval $namespace [list my evaluateCommands $nsc] } } } @ StaticMetadataAnalyzer instproc analyzeFile {name "File name"} { description "Analyze a file and build up a token structure for each metadata token in the file." } StaticMetadataAnalyzer instproc analyzeFile name { my set cmd "" set t [FileToken create [my autoname t]] $t set name $name my set fileToken $t set f [open $name r] set c [read $f] close $f ::@ onOff 1 my evaluateCommands $c ::@ onOff 0 } namespace export StaticMetadataAnalyzer } namespace import ::xotcl::staticMetadataAnalyzer::* ./xotcl-1.6.8/library/lib/._test.xotcl000644 000765 000024 00000000430 12161600406 020272 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/test.xotcl000644 000765 000024 00000006033 12161600406 020062 0ustar00neumannstaff000000 000000 package provide xotcl::test 1.38 package require XOTcl 1 namespace eval ::xotcl::test { namespace import ::xotcl::* @ @File {description { Simple regression test support. }} @ Class Test { description { Class Test is used to configure test instances, which can be configured by the following parameters: <@ul> <@li>cmd: the command to be executed <@li>expected: the expected result <@li>count: number of executions of cmd <@li>pre: a command to be executed at the begin of the test (before cmd) <@li>post: a command to be executed after the test (after all cmds) <@li>namespace in which pre, post and cmd are evaluated; default :: The defined tests can be executed by <@tt>Test run } } Class Test -parameter { {name ""} cmd {namespace ::} {verbose 0} {expected 1} {count 1000} msg setResult errorReport pre post } Test set count 0 Test proc new args { my instvar case ccount name if {[my exists case]} { if {![info exists ccount($case)]} {set ccount($case) 0} set name $case.[format %.3d [incr ccount($case)]] } else { set name t.[format %.3d [my incr count]] } eval my create $name -name $name $args } Test proc run {} { set startTime [clock clicks -milliseconds] foreach example [lsort [my allInstances]] { $example run } puts stderr "Total Time: [expr {[clock clicks -milliseconds]-$startTime}] ms" } Test proc _allInstances {C} { set set [$C info instances] foreach sc [$C info subclass] { eval lappend set [my _allInstances $sc] } return $set } Test proc allInstances {} { return [my _allInstances Test] } Test instproc call {msg cmd} { if {[my verbose]} {puts stderr "$msg: $cmd"} namespace eval [my namespace] $cmd } Test instproc run args { my instvar cmd expected pre post count msg if {[info exists pre]} {my call "pre" $pre} if {![info exists msg]} {set msg $cmd} set r [my call "run" $cmd] if {[my exists setResult]} {set r [eval [my set setResult]]} if {$r == $expected} { if {[info exists count]} {set c $count} {set c 1000} if {[my verbose]} { puts stderr "running test $c times" } if {$c > 1} { #set r0 [time $cmd $c] #puts stderr "time {time $cmd $c}" set r1 [time {time {namespace eval [my namespace] $cmd} $c}] #regexp {^(-?[0-9]+) +} $r0 _ mS0 regexp {^(-?[0-9]+) +} $r1 _ mS1 set ms [expr {$mS1*1.0/$c}] puts stderr "[my name]:\t[format %6.1f $ms] mms, $msg" } else { puts stderr "[my name]: $msg ok" } } else { puts stderr "[my name]:\tincorrect result for '$msg'" puts stderr "\texpected: '$expected', got '$r' [my exists errorReport]" if {[my exists errorReport]} {eval [my set errorReport]} exit -1 } if {[info exists post]} {my call "post" $post} } proc case name {::xotcl::test::Test set case $name} namespace export Test } namespace import ::xotcl::test::* ./xotcl-1.6.8/library/lib/._trace.xotcl000644 000765 000024 00000000430 12161607746 020427 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/trace.xotcl000644 000765 000024 00000021200 12161607746 020210 0ustar00neumannstaff000000 000000 package provide xotcl::trace 1.0 package require XOTcl 1 namespace eval ::xotcl::trace { namespace import ::xotcl::* @ @File {description { Various tracing tools for the XOTcl language. } } @ Object instproc traceFilter { args "arbitrary args" } { Description { Filter to trace every method call on an object or class hierarchy. Outputs a message befora and after each call of the traced object. } return "empty string" } @ Object Trace { Description { Write trace outputs and produce statistics. Variable traceStream defines where to write trace output (default: stderr). } } @ Trace proc puts {line "output line"} { Description { Define how traceFilter writes to the output stream. Default: write to trace stream. } } @ Trace proc openTraceFile {name "file name"} { Description { Redirect trace output to file. } } @ Trace proc closeTraceFile {name "file name"} { Description { Close trace file and redirect output to stderr. } } @ Object instproc lintFilter {} { Description {Experimental lint filter} } @ Object instproc statFilter {} { Description {Experimental statistics filter} } @ Object instproc showVars {args "ist of variables"} { Description {Show the values of the specified variables (or of all variables) of an object on stderr.} } @ Object instproc showMsg {msg "optional output"} { Description {Show a message msg with the form "[self] $cls->$method $msg" on stderr.} } @ Object instproc showClass {} { Description {Show classes and mixins of the object}} @ Object instproc showStack {maxDepth "max stack depth, default=100"} { Description {Show callstack up to the specified calldepth.}} @ Object instproc showCall {} { Description {Show the current call with the form "[self] $cls->$method $args" on stderr.}} @ Object instproc showTimeStart {"?handle?" "Handle object name, optional"} {Description {start a timer}} @ Object instproc showTimeEnd {"?handle?" "Handle object name, optional"} {Description {end a timer and show result}} ########################################################################## proc showCall {} { Trace deprecated-function showCall} proc showVars {} { Trace deprecated-function showVars} proc showObj {o {printObjectName 1}} { Trace deprecated-function showObj} proc showStack {{m 100}} { Trace deprecated-function showStack} Object Trace Trace set traceStream stderr Trace proc openTraceFile name { my set traceStream [open $name w] } Trace proc closeTraceFile {} { close $Trace::traceStream my set traceStream stderr } Trace proc puts line { puts $Trace::traceStream $line } Trace proc add {type obj} { if {[my isclass $obj]} { $obj instfilter add ${type}Filter } else { $obj filter add ${type}Filter } } Trace proc delete {type obj} { if {[my isclass $obj]} { $obj instfilter delete ${type}Filter } else { $obj filter delete ${type}Filter } } Trace proc statReset {} { catch {my unset stat} } Trace proc statReportClass c { if {[my exists stat($c)]} { puts "\nClass $c: [my set stat($c)] references" foreach method [$c info instprocs] { set key $c->$method if {[info exists stat($key)]} { puts "\t$key: [my set stat($key)] references" } else { puts "\t$key: not used" } } } else { puts "\nClass $c: not used" } foreach subclass [lsort [$c info subclass]] { my [self proc] $subclass } } Trace proc statReport {} { my statReportClass Object } Trace proc statCount key { if {[my exists stat($key)]} { my incr stat($key) } else { my incr set stat($key) 1 } } Trace proc deprecated-function {name} { puts stderr "Function <$name> is deprecated. Use method with same name instead." } Object instproc traceFilter args { # don't trace the Trace object if {[self] eq "::Trace"} {return [next]} set context "[self callingclass]->[self callingproc]" set method [self calledproc] switch -- $method { proc - instproc {set dargs [list [lindex $args 0] [lindex $args 1] ...] } default {set dargs $args } } #my showStack Trace puts "CALL $context> [self]->$method $dargs (next=[self next])" set result [next] Trace puts "EXIT $context> [self]->$method ($result)" return $result } Object instproc lintFilter args { #puts stderr c=[self class],ic[my info class],p=[self calledproc] #puts stderr " =====================METHOD='[self calledproc]'" my instvar __reported switch -exact -- [self calledproc] { instvar { set ccls [self callingclass] set method [self callingproc] #puts stderr ccls=$ccls. if {$ccls eq ""} { ;## instvar in proc set bod [my info body $method] set context "proc [self]->$method" } else { ;## instvar in instproc set bod [$ccls info instbody $method] set context "instproc $ccls->$method" } foreach v $args { set vpattern "$v\[^a-zA-Z0-9\]" if {[regexp "\[\$\]$vpattern" $bod]} continue if {[regexp " *$vpattern" $bod]} continue #if {[regexp "info *exists *$vpattern" $bod]} continue #if {[regexp "append *$vpattern" $bod]} continue #if {[regexp "array.*$vpattern" $bod]} continue if {[info exists __reported($v,$context)]} continue set __reported($v,$context) 1 puts stderr "'$v' of 'instvar $args' is NOT used in\n\ $context ... {$bod}" } } } next } Object instproc statFilter args { # don't return statistics from the Trace object #puts stderr "self=[self]" if {[self] eq "::Trace"} {return [next]} set ccls [self callingclass] set cmet [self callingproc] set met [self calledproc] #::puts stderr "cls=$ccls->$cmet, [self]->$met" Trace statCount $ccls Trace statCount $ccls->$cmet next } ###################################################################### # show**** methods # Object instproc showVars args { set msg {} if {$args == {}} { foreach var [lsort [my info vars]] { if {[my array exists $var]} { append msg "\n\t$var: " #puts stderr "ARRAY $var" #puts stderr "ARRAY names <[[self]array names $var]>" foreach i [lsort [my array names $var]] { append msg $i=[my set ${var}($i)] ", " } } elseif {[my exists $var]} { append msg "\n\t$var: " [list [my set $var]] } else { append msg "\n\t$var: " UNKNOWN } } } else { foreach var $args { if {[my array exists $var]} { lappend msg $var: ARRAY } elseif {[my exists $var]} { lappend msg $var: [my set $var] } else { lappend msg $var: UNKNOWN } } } set method [self callingproc] set cls [self callingclass] puts stderr "[self] $cls->$method $msg" #puts stderr " MIXINS: [my info mixin]" } Object instproc showMsg msg { set method [self callingproc] set cls [self callingclass] puts stderr "[self] $cls->$method $msg" } Object instproc showClass {} { set method [self callingproc] set cls [self callingclass] puts stderr "[self] $cls->$method class [my info class]\ mixins {[my info mixin]}" } Object instproc showStack {{m 100}} { set max [info level] if {$m<$max} {set max $m} puts stderr "Call Stack (level: command)" for {set i 0} {$i < $max} {incr i} { if {[catch {set s [uplevel $i self]} msg]} { set s "" } puts stderr "[format %5d -$i]:\t$s [info level [expr {-$i}]]" } } Object instproc showCall {} { set method [self callingproc] set cls [self callingclass] set args [lreplace [info level -1] 0 0] puts stderr "[self] $cls->$method $args" } Object instproc showTimeStart {{handle __h}} { upvar [self callinglevel] $handle obj set obj [Object [self]::[my autoname __time]] $obj set clicks [clock clicks] return } Object instproc showTimeEnd {{handle __h}} { upvar [self callinglevel] $handle obj set method [self callingproc] set cls [self callingclass] set elapsed [expr {([clock clicks]-[$obj set clicks])/1000000.0}] puts stderr "[self] $cls->$method: elapsed [format %.2f $elapsed]secs" $obj destroy } ###################################################################### namespace export showCall showVars showObj showStack Trace } namespace import ::xotcl::trace::* ./xotcl-1.6.8/library/lib/._upvarcompat.xotcl000644 000765 000024 00000000430 12161607755 021672 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/upvarcompat.xotcl000644 000765 000024 00000003103 12161607755 021455 0ustar00neumannstaff000000 000000 package provide xotcl::upvar-compat 1.0 package require XOTcl 1 namespace eval ::xotcl::upvar-compat { namespace import ::xotcl::* @ @File {description { Provide a version of upvar and uplevel that provide backward compatibility such that these commands ignore inactive filter and mixin frames (upvar behaves the same whether or not a filter is installed). Newer scripts should use <@TT>upvar/uplevel [self callinglevel] var/command instead. } } } # Define upvar and uplevel; use the level, if given explizitely: # otherwise point to the callinglevel from XOTcl rename ::uplevel ::xotcl::tcl_uplevel proc ::uplevel {lvl args} { set cl [::xotcl::tcl_uplevel 1 ::xotcl::self callinglevel] if {[string match #* $cl]} { # we were called from XOTcl, use the XOTcl method set cmd [concat [list my uplevel $lvl] $args] } else { # no XOTcl in sight, use tcl variant set cmd [concat [list ::xotcl::tcl_uplevel $lvl] $args] } #puts stderr cmd=$cmd set code [catch [list ::xotcl::tcl_uplevel 1 $cmd] msg] return -code $code $msg } rename ::upvar ::xotcl::tcl_upvar proc ::upvar {lvl args} { set cl [::xotcl::tcl_uplevel 1 ::xotcl::self callinglevel] if {[string match #* $cl]} { # we were called from XOTcl, use the XOTcl method set cmd [concat [list my upvar $lvl] $args] #set code [catch {my uplevel $lvl $args} msg] } else { # no XOTcl in sight, use tcl variant set cmd [concat [list ::xotcl::tcl_upvar $lvl] $args] } set code [catch [list ::xotcl::tcl_uplevel 1 $cmd] msg] return -code $code $msg } puts stderr HU ./xotcl-1.6.8/library/lib/._wafecompat.tcl000644 000765 000024 00000000430 12161607767 021113 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/wafecompat.tcl000644 000765 000024 00000002564 12161607767 020710 0ustar00neumannstaff000000 000000 package provide xotcl::wafecompat 1.0 set WAFELIB /usr/lib/X11/wafe/ set MODULE_PATH "$WAFELIB $auto_path" set COMPONENT_PATH $WAFELIB/otcl-classes proc MOTIFPREFIX {} {return {}} proc requireModules modules { global MODULE_PATH foreach {cmd module} $modules { if {{} ne [info command $cmd] } continue if {[regexp {([A-Za-z1-9]+)Gen} $module _ n] || [regexp {lib([a-z]+)} $module _ n] || [regexp {^(.+)[.]so} $module _ n] } { set name [string toupper $n] } foreach path $MODULE_PATH { set f $path/tcllib/bin/$module if {[set found [file exists $f]]} { puts stderr "Loading module $name from $f" load $f $name break } } if {!$found} { error "Could not find module $module in {$MODULE_PATH}"} }} proc requireTclComponents {files} { global COMPONENT_PATH _componentLoaded foreach component $files { if {[info exists _componentLoaded($component)]} continue foreach path $COMPONENT_PATH { set f $path/$component if {[file exists $f]} { puts stderr "Loading source file $f" uplevel \#0 source $f set _componentLoaded($component) $f break } } if {![info exists _componentLoaded($component)]} { error "Could not find component $component in {$COMPONENT_PATH}" } }} proc addTimeOut {n cmd} { after $n $cmd } proc removeTimeOut {n} { after cancel $n } proc quit {} { exit } ./xotcl-1.6.8/library/lib/._xodoc.xotcl000644 000765 000024 00000000430 12161610036 020427 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/lib/xodoc.xotcl000644 000765 000024 00000026505 12161610036 020225 0ustar00neumannstaff000000 000000 package provide xotcl::xodoc 1.0 package require -exact xotcl::staticMetadataAnalyzer 1.0 package require -exact xotcl::htmllib 1.0 #package require -exact xotcl::trace 1.0 package require XOTcl 1 namespace eval ::xotcl::xodoc { namespace import ::xotcl::* @ @File { description { XOTcl documentation tool. Overloads the command @, which is used as a documentation token. } } @ Class MetadataTokenHTML { description {Instmixin to provide HTML printing. Such instmixins are registered for all token types. } } Class MetadataTokenHTML @ MetadataTokenHTML abstract instproc printHTML {} { description {Print token to HTML document object} } MetadataTokenHTML abstract instproc printHTML {} @ MetadataTokenHTML instproc getDocPropertiesHTML {} { description { Returns list of properties as HTML. } } MetadataTokenHTML instproc getDocPropertiesHTML {htmlDoc} { foreach p [my set properties] { $htmlDoc startTableRow -valign top if {[my exists $p]} { $htmlDoc startTableCell -valign top $htmlDoc addString " [my capitalize $p]:" $htmlDoc endTableCell $htmlDoc startTableCell -valign top if {$p eq "errorCodes"} { # Build table cell with list of error codes. foreach {code desc} [my set $p] { set code [string map [list < <\; > >\;] $code] set desc [string map [list < <\; > >\;] $desc] $htmlDoc addString "$code: $desc\n

    " } } else { $htmlDoc addString [my set $p] } $htmlDoc endTableCell } $htmlDoc endTableRow } } MetadataTokenHTML instproc reflowHTML {left paragraph} { #set result "" #foreach line [split $paragraph \n] { # if {![regexp {^ *$} $line]} { # append result "$left$line
    \n" # } #} #return $result return $paragraph } MetadataToken instmixin [concat [MetadataToken info instmixin] MetadataTokenHTML] @ Class FileTokenHTML -superclass MetadataTokenHTML Class FileTokenHTML -superclass MetadataTokenHTML FileTokenHTML instproc printHTML {htmlDoc} { $htmlDoc addLineBreak $htmlDoc addString " Filename: " $htmlDoc addAnchor [my set name] -href [my set name] $htmlDoc addLineBreak $htmlDoc addLineBreak $htmlDoc startTable -border 0 my getDocPropertiesHTML $htmlDoc $htmlDoc endTable } FileToken instmixin [concat [FileToken info instmixin] FileTokenHTML] @ Class ConstraintTokenHTML -superclass MetadataTokenHTML Class ConstraintTokenHTML -superclass MetadataTokenHTML ConstraintTokenHTML instproc printHTML {htmlDoc} { $htmlDoc addAnchor "" -name [my set name] $htmlDoc addString "

    Constraint: [my set name]

    " $htmlDoc addLineBreak $htmlDoc startTable -border 0 my getDocPropertiesHTML $htmlDoc $htmlDoc endTable } ConstraintToken instmixin [concat [ConstraintToken info instmixin] ConstraintTokenHTML] @ Class ObjTokenHTML -superclass MetadataTokenHTML Class ObjTokenHTML -superclass MetadataTokenHTML ObjTokenHTML instproc getProcsHTML {htmlDoc} { set c "" set pl [MetadataToken sortTokenList [my procList]] if {[my istype ClassToken]} { set pl [concat [MetadataToken sortTokenList [my instprocList]] $pl] } foreach p $pl { set pn [$p set name] set label($pn) "$pn" } foreach l [lsort [array names label]] { if {$c ne ""} {append c ", "} append c $label($l) } if {$c ne ""} {append c "."} $htmlDoc addString "$c" } ObjTokenHTML instproc printHTML {htmlDoc} { $htmlDoc addAnchor "" -name [my set name] if {[my istype MetaClassToken]} { set start "

    MetaClass:" } elseif {[my istype ClassToken]} { set start "

    Class:" } else { set start "

    Object:" } $htmlDoc addString "$start [my set name]

    " if {[my exists cl]} { $htmlDoc addString "Class: [my set cl]" $htmlDoc addLineBreak } if {[my exists heritage]} { $htmlDoc addString "Heritage: [my set heritage]" $htmlDoc addLineBreak } set head "" if {[my procList] ne ""} {set head " Procs "} if {[my istype ClassToken]} { if {[my instprocList] ne ""} {set head " Procs/Instprocs: "} } $htmlDoc addString $head my getProcsHTML $htmlDoc $htmlDoc startTable -border 0 my getDocPropertiesHTML $htmlDoc $htmlDoc endTable } ObjToken instmixin [concat [ObjToken info instmixin] ObjTokenHTML] @ Class MethodTokenHTML -superclass MetadataTokenHTML Class MethodTokenHTML -superclass MetadataTokenHTML # Prints out method information as HTML. MethodTokenHTML instproc printHTML {htmlDoc} { #my showVars set argText "\n" HtmlBuilder args set a "Arguments:" set anchor [my set obj]-[my set name] $htmlDoc addAnchor "" -name $anchor if {[my abstract]} {$htmlDoc addString "abstract"} $htmlDoc addString "[my set name] " args set indentLevel [$htmlDoc set indentLevel] if {[my exists arguments]} { #set argText "\n" foreach {arg argDescription} [my set arguments] { if {[llength $arg] > 1} { # A default value was given to the argument. $htmlDoc addString "?[lindex $arg 0]?" set at "?[lindex $arg 0]?:$argDescription Default: \"[lindex $arg 1]\"." } else { $htmlDoc addString "$arg" set at "$arg: $argDescription" } args startTableRow -valign top args startTableCell -valign top args addString $a set a "" args endTableCell args startTableCell -valign top args addString $at args endTableCell args endTableRow } } $htmlDoc startTable -border 0 $htmlDoc addString [args toString] args destroy my getDocPropertiesHTML $htmlDoc $htmlDoc endTable #$htmlDoc endListItem } MethodToken instmixin [concat [MethodToken info instmixin] MethodTokenHTML] @ Class XODoc { description "Handler class for building a documentation database" } Class XODoc -superclass StaticMetadataAnalyzer @ XODoc proc documentFileAsHTML { file "filename of the xotcl file to be documented" docdir "directory to which the html file is written" } { description "Uses the xoDoc package to produce an HTML documentation of a specified file ***.xotcl. The file is written to ***.html in docdir" return "file basename without suffix" } XODoc proc documentFileAsHTML {file docdir} { set docdb [XODoc [XODoc autoname docdb]] ::@ set analyzerObj $docdb $docdb analyzeFile $file set ext [file extension $file] if {$ext ne ""} {set ext -[string trimleft $ext .]} set docfilename [file rootname [file tail $file]]$ext $docdb writeFile ${docdir}/$docfilename.html $file $docdb destroy return $docfilename } XODoc instproc printPackages {htmlDoc} { my instvar packageList $htmlDoc addString "

    Package/File Information

    " if {[llength $packageList] > 0} { foreach t $packageList { if {[$t type] eq "provide"} { $htmlDoc addString " Package provided: [$t name] [$t version]" } elseif {[$t type] eq "require"} { $htmlDoc addString " Package required: [$t name] [$t version]" } $htmlDoc addLineBreak } } else { $htmlDoc addString " No package provided/required " $htmlDoc addLineBreak } } XODoc instproc printExtensions {htmlDoc} { my instvar extensions if {[info exists extensions]} { # Add list of extensions. foreach extension $extensions { $htmlDoc addLineBreak $htmlDoc addString "

    Document extension: [$extension name]" $htmlDoc addString "Description: [$extension description]" $htmlDoc addLineBreak } } } XODoc instproc printObjList {htmlDoc} { set objList [MetadataToken sortTokenList [my objList]] if {[llength $objList]>0} { $htmlDoc addLineBreak $htmlDoc addString "Defined Objects/Classes: " $htmlDoc startUnorderedList foreach obj $objList { set on [$obj set name] $htmlDoc startListItem $htmlDoc addAnchor "$on:" -href "#$on" $obj getProcsHTML $htmlDoc $htmlDoc addLineBreak $htmlDoc endListItem } $htmlDoc endUnorderedList } } XODoc instproc printFileToken {htmlDoc} { if {[my exists fileToken]} { [my set fileToken] printHTML $htmlDoc } else { $htmlDoc addString " No file information. \n" } $htmlDoc addLineBreak } XODoc instproc printConstraintsList {htmlDoc} { set constraintList [MetadataToken sortTokenList [my constraintList]] if {[llength $constraintList]>0} { $htmlDoc addLineBreak $htmlDoc addString "Defined Constraints: " $htmlDoc startUnorderedList foreach c $constraintList { set cn [$c set name] $htmlDoc startListItem $htmlDoc addAnchor "$cn:" -href "#$cn" $htmlDoc addLineBreak $htmlDoc endListItem } $htmlDoc endUnorderedList } } XODoc instproc printConstraints {htmlDoc} { foreach c [my set constraintList] { $htmlDoc addHorizontalRule $htmlDoc startParagraph $c printHTML $htmlDoc $htmlDoc endParagraph } $htmlDoc addLineBreak } XODoc instproc printProcsList {htmlDoc list string} { if {[llength $list] > 0} { $htmlDoc addString "

    $string

    " $htmlDoc startUnorderedList foreach s $list { $htmlDoc startListItem $s printHTML $htmlDoc $htmlDoc endListItem } $htmlDoc endUnorderedList } } XODoc instproc printObjs {htmlDoc} { set objList [MetadataToken sortTokenList [my objList]] foreach t $objList { $htmlDoc addHorizontalRule $htmlDoc startParagraph $t printHTML $htmlDoc if {[$t istype ClassToken]} { my printProcsList $htmlDoc [$t set instprocList] Instprocs } my printProcsList $htmlDoc [$t set procList] Procs $htmlDoc endParagraph } } XODoc instproc replaceFormatTags {fc} { regsub -all <@ $fc < fc regsub -all " htmlDoc addImage -src "./logo-100.jpg" -alt "$name" -align MIDDLE htmlDoc addStringDecr "$name" htmlDoc addHorizontalRule htmlDoc startParagraph my printPackages htmlDoc my printExtensions htmlDoc my printObjList htmlDoc my printConstraintsList htmlDoc my printFileToken htmlDoc my printObjs htmlDoc my printConstraints htmlDoc htmlDoc endParagraph htmlDoc addHorizontalRule htmlDoc startParagraph htmlDoc endParagraph htmlDoc addAnchor "Back to index page." -href "./index.html" htmlDoc addLineBreak htmlDoc addHorizontalRule htmlDoc startParagraph htmlDoc endParagraph htmlDoc endDocument set r [my replaceFormatTags [htmlDoc toString]] htmlDoc destroy return $r } @ XODoc instproc writeFile { filename "file name destination" name "name of the html document" } { description "Create HTML docuemntation from metadata token and write to file " } XODoc instproc writeFile {filename name} { set content [my printHTML $name] set f [open $filename w] puts $f $content close $f } namespace export \ MetadataTokenHTML FileTokenHTML ConstraintTokenHTML ObjTokenHTML \ MethodTokenHTML XODoc } namespace import ::xotcl::xodoc::* ./xotcl-1.6.8/library/patterns/._adapter.xotcl000644 000765 000024 00000000430 12161607317 022035 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/adapter.xotcl000644 000765 000024 00000001576 12161607317 021634 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::adapter 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::adapter { namespace import ::xotcl::* Class Adapter -superclass Class @ @File { description { Simple adapter pattern meta-class taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. } } Adapter instproc adapterFilter args { set r [self calledproc] my instvar specificRequest adaptee \ [list specificRequest($r) sr] if {[info exists sr]} { return [eval $adaptee $sr $args] } next } Adapter instproc init args { my instfilter add adapterFilter next my instproc setRequest {r sr} { my set specificRequest($r) $sr } my instproc setAdaptee {a} { my set adaptee $a } } namespace export Adapter } namespace import ::xotcl::pattern::adapter::* ./xotcl-1.6.8/library/patterns/._ChainOfResponsibility.xotcl000644 000765 000024 00000000430 12161607237 024665 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/ChainOfResponsibility.xotcl000644 000765 000024 00000002773 12161607237 024464 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::chainOfResponsibility 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::chainOfResponsibility { namespace import ::xotcl::* Class ChainOfResponsibility -superclass Class ChainOfResponsibility instproc chainingFilter args { set cp [self calledproc] set registrationclass [lindex [self filterreg] 0] $registrationclass instvar operations #puts stderr "CHAIN [array names [self regclass]::chainedOperations ]---$cp" if {[$registrationclass exists chainedOperations($cp)]} { # # a value is found on the chain, if it differs from the failure value ! # set failureValue [$registrationclass set chainedOperations($cp)] set r [my $cp $args] if {$r == $failureValue} { if {[my exists successor] && [set s [my set successor]] != ""} { #puts stderr "CHAIN: forwarding to $s" set r [$s $cp $args] } } set r ;# return $r } else { next ;# return [next] } } ChainOfResponsibility instproc init args { my instfilter add chainingFilter my parameter {successor} # chained operations hold their value of failure my array set chainedOperations {} } ChainOfResponsibility instproc addChainedOperation {name {failureValue ""}} { my set chainedOperations($name) $failureValue } ChainOfResponsibility instproc removeChainedOperation {name} { my unset chainedOperations($name) } namespace export ChainOfResponsibility } namespace import ::xotcl::pattern::chainOfResponsibility::* ./xotcl-1.6.8/library/patterns/._composite.xotcl000644 000765 000024 00000000430 12161607334 022416 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/composite.xotcl000644 000765 000024 00000002502 12161607334 022203 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::composite 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::composite { namespace import ::xotcl::* Class Composite -superclass Class @ @File { description { Simple composite pattern meta-class taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. } } Composite instproc addOperations args { foreach op $args { if {![my exists operations($op)]} { my set operations($op) $op } } } Composite instproc removeOperations args { foreach op $args { if {![my exists operations($op)]} { my unset operations($op) } } } Composite instproc compositeFilter args { # get the operations class variable from the object's class set registrationclass [lindex [self filterreg] 0] $registrationclass instvar operations # get the request set r [self calledproc] # check if the request is a registered operation if {[info exists operations($r)]} { foreach object [my info children] { # forward request eval $object $r $args } } return [next] } Composite instproc init {args} { my array set operations {} next my instfilter add compositeFilter } namespace export Composite } namespace import ::xotcl::pattern::composite::* ./xotcl-1.6.8/library/patterns/._COPYRIGHT000644 000765 000024 00000000430 12327000635 020627 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/COPYRIGHT000644 000765 000024 00000003401 12327000635 020413 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/patterns/._link.xotcl000644 000765 000024 00000000430 12161607347 021355 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/link.xotcl000644 000765 000024 00000001753 12161607347 021151 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::link 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::link { namespace import ::xotcl::* # # establish/introspect 'link' through link-instproc # Class Link -parameter { {link ""} } Link instproc adapterFilter args { set l [my set link] set m [self calledproc] # let link/destroy requests go through to the link if {$m eq "link" || $m eq "destroy"} { return [next] } if {[Object isobject $l]} { puts stderr "adapting $m on link [self] -> $l" eval $l $m $args } else { # if there is currently no link establish -> return if {$l eq ""} {return} error "Link: object $l is no xotcl object" } } Link instfilter adapterFilter # Link L # Class A # L link A # L w # w set a 45 # puts [w set a] # puts [L link] # #A destroy # puts ----1 # L set r 45 # puts ----2 namespace export Link } namespace import ::xotcl::pattern::link::* ./xotcl-1.6.8/library/patterns/._manager.xotcl000644 000765 000024 00000000430 12161607360 022025 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/manager.xotcl000644 000765 000024 00000001617 12161607360 021620 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::manager 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::manager { namespace import ::xotcl::* # # a simle manager pattern following buschmann (164) # based on dynamic object aggregation and using dynamic code # for supplier creation (instead of loading) # # it shares the suppliers ! # # # abstract supplier, init starts dynamic code creation # Class Supplier Supplier abstract instproc init args Supplier abstract instproc m args Class Manager -parameter { {supplierClass Supplier} } Manager instproc getSupplier {name} { if {[my info children [namespace tail $name]] != ""} { return [self]::[namespace tail $name] } else { return [my [my supplierClass] [namespace tail $name]] } } namespace export Supplier Manager } namespace import ::xotcl::pattern::manager::* ./xotcl-1.6.8/library/patterns/._observer.xotcl000644 000765 000024 00000000430 12161607371 022244 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/observer.xotcl000644 000765 000024 00000005034 12161607371 022034 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::observer 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::observer { namespace import ::xotcl::* Class Observer -superclass Class @ @File { description { Simple observer pattern meta-class taken from the paper 'Filters as a Language Support for Design Patterns in Object-Oriented Scripting Languages'. } } Class Observer::Subject -superclass Class Observer::Subject instproc notificationFilter {args} { set procName [self calledproc] my instvar \ preObservers [list preObservers($procName) preObs] \ postObservers [list postObservers($procName) postObs] if {[info exists preObs]} { foreach obj $preObs { $obj update [self] $args } } set result [next] if {[info exists postObs]} { foreach obj $postObs { $obj update [self] $args } } return $result } Class Observer::SubjectMgt Observer::SubjectMgt instproc attach {hook objs} { upvar [self callinglevel] $hook observers foreach obj $objs { if {![info exists observers] || [lsearch $observers $obj] == -1} { lappend observers $obj } } } Observer::SubjectMgt instproc detach {hook objs} { upvar [self callinglevel] $hook observers if {[info exists observers]} { foreach obj $objs { set p [lsearch $observers $obj] set observers [lreplace $observers $p $p] } } } Observer::SubjectMgt instproc attachPre {procName args} { my instvar preObservers my attach preObservers($procName) $args } Observer::SubjectMgt instproc attachPost {procName args} { my instvar postObservers my attach postObservers($procName) $args } Observer::SubjectMgt instproc detachPre {procName args} { my instvar preObservers my detach preObservers($procName) $args } Observer::SubjectMgt instproc detachPost {procName args} { my instvar postObservers my detach postObservers($procName) $args } Observer::Subject instproc init args { next my superclass [list Observer::SubjectMgt [my info superclass]] my instfilter notificationFilter } Observer instproc timeout t { my set timeout $t } Observer instproc update {subject args} { #addTimeOut [my set timeout] "my update $subject $args" #$subject getResponse # do something with the response puts [self]---update } namespace export Observer namespace eval Observer { namespace export Subject SubjectMgt } } namespace import ::xotcl::pattern::observer::* namespace eval Observer { namespace import ::xotcl::pattern::observer::Observer::* } ./xotcl-1.6.8/library/patterns/._OnCalleeProxy.xotcl000644 000765 000024 00000000430 12161607254 023141 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/OnCalleeProxy.xotcl000644 000765 000024 00000002007 12161607254 022726 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::onCalleeProxy 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::onCalleeProxy { namespace import ::xotcl::* Class OnCalleeProxy -superclass Class @ @File { description { Simple proxy pattern implementation enhanced with the ability to adapt calls solely for specified calling objects for each calling obj there may be a different delegator obj } } OnCalleeProxy instproc onCalleeProxyFilter args { set o [string trimleft [self callingobject] :] my instvar callee #puts stderr "[self class]: checking $o -- [self] -- [self calledproc] " if {[info exists callee($o)]} { return [::eval [set callee($o)] [self calledproc] $args] } else { next } } OnCalleeProxy instproc init args { my instfilter add onCalleeProxyFilter next my instproc setCallee {callingObj a} { my set callee([string trimleft $callingObj :]) $a } } namespace export OnCalleeProxy } namespace import ::xotcl::pattern::onCalleeProxy::* ./xotcl-1.6.8/library/patterns/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 021625 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/pkgIndex.tcl000644 000765 000024 00000002511 12327774260 021412 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::pattern::adapter 1.0 [list source [file join $dir adapter.xotcl]] package ifneeded xotcl::pattern::chainOfResponsibility 1.0 [list source [file join $dir ChainOfResponsibility.xotcl]] package ifneeded xotcl::pattern::composite 1.0 [list source [file join $dir composite.xotcl]] package ifneeded xotcl::pattern::link 1.0 [list source [file join $dir link.xotcl]] package ifneeded xotcl::pattern::manager 1.0 [list source [file join $dir manager.xotcl]] package ifneeded xotcl::pattern::observer 1.0 [list source [file join $dir observer.xotcl]] package ifneeded xotcl::pattern::onCalleeProxy 1.0 [list source [file join $dir OnCalleeProxy.xotcl]] package ifneeded xotcl::pattern::singleton 1.0 [list source [file join $dir Singleton.xotcl]] package ifneeded xotcl::pattern::sortedCompositeWithAfter 1.0 [list source [file join $dir SortedComposite.xotcl]] ./xotcl-1.6.8/library/patterns/._Singleton.xotcl000644 000765 000024 00000000430 12161607267 022363 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/Singleton.xotcl000644 000765 000024 00000003306 12161607267 022153 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::singleton 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::singleton { namespace import ::xotcl::* Class SingletonBase SingletonBase instproc getInstance args { my instvar _instance if {[info exists _instance]} { return $_instance } return "" } # # A simple pattern mixin that makes a class to a non-specializable singleton # Class NonSpecializableSingleton -superclass SingletonBase NonSpecializableSingleton instproc create args { my instvar _instance if {![info exists _instance]} { set _instance [self] next } return $_instance } NonSpecializableSingleton instproc getInstance {} { if {[info exists _instance]} { my instvar _instance return $_instance } return "" } # # Specializable Singleton # Class Singleton -superclass {SingletonBase Class} Singleton instproc singletonFilter args { switch -exact [self calledproc] { init { set registrationclass [lindex [self filterreg] 0] $registrationclass instvar _instance if {![info exists _instance]} { set _instance [self] next } else { my destroy } return $_instance } default { return [next] } } } Singleton instproc init args { my instfilter add singletonFilter # # specialized singletons have to look up the singleton class # first Class instproc getInstance {} { foreach sc [my info superclass] { if {[$sc info class] eq "::Singleton"} { return [$sc getInstance] } else { return "" } } } next } namespace export SingletonBase NonSpecializableSingleton Singleton } namespace import ::xotcl::pattern::singleton::* ./xotcl-1.6.8/library/patterns/._SortedComposite.xotcl000644 000765 000024 00000000430 12161607303 023533 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/patterns/SortedComposite.xotcl000644 000765 000024 00000003741 12161607303 023326 0ustar00neumannstaff000000 000000 package provide xotcl::pattern::sortedCompositeWithAfter 1.0 package require XOTcl 1 namespace eval ::xotcl::pattern::sortedCompositeWithAfter { namespace import ::xotcl::* Class SortedComposite -superclass Class @ @File { description { Composite pattern enhanced with sorting } } SortedComposite instproc remove {array element} { if {[my exists ${array}($element)]} { my unset ${array}($element) } } SortedComposite instproc addOperations args { foreach pair $args { foreach {proc op} $pair {my set operations($proc) $op} } } SortedComposite instproc removeOperations args { foreach op $args {my remove operations $op} } SortedComposite instproc addAfterOperations args { foreach pair $args { foreach {proc op} $pair {my set afterOperations($proc) $op} } } SortedComposite instproc removeAfterOperations args { foreach op $args {my remove afterOperations $op} } SortedComposite instproc compositeFilter args { set registrationclass [lindex [self filterreg] 0] set r [self calledproc] set result [next] if {[$registrationclass exists operations($r)] && [my exists children]} { set method [$registrationclass set operations($r)] foreach object [my set children] { eval [self]::$object $method $args } } if {[$registrationclass exists afterOperations($r)]} { eval my [$registrationclass set afterOperations($r)] $args } set result } SortedComposite instproc init args { my array set operations {} my array set afterOperations {} my instproc setChildren args { switch [llength $args] { 0 { return [my set children] } 1 { return [my set children [lindex $args 0]] } default {error "wrong # args: [self] setChildren ?children?"} } } my instproc appendChildren args { eval my lappend children $args } next my instfilter add compositeFilter } namespace export SortedComposite } namespace import ::xotcl::pattern::sortedCompositeWithAfter::* ./xotcl-1.6.8/library/._pkgIndex.tcl000644 000765 000024 00000000430 12161600305 017745 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/pkgIndex.tcl000644 000765 000024 00000000366 12161600305 017540 0ustar00neumannstaff000000 000000 set __dir__ $dir foreach index [concat \ [glob -nocomplain [file join $dir * pkgIndex.tcl]] \ [glob -nocomplain [file join $dir * * pkgIndex.tcl]]] { set dir [file dirname $index] source $index } set dir $__dir__ unset __dir__ ./xotcl-1.6.8/library/rdf/._COPYRIGHT000644 000765 000024 00000000430 12327000564 017543 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/rdf/COPYRIGHT000644 000765 000024 00000003401 12327000564 017327 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/rdf/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 020540 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/rdf/pkgIndex.tcl000644 000765 000024 00000001520 12327774260 020324 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::rdf::parser 1.0 [list source [file join $dir xoRDF.xotcl]] package ifneeded xotcl::rdf::recreatorVisitor 1.0 [list source [file join $dir rdfRecreatorVisitor.xotcl]] package ifneeded xotcl::rdf::triple 1.0 [list source [file join $dir RDFTriple.xotcl]] package ifneeded xotcl::rdf::tripleRecreator 1.0 [list source [file join $dir RDFCreator.xotcl]] ./xotcl-1.6.8/library/rdf/._RDFCreator.xotcl000644 000765 000024 00000000430 12161606731 021262 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/rdf/RDFCreator.xotcl000644 000765 000024 00000006502 12161606731 021053 0ustar00neumannstaff000000 000000 # $Id: RDFCreator.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $ package provide xotcl::rdf::tripleRecreator 1.0 package require XOTcl 1 package require -exact xotcl::rdf::parser 1.0 namespace eval ::xotcl::rdf::tripleRecreator { namespace import ::xotcl::* Class RDFCreator -parameter { {rdfNS "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} {openExprs ""} } Class OpenExpr -parameter { {type ""} {subject ""} {closing ""} } RDFCreator instproc init args { next } RDFCreator instproc free {} { my instvar openExprs while {$openExprs ne ""} { set o [lindex $openExprs 0] set openExprs [lrange $openExprs 1 end] $o destroy } } RDFCreator instproc sort {tl} { # # this assumes that the triples are created and named in node tree order, e.g. # through autonames like triple0, triple1, ... (as in rdfTripleCreator) # # => bag types defs are before bag's _1, _2 -- etc. # # otherwise overload sorting method ! # return [lsort $tl] } RDFCreator instproc createFromTriples {tripleList} { my instvar openExprs set heading "\n" set closing "\n" } } } if {[set nsPrefix [[self]::ns searchFullName $ns]] == ""} { [self]::ns add [set nsPrefix [my autoname $prefix]] $ns append heading "\n xmlns:${nsPrefix}=\"$ns\"" } set oe [lindex [my set openExprs] 0] if {$oe eq "" || [$oe subject] != $s} { if {$oe ne ""} { append body [$oe closing] [lindex [set openExprs] 0] destroy set openExprs [lrange $openExprs 1 end] } if {$opening eq ""} { append body "\n" set closing "\n" set type "Description" } else { append body $opening } set noe [my OpenExpr [my autoname oe]] set openExprs [concat $noe $openExprs] $noe subject $s $noe closing $closing $noe type $type set oe $noe } set tn ${nsPrefix}:$name switch -exact [$oe type] { RDFDescription { #puts DESCRIPTION append body "\n<$tn> [$t object] " } RDFAlt - RDFSeq { #puts ALT---$tn if {[regexp {rdf:_([0-9]*)} $tn _ __]} { append body "\n" } } RDFBag { if {[regexp {rdf:_([0-9]*)} $tn _ __]} { append body "\n<$tn resource=\"[$t object]\"/>" } } } } else { puts "Predicate '$p' not matched" # hier als xmlns behandeln ... } } append heading ">" set r $heading while {$openExprs ne ""} { set oe [lindex $openExprs 0] set openExprs [lrange $openExprs 1 end] append body [$oe closing] $oe destroy } append r $body append r "\n" return $r } namespace export RDFCreator OpenExpr } namespace import ::xotcl::rdf::tripleRecreator::* ./xotcl-1.6.8/library/rdf/._rdfRecreatorVisitor.xotcl000644 000765 000024 00000000430 12161606774 023340 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/rdf/rdfRecreatorVisitor.xotcl000644 000765 000024 00000002324 12161606774 023127 0ustar00neumannstaff000000 000000 package provide xotcl::rdf::recreatorVisitor 1.0 package require -exact xotcl::rdf::parser 1.0 package require -exact xotcl::xml::recreatorVisitor 1.0 package require XOTcl 1 namespace eval ::xotcl::rdf::recreatorVisitor { namespace import ::xotcl::* ############################################################################## # # a visitor that recreates an RDF representation from a # node tree # ############################################################################# Class RDFRecreatorVisitor -superclass XMLRecreatorVisitor RDFRecreatorVisitor instproc appendLineFeed obj { if {[set parseType [$obj getRDFAttribute parseType]] != ""} { if {$parseType ne "Resource"} { # we have parseType == Literal # -> don't append "\n" return "" } } return "\n" } RDFRecreatorVisitor instproc visit objName { next my instvar result if {[$objName istype RDFResource]} { foreach t [$objName array names rdfTypes] { set ts [$objName prependRDFPrefix type] append result " [my insertIndent $objName]<$ts resource=\"$t\"/>\n" } } return $result } namespace export RDFRecreatorVisitor } namespace import ::xotcl::rdf::recreatorVisitor::* ./xotcl-1.6.8/library/rdf/._RDFTriple.xotcl000644 000765 000024 00000000430 12161606704 021122 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/rdf/RDFTriple.xotcl000644 000765 000024 00000035743 12161606704 020724 0ustar00neumannstaff000000 000000 package provide xotcl::rdf::triple 1.0 package require XOTcl 1 package require -exact xotcl::rdf::parser 1.0 namespace eval ::xotcl::rdf::triple { namespace import ::xotcl::* Class RDFTriple -parameter { predicate subject object } RDFTriple instproc dump {} { #set o [my object]; if {[info command $o] ne ""} { $o showVars } #return "P: [my predicate] S: [my subject] O: [my object]\n" return "[my subject] -[my predicate]-> '[my object]'\n" } Class NodeInfo -parameter { lastCurrentNode {aboutEach 0} {aboutEachPrefix 0} topID {statements ""} } Class DescriptionInfo -superclass NodeInfo -parameter { {bagID 0} } Class PropertyInfo -superclass NodeInfo -parameter { {reify 0} generatedParentID } Class AboutEachMgr AboutEachMgr instproc init args { my array set entries {} next } AboutEachMgr instproc reset {} { foreach c [my info children] {$c destroy} my init } AboutEachMgr instproc addEntry {name} { my set entries($name) "" } AboutEachMgr instproc isEntry {name} { my exists entries($name) } AboutEachMgr instproc addTriple {name p s o} { if {[my exists entries($name)]} { set r [RDFTriple create [self]::[my autoname name%08d]] $r set predicate $p $r set subject $s $r set object $o my lappend entries($name) $r return $r } return "" } AboutEachMgr instproc getTriples {name} { if {[my exists entries($name)]} { my set entries($name) } else {return ""} } Class RDFTripleDB RDFTripleDB instproc add {p s o} { #my showCall set r [RDFTriple create [self]::[my autoname triple%08d]] $r set predicate $p $r set subject $s $r set object $o return $r } RDFTripleDB instproc dump {} { #my showCall set r "" foreach fact [my info children] {append r [$fact dump]} return $r } RDFTripleDB instproc getTriples {} { # for the time being: return only children of type RDFTriple set ch {} foreach c [my info children] {if {[$c istype "RDFTriple"]} {lappend ch $c}} return $ch #my info children } RDFTripleDB instproc reset {} { #my showCall foreach c [my info children] {$c destroy} my autoname -reset triple #my showMsg "children after reset: <[my info children]>'" } # return all triples that match the subject RDFTripleDB instproc querySubject {s} { #my showCall set r "" foreach t [my info children] { if {[string match $s [$t subject]]} { lappend r $t } } return $r } RDFTripleDB instproc queryPredicate {p} { #my showCall set r "" foreach t [my info children] { if {[string match $p [$t predicate]]} { lappend r $t } } return $r } RDFTripleDB instproc queryPredicateOnSubject {p s} { #my showCall foreach t [my querySubject $s] { if {[string match $p [$t predicate]]} { # there may be only one matching P on a S # return the triple return $t } } return "" } RDFTripleDB instproc prettyTriples {} { my instvar result if {[my exists table]} {my unset table} if {[my exists subjectPrinted]} {my unset subjectPrinted} set result "" foreach triple [lsort [my getTriples]] { set subject [$triple set subject] set predicate [$triple set predicate] set object [$triple set object] regexp {^http.*w3[.]org.*(\#.*)$} $predicate _ predicate regexp {^http.*w3[.]org.*(\#.*)$} $object _ object my lappend table($subject) $predicate $object } foreach subject [lsort [my array names table]] { if {![regexp {^rdfdoc\#} $subject]} { my prettyStatements "" $subject } } set r $result; set result "" foreach subject [lsort [my array names table]] { if {![my exists subjectPrinted($subject)]} { my prettyStatements "" $subject } } if {$result ne ""} { append r "\n=================== unreferenced:\n$result" } return $r } RDFTripleDB instproc prettyStatement {space subject predicate object} { my append result "$space [format %-35s $subject] [format %-25s $predicate] $object\n" } RDFTripleDB instproc prettyStatements {space subject} { if {![my exists table($subject)]} { my append result "$space NO VALUE FOR $subject\n" } else { if {![my exists subjectPrinted($subject)]} { my set subjectPrinted($subject) 1 foreach {predicate object} [my set table($subject)] { my prettyStatement $space $subject $predicate $object if {[regexp {^rdfdoc\#} $object]} { my prettyStatements "$space " $object } } } } } Class TripleVisitor -superclass NodeTreeVisitor -parameter { {descriptionAsBag 0} {currentNode ""} parser rdfNS } TripleVisitor instproc getInfo {} { my set openNode([my set currentNode]) } TripleVisitor instproc getLastInfo {info} { my set openNode([$info set lastCurrentNode]) } TripleVisitor instproc popInfo {objName} { set i [my getInfo] my set currentNode [$i set lastCurrentNode] my unset openNode($objName) return $i } TripleVisitor instproc pushInfo {objName ei} { set lce [$ei set lastCurrentNode [my set currentNode]] if {$lce ne ""} { set lastInfo [my set openNode($lce)] $ei aboutEach [$lastInfo aboutEach] $ei aboutEachPrefix [$lastInfo aboutEachPrefix] } my set openNode($objName) $ei my set currentNode $objName } TripleVisitor instproc qualify {obj var} { [$obj resolveNS] getFullName $var } TripleVisitor instproc init args { my array set openNode {{} {}} RDFTripleDB create [self]::db AboutEachMgr create [self]::aboutEach AboutEachMgr create [self]::aboutEachPrefix next } TripleVisitor instproc resetWithoutDB args { [self]::aboutEach reset [self]::aboutEachPrefix reset next } TripleVisitor instproc reset args { [self]::db reset my resetWithoutDB next } TripleVisitor instproc addDB {p s o} { #puts "ADDDB: P<$p> S<$s> O<$o>" set info [my getInfo] if {$info ne ""} { set topID [$info set topID] if {[$info aboutEach]} { return [[self]::aboutEach addTriple $topID $p $s $o] } elseif {[$info aboutEachPrefix]} { return [[self]::aboutEachPrefix addTriple $topID $p $s $o] } } return [[self]::db add $p $s $o] } TripleVisitor instproc checkReification {triple node} { # for statements that nest inside a description/property, we remember # the statement to be able to reify them # (e.g., bag created for description) if {$triple ne "" && $node ne ""} { set info [my set openNode($node)] if {[my isobject $info] && [$info istype NodeInfo]} { ${info} lappend statements $triple } } } TripleVisitor instproc qualifyWithBaseURL v { if {[string match "\#*" $v]} { return [[my set parser] baseURL]$v } return $v } TripleVisitor instproc RDFTag {objName} { set ns [$objName resolveNS] set rdfNS [$ns searchNamespaceByPrefix rdf] if {$rdfNS eq ""} { set rdfNS [$ns searchNamespaceByPrefix xmlns] } my set rdfNS $rdfNS } TripleVisitor instproc DescriptionNode objName { set di [DescriptionInfo create [self]::[my autoname di]] $di topID [my qualifyWithBaseURL [$objName getSubject]] my pushInfo $objName $di # # if a description nests inside a Member, we need a triple # for the member index (connected to the Description topId) # if {[namespace tail [[set member [$objName info parent]] info class]] \ == "RDFMember"} { set bag_ID [[$member info parent] set ID] my addDB [my qualify $objName [$member set memberIndex]] \ $bag_ID [$di set topID] } } TripleVisitor instproc handlePCData {objName pcdata} { set info [my getInfo] if {[set lcn [$info set lastCurrentNode]] == ""} { #puts stderr "cannot determine lastCurrentNode from $info" #$info showVars set selector "" } else { set selector [namespace tail [$lcn info class]] } switch -exact $selector { RDFDescription { set triple [my addDB \ [my qualify $objName [$objName set content]] \ [$info set topID] $pcdata] my checkReification $triple $lcn } RDFProperty { if {[set rAttr [$lcn getRDFAttribute resource]] != ""} { set triple [my addDB \ [my qualify $objName [$objName set content]] \ [$lcn set $rAttr] $pcdata] #$lcn showVars } else { set lastInfo [my getLastInfo $info] if {[$lastInfo exists generatedParentID]} { set parentID [$lastInfo set generatedParentID] } else { set parentID [[$objName info parent] set ID] } #set parentID [$lastInfo set generatedParentID] set triple [my addDB \ [my qualify $objName [$objName set content]] \ $parentID $pcdata] } } default { #puts stderr "create a generatedParentID for reification" $info set generatedParentID [[my set parser] makeID] set triple [my addDB \ [my qualify $objName [$objName set content]] \ [$info set generatedParentID] $pcdata] my checkReification $triple [my set currentNode] } } $info set tripleWritten 1 } TripleVisitor instproc Property objName { set info [PropertyInfo create [self]::[my autoname pi]] ## if we find no subject and are in Container -> ## reifiy over generatedParentID set propSubject [$objName getSubject] $info topID [my qualifyWithBaseURL $propSubject] my pushInfo $objName $info if {[$objName exists pcdata]} { my handlePCData $objName [$objName getFirstPCData] } } TripleVisitor instproc ContainerNode objName { set ID [my qualifyWithBaseURL [$objName set ID]] foreach t [$objName array names rdfTypes] { my addDB [my qualify $objName \ [$objName qualifyWithRdfNsPrefix type]] $ID $t } } TripleVisitor instproc Member objName { set container [$objName info parent] set resource [$objName qualifyWithRdfNsPrefix resource] set parseType [$objName qualifyWithRdfNsPrefix parseType] if {[$objName exists pcdata]} { set co [$objName getFirstPCData] } elseif {[$objName exists attributes(resource)]} { set co [$objName set attributes(resource)] } elseif {[$objName exists attributes($resource)]} { set co [$objName set attributes($resource)] } #puts stderr "CONTAINER = [info exists co]" if {[info exists co]} { my addDB \ [my qualify $container [$objName set memberIndex]] \ [$container set ID] $co } else { #$objName showVars } } TripleVisitor instproc visit objName { set cl [namespace tail [$objName info class]] $objName instvar attributes set triple "" #puts "********Visit $objName -- $cl" switch -exact $cl { RDFTag {my RDFTag $objName} RDFDescription {my DescriptionNode $objName} RDFProperty {my Property $objName} RDFBag - RDFSeq - RDFAlt {my ContainerNode $objName} RDFMember {my Member $objName} } foreach a [array names attributes] { regexp "^([$objName set rdfNSPrefix]:|)(.*)" $a _ __ an switch -exact $an { bagID { set info [my getInfo] $info set bagID 1 } aboutEach { set info [my getInfo] if {[DescriptionInfo info instances $info] eq ""} { error "AboutEach not in description" } $info aboutEach 1 [self]::aboutEach addEntry [my qualifyWithBaseURL [$objName getSubject]] } aboutEachPrefix { set info [my getInfo] if {[DescriptionInfo info instances $info] eq ""} { error "AboutEachPrefix not in description" } $info aboutEachPrefix 1 [self]::aboutEachPrefix addEntry [my qualifyWithBaseURL [$objName getSubject]] } resource { if {$cl eq "RDFProperty"} { my handlePCData $objName [set attributes($a)] } } } } } TripleVisitor instproc reificate {objName p s o} { set memberID [[my set parser] makeID] my addDB [my qualify $objName \ [$objName qualifyWithRdfNsPrefix predicate]] $memberID $p my addDB [my qualify $objName \ [$objName qualifyWithRdfNsPrefix subject]] $memberID $s my addDB [my qualify $objName \ [$objName qualifyWithRdfNsPrefix object]] $memberID $o my addDB [my qualify $objName \ [$objName qualifyWithRdfNsPrefix type]] $memberID \ [my qualify $objName [$objName qualifyWithRdfNsPrefix Statement]] return $memberID } TripleVisitor instproc visitEnd objName { switch -exact [namespace tail [$objName info class]] { RDFDescription { set di [my popInfo $objName] if {[my descriptionAsBag] || [$di set bagID]} { set bagID [$objName set bagID] my addDB [my qualify $objName [$objName qualifyWithRdfNsPrefix type]] \ $bagID [my qualify $objName [$objName qualifyWithRdfNsPrefix Bag]] set bagCount 0 foreach s [$di set statements] { set memberID [my reificate $objName \ [$s set predicate] [$s set subject] [$s set object]] my addDB [my qualify $objName \ [$objName qualifyWithRdfNsPrefix _[incr bagCount]]] \ $bagID $memberID } } foreach t [$objName array names rdfTypes] { my addDB [my qualify $objName [$objName qualifyWithRdfNsPrefix "type"]] \ [$objName getSubject] $t } $di destroy } RDFProperty { set info [my popInfo $objName] if {![$info exists tripleWritten]} { set triple "" foreach fc [$objName info children] { switch -exact [namespace tail [$fc info class]] { RDFDescription { set triple [my addDB \ [my qualify $objName [$objName set content]] \ [my qualifyWithBaseURL [$objName getSubject]] [$fc getSubject]] break } RDFBag - RDFSeq - RDFAlt { set triple [my addDB \ [my qualify $objName [$objName set content]] \ [my qualifyWithBaseURL [$objName getSubject]] [$fc set ID]] break } } } if {$triple ne ""} { my checkReification $triple [my set currentNode] } } $info destroy } } } TripleVisitor instproc evaluateAboutEach {} { set triplesWritten "" set rdfNSFullName [[my rdfNS] searchPrefix rdf] foreach entry [[self]::aboutEach array names entries] { # matching entry triples should be bag types and their # members -> duplication of aboutEach statements for the # members foreach entryTriple [lsort [[self]::db querySubject $entry]] { if {[regexp "^${rdfNSFullName}_\[0-9\]*$" [$entryTriple predicate]]} { foreach t [[self]::aboutEach getTriples $entry] { set subject [$t subject] # if this is a toplevel elt of an about each tree -> its # subject is the object of the container member if {$subject eq $entry} { [self]::db add [$t predicate] [$entryTriple object] [$t object] } elseif {[lsearch $triplesWritten $t] == -1} { [self]::db add [$t predicate] $subject [$t object] lappend triplesWritten $t } } } } } } TripleVisitor instproc interpretNodeTree {node} { my set parser [$node set parser] $node accept [self] my evaluateAboutEach } namespace export RDFTriple NodeInfo DescriptionInfo PropertyInfo \ AboutEachMgr RDFTripleDB TripleVisitor } namespace import ::xotcl::rdf::triple::* ./xotcl-1.6.8/library/rdf/._xoRDF.xotcl000644 000765 000024 00000000430 12161607033 020305 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/rdf/xoRDF.xotcl000644 000765 000024 00000054160 12161607033 020101 0ustar00neumannstaff000000 000000 package provide xotcl::rdf::parser 1.0 package require XOTcl 1 package require -exact xotcl::xml::parser 1.0 #package require -exact xotcl::pattern::link 1.0 package require -exact xotcl::trace 1.0 namespace eval ::xotcl::rdf::parser { namespace import ::xotcl::* ############################################################################## # # RDF Parse Type Handling for RDF Node Class and RDF Parser class # to be used as mixin. Here, we have decomposed the parse type handling # ############################################################################## # # Nodes just call "isParseLiteral", "isParseResource", and "handleParseType" # by their template methods -> mixins concretizes implementation # Class RDFNodeParseTypeHandling # # parseType=literal nodes are not parsed, but handled as literals # -> the XML parser should parse these nodes -> we have cut them off # if we encounter "parseType = literal" nextParsedLiterals searches the # parseLiterals array and returns the content # RDFNodeParseTypeHandling instproc nextParsedLiterals {} { set parser [my set parser] $parser set parseLiterals([$parser incr parseLiteralsCount]) } # # handle attributes that determine the parse type # RDFNodeParseTypeHandling instproc handleParseType value { if {$value eq "Resource"} { my set parseResource 1 } else { # with RDF 1.0 all values other than Resource are treated # as parseType = literal my set pcdata [list "" [my nextParsedLiterals]] my set parseLiteral 1 } } # # two convinience methods that tell us whether the parse type is literal/resource # RDFNodeParseTypeHandling instproc isParseLiteral {} { # # if the parse literal var is set -> one child # is of type ParseTypeLiteral ! # my exists parseLiteral } RDFNodeParseTypeHandling instproc isParseResource {} { # # if the parseResource var is set -> one child # is of type ParseTypeResource ! # my exists parseResource } # # and we overload the Parser's parse method in order to cut off # all parseType = "Literal", because we have to hinder the XML # parser to parse RDF text that is marked as parseType = literal # we store the result in an array "parseLiterals" that is used # by the RDFNodeParseTypeHandling Mixin # Class RDFParserParseTypeHandling RDFParserParseTypeHandling instproc parse data { my array set parseLiterals {} my set parseLiteralsCount 0 set count 0 set dt $data while {[set pt [string first "parseType" $dt]] != -1} { # we cut the string off manually, because a regexp is slower if {$::tcl_version > 8.0} { set last [string first "=" $dt $pt] } else { set last [string first "=" [string range $dt $pt end]] incr last $pt } set ptStart [expr {[string last "<" [string range $dt 0 $pt]] + 1}] set propName [string range $dt $ptStart $pt] set blank [string first " " $propName] if {$blank != -1} { set propName [string range $propName 0 [expr {$blank -1}]] } set dt [string range $dt $last end] # All parse types != Resource treated as literals if {![regexp {^= *[\"']Resource} $dt]} { regexp -indices ">" $dt idx set start [lindex $idx 1] if {[regexp -indices "" $dt idx]} { set endTagLeft [lindex $idx 0] set literal [string range $dt [expr {$start + 1}] [expr {$endTagLeft - 1}]] set dt [string range $dt $endTagLeft end] my set parseLiterals([incr count]) $literal } else { error "end tag for $propName missing" } } } next $data } ############################################################################## # # RDFNode Node Class # ############################################################################## Class RDFNode -superclass XMLNode -parameter { subject {rdfNSPrefix ""} } @ Class RDFNode -superclass XMLNode { description { general superclass for RDF nodes common properties } } # # add mixins for parse type handling # RDFNode instproc init args { next my mixin add RDFNodeParseTypeHandling set p [my info parent] if {[$p exists rdfNSPrefix]} { my set rdfNSPrefix [$p set rdfNSPrefix] #puts stderr "RDF Prefix defined in [self]->init to [$p set rdfNSPrefix]" } } RDFNode instproc parseData {text} { if {[my isParseLiteral]} {return} next } # # try to find the "subject" of the RDF statement -> # if it not found on the actual node search the parents # # per default subject is ""; subclasses add subjects, # when they encounter ID, about, ... attrs # RDFNode instproc getSubject {} { for {set o [self]} {![$o istype RDFTag]} {set o [$o info parent]} { if {[$o exists subject]} {return [$o set subject]} } return "" } # # lets the parser construct an unique ID in the parser # RDFNode instproc makeID {} { [my set parser] makeID } # # abstract methods that have to be concretized with parse type handling # by a parse type mixin (or in subclass) # RDFNode abstract instproc isParseLiteral {} RDFNode abstract instproc isParseResource {} RDFNode abstract instproc handleParseType value RDFNode instproc appendRDFType t { set t [[my resolveNS] getFullName $t] my set rdfTypes($t) 1 } # # get a typed node abbreviation -> convert it to # a description + a nested rdf:type property # RDFNode instproc getTypedNode {name attrList} { set r [my getNestingNode RDFDescription \ [my qualifyWithRdfNsPrefix Description] $attrList] $r appendRDFType $name set r } # # try to parse children corresponding to parse type or if none is given # try to parse a child of type obj -> Description or Container # RDFNode instproc parseNestedChild {name attrList} { if {[my isParseResource]} { if {![my exists resourceDescription]} { my set resourceDescription \ [my getNestingNode RDFDescription \ [my qualifyWithRdfNsPrefix Description] {}] # we have resolved parseType="resource" with a description # -> remove parse type attribute info ... it is not correct anymore, # but remember parseResource flag if {[my exists attributes(parseType)]} { my unset attributes(parseType) } if {[my exists attributes([set parseType [my qualifyWithRdfNsPrefix parseType]])]} { my unset attributes($parseType) } } set r [[my set resourceDescription] getPropertyNodeChild $name $attrList] } elseif {[my isParseLiteral]} { set r [self] # literal -> do nothing } else { if {[set node [my isNestingNode $name]] ne ""} { set r [my getNestingNode $node $name $attrList] } else { set r [my getTypedNode $name $attrList] } } return $r } # # step forward in the attrList # RDFNode instproc nextAttrNode {node attrList index} { upvar [self callinglevel] $index i $attrList a if {$node ne ""} { set a [lreplace $a $i [expr {$i + 1}]] } else { incr i 2 } } # # create a child node of Property type and return it # # don't build a node for "type" properties, but append them to # the list # RDFNode instproc getPropertyNodeChild {name attrList} { regexp "^[my set rdfNSPrefix]:(.*)" $name _ name set parser [my set parser] if {$name eq "type" && [my istype RDFResource]} { # seek for resource attribute and append type to list set rp [my prependRDFPrefix resource] set rdfns [$parser set rdfNamespace] foreach {n v} $attrList { if {![my istype RDFContainerNodeClass]} { if {$n eq $rp || $n eq "resource"} { foreach c {Bag Alt Seq} { if {$v eq "$rdfns$c"} { my class RDF$c my set memberNr 0 my set ID [my set bagID] my unset bagID my set content [my prependRDFPrefix $c] # reclass existing li props to member set li [my prependRDFPrefix li] foreach child [lsort [my info children]] { if {[namespace tail [$child info class]] eq "RDFProperty"} { if {[$child set content] eq $li || [$child set content] eq "li"} { $child class RDFMember my giveMemberNr $child $child set content $li } } } } } } } my appendRDFType $v } return [self] } else { set nf [$parser set nodeFactory] set r [$nf getNode RDFProperty [self]::[my nextChild prop] $parser] $r set content $name $r parseAttributes $name $attrList set r } } # # property in abbr syntax (as attribute) # RDFNode instproc propertyAttribute {n v} { set r [my getPropertyNodeChild $n ""] $r parseData $v set r } # # check whether an attribute name matches an attributed RDFNode # of this class or not # return the corresponding node class # RDFNode instproc isAttribute {n} { regexp "^[my set rdfNSPrefix]:(.*)" $n _ n if {[lsearch [[my info class] set attributeList] $n] != -1} { return $n } elseif {$n eq "xml:lang"} { # we create attribute for xml_lang (for recreation purposes) return $n } return "" } # # check if name matches an node class that may be nested in [self] # RDFNode instproc isNestingNode {n} { regexp "^[my set rdfNSPrefix]:(.*)" $n _ n set cl [my info class] if {[$cl exists nestingList($n)]} { return [$cl set nestingList($n)] } return "" } RDFNode instproc getNestingNode {node name attrList} { set parser [my set parser] set nf [$parser set nodeFactory] switch [namespace tail $node] { "RDFMember" - "RDFProperty" {set objName prop} default {set objName res} } set r [$nf getNode $node [self]::[my nextChild $objName] $parser] $r set content $name $r parseAttributes $name $attrList set r } # # check whether the RDF namespace is redefined to another prefix # RDFNode instproc makeIndividualNSEntry {prefix entry} { if {$entry eq [[my set parser] rdfNamespace]} { if {[my set rdfNSPrefix] eq "" || $prefix ne "xmlns"} { my set rdfNSPrefix $prefix } #puts stderr "RDF Prefix redefined in [self] to $prefix" } next } RDFNode instproc qualifyWithRdfNsPrefix t { set ns [my set rdfNSPrefix] if {$ns eq "xmlns"} {return $t} return $ns:$t } # # checks whether a given attribute is part of the attributes array # and returns the varname, otherwise "" # RDFNode instproc getAttribute {n nsFullName} { set ns [my resolveNS] set xmlns [$ns searchPrefix xmlns] if {$xmlns eq $nsFullName && [my exists attributes($n)]} { return attributes($n) } set prefix [$ns searchFullName $nsFullName] if {$prefix ne "" && [my exists attributes($prefix:$n)]} { return attributes($prefix:$n) } return "" } # # searches for attribute "n" with rdf namespace prefix # RDFNode instproc getRDFAttribute {n} { if {[my exists attributes($n)]} { return [my set attributes($n)] } set rdfNSPrefix [my set rdfNSPrefix] if {$rdfNSPrefix ne "xmlns"} { set n $rdfNSPrefix:$n if {[my exists attributes($n)]} { return [my set attributes($n)] } } return "" } RDFNode instproc prependRDFPrefix ts { set rdfNSPrefix [my set rdfNSPrefix] if {$rdfNSPrefix ne "xmlns"} {set ts $rdfNSPrefix:$ts} return $ts } ############################################################################## # # superclass for all resources (like Description, Alt, Seq, Beg) # used directly in the parse tree ... resource nodes are mixed in # ############################################################################## Class RDFResource -superclass RDFNode RDFResource instproc print {} { set t [my array names rdfTypes] if {$t eq ""} {return [next]} else {return "[next]\nTYPES: $t"} } ############################################################################## # # superclasses for container node classes (alt seq bag) # ############################################################################## Class RDFContainerNodeClass -superclass RDFResource RDFContainerNodeClass instproc init args { # cache the member number # 0 inidicates, there is currently no member next my set memberNr 0 my set ID [my makeID] my appendRDFType [my qualifyWithRdfNsPrefix \ [[my info class] set content]] } RDFContainerNodeClass instproc parseAttributes {name attrList} { #set index 0 foreach {n v} $attrList { if {[set an [my isAttribute $n]] ne ""} { my set attributes($n) $v if {$an eq "ID"} { my set subject $v my set ID [[my set parser] set baseURL]\#$v } } #set attrList [my nextAttrNode $an attrList index] } } RDFContainerNodeClass instproc giveMemberNr {member} { set pf [my getContentPrefix] if {$pf ne ""} {append pf ":"} $member set memberIndex "${pf}_[my incr memberNr]" } RDFContainerNodeClass instproc parseStart {name attrList} { set r [self] next if {[set node [my isNestingNode $name]] ne ""} { set r [my getNestingNode $node $name $attrList] if {[namespace tail [$r info class]] eq "RDFMember"} { my giveMemberNr $r } } else { set r [my getPropertyNodeChild $name $attrList] } return $r } ############################################################################## # # Concrete Factory for creating RDF-style nodes # ############################################################################## Class RDFNodeClassFactory -superclass XMLNodeClassFactory RDFNodeClassFactory instproc content content { my set content $content } RDFNodeClassFactory instproc attributeList attributeList { my set attributeList $attributeList } RDFNodeClassFactory instproc nestingTo nestingTo { set name [string trimleft [self] :] foreach cl $nestingTo { $cl set nestingList([my set content]) $name } } RDFNodeClassFactory proc create args { # create the class set name [next] switch -exact $name { RDFDescription - RDFProperty - RDFMember { my array set attributeList {} } RDFMember - RDFProperty { my array set nestingList {} } } } ########################################################################## # # now create a factory and build all the node classes # needed for the RDF Parser/Interpreter # ########################################################################## RDFNodeClassFactory proc createFactories {} { foreach {name superclasses content attributeList} { RDFTag RDFNode RDF {} RDFBag RDFContainerNodeClass Bag {ID} RDFSeq RDFContainerNodeClass Seq {ID} RDFAlt RDFContainerNodeClass Alt {ID} RDFProperty RDFNode "" {bagID ID resource parseType} RDFMember RDFProperty li {resource parseType} RDFDescription RDFResource Description {ID bagID about type aboutEach aboutEachPrefix} } { #puts "Create class: $name -superclass $superclasses" RDFNodeClassFactory create $name -superclass $superclasses \ -content $content \ -attributeList $attributeList } } RDFNodeClassFactory createFactories # # define nesting constraints # RDFTag nestingTo {} RDFBag nestingTo {RDFTag RDFProperty} RDFSeq nestingTo {RDFTag RDFProperty} RDFAlt nestingTo {RDFTag RDFProperty} RDFMember nestingTo {RDFContainerNodeClass RDFBag RDFSeq RDFAlt} RDFProperty nestingTo {} RDFDescription nestingTo {RDFTag RDFMember RDFProperty} ############################################################################## # # add some methods to the property node class # ############################################################################## RDFProperty instproc parseAttributes {name attrList} { set r [self] #set index 0 foreach {n v} $attrList { if {[my checkForXmlNS $n $v]} {continue} if {[set an [my isAttribute $n]] ne ""} { my set attributes($n) $v if {$an eq "parseType"} {my handleParseType $v} } else { if {![info exists abbrvPropResource]} { set abbrvPropResource \ [my getNestingNode RDFDescription \ [my qualifyWithRdfNsPrefix Description] {}] } $abbrvPropResource propertyAttribute $n $v } #set attrList [my nextAttrNode $an attrList index] } if {[info exists abbrvPropResource]} { # if resource attribute is given -> use it for abbr property # description as about attr if {[my exists attributes(resource)]} { set about [my set attributes(resource)] my unset attributes(resource) } if {[my exists attributes([set resource [my qualifyWithRdfNsPrefix resource]])]} { set about [my set attributes($resource)] my unset attributes($resource) } if {[info exists about]} { $abbrvPropResource set attributes(about) $about $abbrvPropResource set subject $about } } } RDFProperty instproc parseStart {name attrList} { if {[my isParseLiteral]} {return [self]} next return [my parseNestedChild $name $attrList] } ############################################################################## # # add methods to the member class # ############################################################################## RDFMember parameter { memberIndex } RDFMember instproc parseAttributes {name attrList} { #set index 0 foreach {n v} $attrList { if {[set an [my isAttribute $n]] ne ""} { my set attributes($n) $v if {$an eq "parseType"} {my handleParseType $v} } #set attrList [my nextAttrNode $an attrList index] } } RDFMember instproc print {} { return "[next]\nMEMBER-INDEX: [my set memberIndex]" } ############################################################################## # # add methods to the description node class # ############################################################################## RDFDescription instproc init {args} { next set ID [my makeID] my set subject $ID my set bagID $ID } RDFDescription instproc parseAttributes {name attrList} { set r [self] # if the parent is a property with an ID -> use it # as description subject set ID [my qualifyWithRdfNsPrefix ID] set parent [my info parent] if {[$parent exists attributes(ID)]} { my set subject [$parent set attributes(ID)] } elseif {[$parent exists attributes($ID)]} { my set subject [$parent set attributes($ID)] } foreach {n v} $attrList { if {[my checkForXmlNS $n $v]} {continue} if {[set an [my isAttribute $n]] ne ""} { my set attributes($n) $v switch -exact $an { about - ID - aboutEach - aboutEachPrefix { my set subject $v } bagID { my set bagID [[my set parser] set baseURL]\#$v } type { my appendRDFType $v } } } else { set r [my propertyAttribute $n $v] } } return $r } RDFDescription instproc parseStart {name attrList} { next return [my getPropertyNodeChild $name $attrList] } ############################################################################## # # add some methods to the node class # ############################################################################## RDFTag parameter {{startTagOn 0}} RDFTag instproc match {c} { # the prefix of the topnode determines initially how the RDF # namespace is named ... since several examples don't have a # namespace definition for this ns, we set here a default, which # may be overridden by ns definitions in the XML text if {[regexp {^([^:]*):(.*)} $c _ pre c]} { my makeIndividualNSEntry $pre [[my set parser] rdfNamespace] #puts stderr "Making RDF namespace entry for <$pre>" } #puts "Match for $c --- Content: [[my info class] set content]" expr {$c eq [[my info class] set content]} } RDFTag instproc parseStart {name attrList} { set parsed 0 if {[set node [my isNestingNode $name]] ne ""} { set r [my getNestingNode $node $name $attrList] } else { set r [my getTypedNode $name $attrList] } next return $r } RDFTag instproc parseEnd content { if {!([my startTagOn] && [my match $content])} { [my errorChild $content] } next self ;# return [self] } ############################################################################## # # RDF Factory for creating node objects # ############################################################################## Class RDFNodeFactory -superclass XMLNodeFactory RDFNodeFactory create rdfNodeFactory -sharedNodes {RDFDescription RDFTag} ############################################################################## # # RDF parser class used to access the xml parser and produce the # rdf node tree # ############################################################################## Class RDFParser -superclass XMLParser -parameter { {baseURL "rdfdoc"} {rdfNamespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"} } RDFParser instproc init args { my mixin add RDFParserParseTypeHandling ### this special parser handles rdf:RDF tags my topLevelHandlerPattern {^([^:]*):RDF|RDF} RDFTag next my set nodeFactory "rdfNodeFactory" } RDFParser instproc makeID {} { my autoname [my baseURL]\#id } RDFParser instproc reset {} { next set id [my baseURL]\#id my autoname -reset $id } RDFParser instproc createTopLevelNode {name attrList} { set tn [next] #$tn makeIndividualNSEntry xmlns [my set rdfNamespace] ### toplevel node must be of type RDFTag if {![$tn istype RDFTag]} { error "Top level node must be of type RDFTag" } if {[$tn match $name]} { $tn set content $name $tn startTagOn 1 ### use default values for rdf/default (xmlns) namespace #my makeIndividualNSEntry rdfs "http://www.w3.org/TR/1999/PR-rdf-schema-19990303#" foreach {n v} $attrList { if {[$tn checkForXmlNS $n $v]} {continue} } } return $tn } #RDFParser instproc parse data { # next #} namespace export RDFNodeParseTypeHandling RDFParserParseTypeHandling \ RDFNode RDFResource RDFContainerNodeClass RDFNodeClassFactory \ RDFNodeFactory RDFParser rdfNodeFactory \ RDFTag RDFBag RDFSeq RDFAlt RDFProperty RDFMember RDFDescription } namespace import ::xotcl::rdf::parser::* ./xotcl-1.6.8/library/registry/._COPYRIGHT000644 000765 000024 00000000430 12327000570 020635 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/registry/COPYRIGHT000644 000765 000024 00000003401 12327000570 020421 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/registry/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 021635 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/registry/pkgIndex.tcl000644 000765 000024 00000001067 12327774260 021427 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::registry::registry 1.0 [list source [file join $dir Registry.xotcl]] ./xotcl-1.6.8/library/registry/._Registry.xotcl000644 000765 000024 00000000430 12161607476 022243 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/registry/Registry.xotcl000644 000765 000024 00000004174 12161607476 022037 0ustar00neumannstaff000000 000000 package provide xotcl::registry::registry 1.0 package require -exact xotcl::trace 1.0 package require -exact xotcl::rdf::triple 1.0 package require -exact xotcl::rdf::tripleRecreator 1.0 package require -exact xotcl::actiweb::agent 1.0 package require XOTcl 1 namespace eval ::xotcl::registry::registry { namespace import ::xotcl::* Class Registry -superclass Agent Registry instproc init args { next my exportProcs register query queryProperty RDFParser [self]::parser TripleVisitor [self]::tripleVisitor -parser [self]::parser [self]::tripleVisitor descriptionAsBag 0 my array set services {} } Registry instproc register {rdfScript} { #my showCall [[self]::tripleVisitor set parser] parse $rdfScript [self]::tripleVisitor interpretNodeTree [self]::parser::topNode [self]::tripleVisitor resetWithoutDB foreach serviceTriple [[self]::tripleVisitor::db queryPredicate \ "http://nestroy.wi-inf.uni-essen.de/schema/service#name"] { set service [$serviceTriple object] if {[info exists services($service)]} { puts stderr "we have already such a service '$service'" # hier koennte man ueberlegen, den service zu loeschen oder nicht # zZT: loesche altes service } puts stderr "REGISTRY: registering $service with [$serviceTriple subject]" my set services($service) [$serviceTriple subject]; } } Registry instproc query {service} { my showCall if {[info exists services($service)]} { set s [my set services($service)] return [[Place getInstance]::rdfCreator createFromTriples [[self]::tripleVisitor::db querySubject $s]] } } Registry instproc queryProperty {args} { # returns first service with matching properties my showCall foreach s [my array names services] { set success 1 foreach {att value} $args { set t [[self]::tripleVisitor::db queryPredicateOnSubject $att [my set services($s)]] if {$t eq "" || [$t object] != $value} { set success 0 break } } if {$success} { set r [my query $s] return $r } else { return "" } } } namespace export Registry } namespace import ::xotcl::registry::registry::* ./xotcl-1.6.8/library/serialize/._COPYRIGHT000644 000765 000024 00000000430 12327000576 020762 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/serialize/COPYRIGHT000644 000765 000024 00000003401 12327000576 020546 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/serialize/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 021754 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/serialize/pkgIndex.tcl000644 000765 000024 00000001413 12327774260 021541 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::scriptCreation::recoveryPoint 1.0 [list source [file join $dir RecoveryPoint.xotcl]] package ifneeded xotcl::scriptCreation::scriptCreator 1.0 [list source [file join $dir ScriptCreator.xotcl]] package ifneeded xotcl::serializer 1.0 [list source [file join $dir Serializer.xotcl]] ./xotcl-1.6.8/library/serialize/._RecoveryPoint.xotcl000644 000765 000024 00000000430 12161604254 023351 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/serialize/RecoveryPoint.xotcl000644 000765 000024 00000024243 12161604254 023144 0ustar00neumannstaff000000 000000 # $Id: RecoveryPoint.xotcl,v 1.4 2006/02/18 22:17:33 neumann Exp $ package provide xotcl::scriptCreation::recoveryPoint 1.0 package require XOTcl 1 namespace eval ::xotcl::scriptCreation::recoveryPoint { namespace import ::xotcl::* ## fehlt noch: filter, mixins, metadata, ass, assoption, etc ## beim recover Class's,Object's proc instproc vars nicht ueberschreiben ## filter dann anhaengen etc ... ## der Recovery Filter darf durch Object filter "" nicht gelöscht werden # # filter to ensure that recovering doesn't overwrite # existing objs/classes # Object instproc recoveryFilter args { ::set method [self calledproc] switch -- $method { create { # don't overwrite objects if {![::Object isobject [lindex $args 0]]} { next } else { # puts stderr "Recovery Filter: omitting [lindex $args 0]" } } proc { if {[lsearch [my info procs] [lindex $args 0]] == -1} { next } else { # puts stderr "Recovery Filter: omitting proc [self]::[lindex $args 0]" } } instproc { if {[lsearch [my info instprocs] [lindex $args 0]] == -1} { next } else { # puts stderr "Recovery Filter: omitting instproc [self]::[lindex $args 0]" } } set { if {[lsearch [my info vars] [lindex $args 0]] == -1} { next } else { # puts stderr "Recovery Filter: omitting var [self]::[lindex $args 0]" } } default {next} } } # # remove filter from object # Object instproc filterremove f { ::set fl [my info filter] puts stderr "filterremove on [self] with $f; fullName: [my filtersearch $f]" while {[::set index [lsearch $fl [my filtersearch $f]]] != -1} { ::set fl [lreplace $fl $index $index] } my filter $fl } # # remove mixin from object # Object instproc mixinremove m { puts stderr "mixinremove on [self] with $m" ::set ml [my info mixins] while {[::set index [lsearch $ml $m]] != -1} { ::set ml [lreplace $ml $index $index] } my mixin $ml } Class RecoveryPoint \ -parameter { {appendedObjs ""} {appendedCls ""} {appendedNamespaces ""} {withState 0} {appendToFile 0} {definedObjs [list Object \ Class \ Class::Parameter]} {excludeNames ""} } # # queries the definedObjs variable whether a given object # is already defined/predefined or not # -> a way to exclude classes/objs from saving # RecoveryPoint instproc isDefined {n} { my instvar definedObjs puts stderr "Checking Defined: $n in $definedObjs" if {[lsearch $definedObjs [string trimleft $n :]] == -1} { return 0 } else { return 1 } } RecoveryPoint instproc appendDefined {n} { my instvar definedObjs lappend definedObjs [string trimleft $n :] } # # check whether an obj/cls/namespace is appended already # append obj/cls/namespace # foreach method {Obj Cl Namespace} { set r { my instvar {appended${method}s name}} set r [subst -nocommands -nobackslash $r] set s $r append s { if {[lsearch $name [string trimleft $n :]] == -1} { return 0 } else { return 1 } } RecoveryPoint instproc isAppended$method {n} $s append r { lappend name [string trimleft $n :] } RecoveryPoint instproc append$method {n} $r } # # compare command for lsort # RecoveryPoint instproc namespaceDepth {a b} { set aCount 0 set bCount 0 for {set i 0} {$i < [string length $a]} {incr i} { if {[string index $a $i] eq ":"} { incr aCount } } for {set i 0} {$i < [string length $b]} {incr i} { if {[string index $b $i] eq ":"} { incr bCount } } if {$aCount == $bCount} { return 0 } elseif {$aCount > $bCount} { return 1 } return -1 } # # produces a script containing the current state of # the given obj # RecoveryPoint instproc stateScript {obj} { set script "" foreach v [$obj info vars] { if {[lsearch [my set excludeNames] $v] == -1} { $obj instvar $v if {[array exists $v]} { foreach name [array names $v] { set arr ${v}($name) set value [$obj set $arr] append script "$obj set $arr \"$value\"\n" } } else { set value [set $v] append script "$obj set $v \"$value\"\n" } } } return $script } # # produces a script containing the procs of the given obj # RecoveryPoint instproc procScript {obj} { set script "" foreach p [$obj info procs] { if {[lsearch [my set excludeNames] $v] == -1} { append script \ "$obj proc $p \{[$obj info args $p]\} \{[$obj info body $p]\}\n" } } return $script } # # produces a script containing the instprocs of the given class # RecoveryPoint instproc instprocScript {cl} { set script "" foreach p [$cl info instprocs] { if {[lsearch [my set excludeNames] $v] == -1} { append script \ "$cl instproc $p \{[$cl info instargs $p]\} \{[$cl info instbody $p]\}\n" } } return $script } # # append parent obj/classes/namespaces of an object completly # RecoveryPoint instproc appendParents {name} { # puts stderr "Recovery -- appendParents $name " set p "" set script "" set n $name while {[set np [namespace parent ::$n]] != "::"} { lappend p $np set n $np } set p [lsort -command {[self] namespaceDepth} $p] foreach n $p { if {[Object isobject $n]} { if {[$n isclass]} { append script [my classScript $n] } else { append script [my objectScript $n] } } else { if {![my isAppendedNamespace $n]} { append script "namespace eval $n \{\}\n" # puts stderr "Recovery -- Appending Namespace: $n" my appendedNamespace $n } } } return $script } # # produces a script recovering the given obj with all children # without state # RecoveryPoint instproc objectScript {obj} { # puts stderr "Recovery -- Object Script $obj" my instvar withState set script "" if {![my isDefined $obj] && ![my isAppendedObj $obj]} { # if the object's class is not yet appended => do it now set objClass [$obj info class] append script [my classScript $objClass] # append all parent namespaces append script [my appendParents $obj] # append the obj append script "$objClass $obj\n" append script [my procScript $obj] if {$withState == 1} { append script [my stateScript $obj] } # puts stderr "Recovery -- Appending Object: $obj" my appendObj $obj # append its children foreach o [$obj info children] { append script [my objectScript $o] } } return $script } # # produces a script recovering the given class with all children # without state # RecoveryPoint instproc classScript {cl} { # puts stderr "Recovery -- Class Script $cl" my instvar withState set script "" if {![my isDefined $cl] && ![my isAppendedCl $cl]} { # if the class's meta-class is not yet appended => do it now set metaClass [$cl info class] append script [my classScript $metaClass] # append all parent namespaces append script [my appendParents $cl] # append the class append script "$metaClass $cl" set sl [$cl info superclass] if {$sl ne ""} { append script " -superclass \{$sl\}\n" } else { append script "\n" } append script [my instprocScript $cl] append script [my procScript $cl] if {$withState == 1} { append script [my stateScript $cl] } # puts stderr "Recovery -- Appending Class: $cl \n $script" my appendCl $cl # append children set children [$cl info children] set classChildren [$cl info classchildren] foreach c $children { if {[lsearch $classChildren $c] != -1} { append script [my classScript $c] } else { append script [my objectScript $c] } } } return $script } # # produces a script recovering the given class and all subclasses # with all their children and all instances # # RecoveryPoint instproc hierarchyScript {cl} { set script [my classScript $cl] set sortedInstances \ [lsort -command {[self] namespaceDepth} [$cl info instances]] foreach o $sortedInstances { append script [my objectScript $o] } foreach c [$cl info subclass] { append script [my hierarchyScript $c] } return $script } # # saves a script to a file # RecoveryPoint instproc saveScript {filename script} { my instvar appendToFile if {$appendToFile} { set mode a } else { set mode w } set f [open $filename $mode] puts $f $script close $f } # # load a script from a file # RecoveryPoint instproc loadScript {filename} { set f [open $filename r] set r [read $f] close $f return $r } # # produce methods to save/recover an object script to/from a file # with/without state/only state # foreach method { Object ObjectState ObjectWithState Class ClassWithState \ Hierarchy HierarchyWithState } { set s { my set withState } if {[regexp {(.*)WithState} $method _ m]} { set call $m append s "1" } else { set call $method append s "0" } scan $call %c l set ::low "[format %c [expr {$l + 32}]][string range $call 1 end]" append s { my appendedObjs "" my appendedCls "" my appendedNamespaces "" } append s " foreach a \$args \{" set r { set script [my ${low}Script } set r [subst -nocommands -nobackslash $r] append s $r append s {$a] my saveScript $filename $script} append s " \} " RecoveryPoint instproc save$method {filename args} $s } RecoveryPoint instproc recover {filename} { set r [my loadScript $filename] Object filterappend recoveryFilter # puts stderr "RecoveryFilter appended for $filename" eval $r Object filterremove recoveryFilter # puts stderr "RecoveryFilter removed for $filename" return } namespace export RecoveryPoint } namespace import ::xotcl::scriptCreation::recoveryPoint::* ./xotcl-1.6.8/library/serialize/._ScriptCreator.xotcl000644 000765 000024 00000000430 12161604235 023324 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/serialize/ScriptCreator.xotcl000644 000765 000024 00000012156 12161604235 023117 0ustar00neumannstaff000000 000000 # $Id: ScriptCreator.xotcl,v 1.4 2006/02/18 22:17:33 neumann Exp $ package provide xotcl::scriptCreation::scriptCreator 1.0 package require XOTcl 1 namespace eval ::xotcl::scriptCreation::scriptCreator { namespace import ::xotcl::* Class ScriptCreator \ -parameter { {excludedObjs {Object Class Class::Parameter}} {excludeNames ""} {dependencyChecking 1} } # # queries the excludedObjs variable whether a given object # is already defined/predefined or not # -> a way to exclude classes/objs from saving # ScriptCreator instproc isExcluded {n} { my instvar excludedObjs #puts stderr "Checking Excluded: $n in $excludedObjs" if {[lsearch $excludedObjs [string trimleft $n :]] == -1} { return 0 } else { return 1 } } ScriptCreator instproc appendExcluded {n} { my instvar excludedObjs lappend excludedObjs [string trimleft $n :] } # # compare command for lsort # ScriptCreator instproc namespaceDepth {a b} { set aCount 0 set bCount 0 for {set i 0} {$i < [string length $a]} {incr i} { if {[string index $a $i] eq ":"} { incr aCount } } for {set i 0} {$i < [string length $b]} {incr i} { if {[string index $b $i] eq ":"} { incr bCount } } if {$aCount == $bCount} { return 0 } elseif {$aCount > $bCount} { return 1 } return -1 } # # produces a script containing the current state of # the given obj # ScriptCreator instproc stateScript {obj} { set script "" foreach v [$obj info vars] { if {[lsearch [my set excludeNames] $v] == -1} { if {[$obj array exists $v]} { foreach name [$obj array names $v] { set arr ${v}($name) set value [$obj set $arr] append script "$obj set $arr \"$value\"\n" } } else { set value [$obj set $v] append script "$obj set $v \"$value\"\n" } } } return $script } # # produces a script containing the procs of the given obj # ScriptCreator instproc procScript {obj} { set script "" foreach p [$obj info procs] { if {[lsearch [my set excludeNames] $p] == -1} { append script \ "$obj proc $p \{[$obj info args $p]\} \{[$obj info body $p]\}\n" } } return $script } # # produces a script containing the instprocs of the given class # ScriptCreator instproc instprocScript {cl} { set script "" foreach p [$cl info instprocs] { if {[lsearch [my set excludeNames] $p] == -1} { append script \ "$cl instproc $p \{[$cl info instargs $p]\} \{[$cl info instbody $p]\}\n" } } return $script } # # saves a script to a file # ScriptCreator instproc saveScript {filename script} { set f [open $filename w] puts $f $script close $f } # # load a script from a file # ScriptCreator instproc loadScript {filename} { set f [open $filename r] set r [read $f] close $f return $r } # # check parent obj/classes/namespaces of an object completly # ScriptCreator instproc checkParents {name} { set p "" set n $name while {[set np [namespace parent ::$n]] != "::"} { lappend p $np set n $np } set p [lsort -command {my namespaceDepth} $p] foreach n $p { if {![my isExcluded $n] && ![my isAppended $n]} { error "ScriptCreator: $name needs parent $n, neither appended nor excluded yet." } } } ScriptCreator instproc checkClass {obj class} { if {![my isExcluded $class] && ![my isAppended $class]} { error "ScriptCreator: $obj depends on $class, neither appended nor excluded yet." } } ScriptCreator instproc isAppended name { set n [string trimleft $name :] if {[lsearch [my set appendedNames] $n]!=-1} { return 1 } else { return 0 } } ScriptCreator instproc appendName name { set n [string trimleft $name :] my lappend appendedNames $n } ScriptCreator instproc makeScript args { my instvar dependencyChecking my set appendedNames "" set script "" foreach name $args { #puts stderr "Script Creator -- $name" if {![my isExcluded $name] && ![my isAppended $name]} { if {$dependencyChecking} { my checkParents $name } if {[Object isobject $name]} { set class [$name info class] if {$dependencyChecking} { my checkClass $name $class } if {[Object isclass $name]} { # append the class #puts stderr "Appending Class: $name" append script "[$name info class] $name" set sl [$name info superclass] if {$dependencyChecking} { foreach c $sl { my checkClass $name $c } } if {$sl ne ""} { append script " -superclass \{$sl\}\n" } else { append script "\n" } append script [my instprocScript $name] } else { # append the obj #puts stderr "Appending Object: $name" append script "[$name info class] $name\n" } append script [my procScript $name] } else { append script "namespace eval $name \{\}\n" #puts stderr "Appending Namespace: $name" } my appendName $name } } return $script } namespace export ScriptCreator } namespace import ::xotcl::scriptCreation::scriptCreator::* ./xotcl-1.6.8/library/serialize/._Serializer.xotcl000644 000765 000024 00000000430 12161600406 022645 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/serialize/Serializer.xotcl000644 000765 000024 00000044310 12161600406 022435 0ustar00neumannstaff000000 000000 # $Id: Serializer.xotcl,v 1.19 2007/10/05 09:06:00 neumann Exp $ package require XOTcl 1.5 package provide xotcl::serializer 1.0 namespace eval ::xotcl::serializer { namespace import -force ::xotcl::* @ @File { description { This package provides the class Serializer, which can be used to generate a snapshot of the current state of the workspace in the form of XOTcl source code. } authors { Gustaf Neumann, Gustaf.Neumann@wu-wien.ac.at } date { $Date: 2007/10/05 09:06:00 $ } } @ Serializer proc all { ?-ignoreVarsRE RE? "provide regular expression; matching vars are ignored" ?-ignore obj1 obj2 ...? "provide a list of objects to be omitted"} { Description { Serialize all objects and classes that are currently defined (except the specified omissions and the current Serializer object).

    Examples:<@br> <@pre class='code'>Serializer all -ignoreVarsRE {::b$} Do not serialize any instance variable named b (of any object).

    <@pre class='code'>Serializer all -ignoreVarsRE {^::o1::.*text.*$|^::o2::x$} Do not serialize any variable of c1 whose name contains the string "text" and do not serialze the variable x of o2.

    <@pre class='code'>Serializer all -ignore obj1 obj2 ... do not serizalze the specified objects } return "script" } @ Serializer proc deepSerialize { objs "Objects to be serialized" ?-ignoreVarsRE RE? "provide regular expression; matching vars are ignored" ?-ignore obj1 obj2 ...? "provide a list of objects to be omitted" ?-map list? "translate object names in serialized code" } { Description { Serialize object with all child objects (deep operation) except the specified omissions. For the description of <@tt>ignore and <@tt>igonoreVarsRE see <@tt>Serizalizer all. <@tt>map can be used in addition to provide pairs of old-string and new-string (like in the tcl command <@tt>string map). This option can be used to regenerate the serialized object under a different object or under an different name, or to translate relative object names in the serialized code.

    Examples: <@pre class='code'>Serializer deepSerialize ::a::b::c -map {::a::b ::x::y} Serialize the object <@tt>c which is a child of <@tt>a::b; the object will be reinitialized as object <@tt>::x::y::c, all references <@tt>::a::b will be replaced by <@tt>::x::y.

    <@pre class='code'>Serializer deepSerialize ::a::b::c -map {::a::b [self]} The serizalized object can be reinstantiated under some current object, under which the script is evaluated.

    <@pre class='code'>Serializer deepSerialize ::a::b::c -map {::a::b::c ${var}} The serizalized object will be reinstantiated under a name specified by the variable <@tt>var<@tt> in the recreation context. } return "script" } @ Serializer proc methodSerialize { object "object or class" method "name of method" prefix "either empty or 'inst' (latter for instprocs)" } { Description { Serialize the specified method. In order to serialize an instproc, <@tt>prefix should be 'inst'; to serialze procs, it should be empty.

    Examples: <@pre class='code'>Serializer methodSerialize Serializer deepSerialize "" This command serializes the proc <@tt>deepSerialize of the Class <@tt>Serializer.

    <@pre class='code'>Serializer methodSerialize Serializer serialize inst This command serializes the instproc <@tt>serialize of the Class <@tt>Serializer.

    } return {Script, which can be used to recreate the specified method} } @ Serializer proc exportMethods { list "list of methods of the form 'object proc|instproc methodname'" } { Description { This method can be used to specify methods that should be exported in every <@tt>Serializer all<@/tt>. The rationale behind this is that the serializer does not serialize objects from the ::xotcl:: namespace, which is used for XOTcl internals and volatile objects. It is however often useful to define methods on ::xotcl::Class or ::xotcl::Objects, which should be exported. One can export procs, instprocs, forward and instforward

    Example: <@pre class='code'> Serializer exportMethods { ::xotcl::Object instproc __split_arguments ::xotcl::Object instproc __make_doc ::xotcl::Object instproc ad_proc ::xotcl::Class instproc ad_instproc ::xotcl::Object forward expr }<@/pre> } } @ Serializer instproc serialize {entity "Object or Class"} { Description { Serialize the specified object or class. } return {Object or Class with all currently defined methods, variables, invariants, filters and mixins} } ################################################################################## # real clode starts here..... # ################################################################################ Class Serializer -parameter {ignoreVarsRE map} namespace export Serializer Serializer proc ignore args { my set skip $args } Serializer instproc ignore args { foreach i $args { my set skip($i) 1 # skip children of ignored objects as well foreach j [$i info children] { my ignore $j } } } Serializer instproc init {} { my ignore [self] if {[[self class] exists skip]} { eval my ignore [[self class] set skip] } } Serializer instproc method-serialize {o m prefix} { my pcmd [my unescaped-method-serialize $o $m $prefix] } Serializer instproc unescaped-method-serialize {o m prefix} { set arglist [list] foreach v [$o info ${prefix}args $m] { if {[$o info ${prefix}default $m $v x]} { lappend arglist [list $v $x] } {lappend arglist $v} } lappend r ${prefix}proc $m \ [concat [$o info ${prefix}nonposargs $m] $arglist] \ [$o info ${prefix}body $m] foreach p {pre post} { if {[$o info ${prefix}$p $m]!=""} {lappend r [$o info ${prefix}$p $m]} } return $r } Serializer instproc pcmd list { foreach a $list { if {[regexp -- {^-[[:alpha:]]} $a]} { set mustEscape 1 break } } if {[info exists mustEscape]} { return "\[list -$list\]" } else { return -$list } } Serializer instproc collect-var-traces o { my instvar traces foreach v [$o info vars] { set t [$o __trace__ info variable $v] if {$t ne ""} { foreach ops $t { foreach {op cmd} $ops break # save traces in post_cmds my append post_cmds [list $o trace add variable $v $op $cmd] "\n" # remove trace from object $o trace remove variable $v $op $cmd } } } } Serializer instproc Object-serialize o { my collect-var-traces $o append cmd [list [$o info class] create [$o self]] # slots needs to be initialized when optimized, since # parametercmds are not serialized #if {![$o istype ::xotcl::Slot]} {append cmd " -noinit"} append cmd " -noinit" append cmd " \\\n" foreach i [$o info procs] { append cmd " " [my method-serialize $o $i ""] " \\\n" } foreach i [$o info forward] { set fwd [concat [list forward $i] [$o info forward -definition $i]] append cmd \t [my pcmd $fwd] " \\\n" } foreach i [$o info parametercmd] { append cmd \t [my pcmd [list parametercmd $i]] " \\\n" } set vset {} set nrVars 0 foreach v [$o info vars] { set setcmd [list] if {![my exists ignoreVarsRE] || ![regexp [my set ignoreVarsRE] ${o}::$v]} { if {[$o array exists $v]} { lappend setcmd array set $v [$o array get $v] } else { lappend setcmd set $v [$o set $v] } incr nrVars append cmd \t [my pcmd $setcmd] " \\\n" } } foreach x {mixin invar} { set v [$o info $x] if {$v ne ""} {my append post_cmds [list $o $x set $v] "\n"} } set v [$o info filter -guards] if {$v ne ""} {append cmd [my pcmd [list filter $v]] " \\\n"} return $cmd } Serializer instproc Class-serialize o { set cmd [my Object-serialize $o] #set p [$o info parameter] #if {$p ne ""} { # append cmd " " [my pcmd [list parameter $p]] " \\\n" #} foreach i [$o info instprocs] { append cmd " " [my method-serialize $o $i inst] " \\\n" } foreach i [$o info instforward] { set fwd [concat [list instforward $i] [$o info instforward -definition $i]] append cmd \t [my pcmd $fwd] " \\\n" } foreach i [$o info instparametercmd] { append cmd \t [my pcmd [list instparametercmd $i]] " \\\n" } foreach x {superclass instinvar} { set v [$o info $x] if {$v ne "" && "::xotcl::Object" ne $v } { append cmd " " [my pcmd [list $x $v]] " \\\n" } } foreach x {instmixin} { set v [$o info $x] if {$v ne "" && "::xotcl::Object" ne $v } { my append post_cmds [list $o $x set $v] "\n" #append cmd " " [my pcmd [list $x $v]] " \\\n" } } set v [$o info instfilter -guards] if {$v ne ""} {append cmd [my pcmd [list instfilter $v]] " \\\n"} return $cmd\n } Serializer instproc args {o prefix m} { foreach v [$o info ${prefix}args $m] { if {[$o info ${prefix}default $m $v x]} { lappend arglist [list $v $x] } { lappend arglist $v } } return $arglist } Serializer instproc category c { if {[$c istype ::xotcl::Class]} {return Class} {return Object} } Serializer instproc allChildren o { set set $o foreach c [$o info children] { foreach c2 [my allChildren $c] { lappend set $c2 } } return $set } Serializer instproc allInstances C { set set [$C info instances] foreach sc [$C info subclass] { foreach c2 [my allInstances $sc] { lappend set $c2 } } return $set } Serializer instproc exportedObject o { # check, whether o is exported. for exported objects. # we export the object tree. set oo $o while {1} { if {[[self class] exists exportObjects($o)]} { #puts stderr "exported: $o -> exported $oo" return 1 } # we do this for object trees without object-less name spaces if {![my isobject $o]} {return 0} set o [$o info parent] } } Serializer instproc topoSort {set all} { if {[my array exists s]} {my array unset s} if {[my array exists level]} {my array unset level} foreach c $set { if {!$all && [string match "::xotcl::*" $c] && ![my exportedObject $c]} continue if {[my exists skip($c)]} continue my set s($c) 1 } set stratum 0 while {1} { set set [my array names s] if {[llength $set] == 0} break incr stratum #my warn "$stratum set=$set" my set level($stratum) {} foreach c $set { if {[my [my category $c]-needsNothing $c]} { my lappend level($stratum) $c } } if {[my set level($stratum)] eq ""} { my set level($stratum) $set my warn "Cyclic dependency in $set" } foreach i [my set level($stratum)] {my unset s($i)} } } Serializer instproc warn msg { if {[info command ns_log] ne ""} { ns_log Notice $msg } else { puts stderr "!!! $msg" } } Serializer instproc Class-needsNothing x { if {![my Object-needsNothing $x]} {return 0} set scs [$x info superclass] if {[my needsOneOf $scs]} {return 0} foreach sc $scs {if {[my needsOneOf [$sc info slots]]} {return 0}} #if {[my needsOneOf [$x info instmixin ]]} {return 0} return 1 } Serializer instproc Object-needsNothing x { set p [$x info parent] if {$p ne "::" && [my needsOneOf $p]} {return 0} if {[my needsOneOf [$x info class]]} {return 0} if {[my needsOneOf [[$x info class] info slots]]} {return 0} #if {[my needsOneOf [$x info mixin ]]} {return 0} return 1 } Serializer instproc needsOneOf list { foreach e $list {if {[my exists s($e)]} { #upvar x x; puts stderr "$x needs $e" return 1 }} return 0 } Serializer instproc serialize {objectOrClass} { string trimright [my [my category $objectOrClass]-serialize $objectOrClass] "\\\n" } Serializer instproc serialize-objects {list all} { my instvar post_cmds set post_cmds "" # register for introspection purposes "trace" under a different name ::xotcl::alias ::xotcl::Object __trace__ -objscope ::trace my topoSort $list $all #foreach i [lsort [my array names level]] {my warn "$i: [my set level($i)]"} set result "" foreach l [lsort -integer [my array names level]] { foreach i [my set level($l)] { #my warn "serialize $i" #append result "# Stratum $l\n" append result [my serialize $i] \n } } foreach e $list { set namespace($e) 1 set namespace([namespace qualifiers $e]) 1 } ::xotcl::Object instproc __trace__ {} {} # Handling of variable traces: traces might require a # different topological sort, which is hard to handle. # Similar as with filters, we deactivate the variable # traces during initialization. This happens by # (1) replacing the XOTcl's trace method by a no-op # (2) collecting variable traces through collect-var-traces # (3) re-activating the traces after variable initialization set exports "" set pre_cmds "" # delete ::xotcl from the namespace list, if it exists... catch {unset namespace(::xotcl)} foreach ns [array name namespace] { if {![namespace exists $ns]} continue if {![my isobject $ns]} { append pre_cmds "namespace eval $ns {}\n" } elseif {$ns ne [namespace origin $ns] } { append pre_cmds "namespace eval $ns {}\n" } set exp [namespace eval $ns {namespace export}] if {$exp ne ""} { append exports "namespace eval $ns {namespace export $exp}" \n } } #append post_cmds "::xotcl::alias ::xotcl::Object trace -objscope ::trace\n" return $pre_cmds$result$post_cmds$exports } Serializer instproc deepSerialize o { # assumes $o to be fully qualified my serialize-objects [my allChildren $o] 1 } Serializer instproc serializeMethod {object kind name} { set code "" switch $kind { proc { if {[$object info procs $name] ne ""} { set code [my method-serialize $object $name ""] } } instproc { if {[$object info instprocs $name] ne ""} { set code [my method-serialize $object $name inst] } } forward - instforward { if {[$object info $kind $name] ne ""} { set fwd [concat [list $kind $name] [$object info $kind -definition $name]] set code [my pcmd $fwd] } } } return $code } Serializer proc exportMethods list { foreach {o p m} $list {my set exportMethods($o,$p,$m) 1} } Serializer proc exportObjects list { foreach o $list {my set exportObjects($o) 1} } Serializer proc serializeExportedMethods {s} { set r "" foreach k [my array names exportMethods] { foreach {o p m} [split $k ,] break #if {$o ne "::xotcl::Object" && $o ne "::xotcl::Class"} { #error "method export only for ::xotcl::Object and\ # ::xotcl::Class implemented, not for $o" #} if {![string match "::xotcl::*" $o]} { error "method export is only for ::xotcl::* \ object an classes implemented, not for $o" } append methods($o) [$s serializeMethod $o $p $m] " \\\n " } set objects [array names methods] foreach o [list ::xotcl::Object ::xotcl::Class] { set p [lsearch $o $objects] if {$p == -1} continue set objects [lreplace $objects $p $p] } foreach o [concat ::xotcl::Object ::xotcl::Class $objects] { if {![info exists methods($o)]} continue append r \n "$o configure \\\n " \ [string trimright $methods($o) "\\\n "] } #puts stderr "... exportedMethods <$r\n>" return "$r\n" } Serializer proc all {args} { # don't filter anything during serialization set filterstate [::xotcl::configure filter off] set s [eval my new -childof [self] -volatile $args] # always export __exitHandler my exportMethods [list ::xotcl::Object proc __exitHandler] set r { set ::xotcl::__filterstate [::xotcl::configure filter off] ::xotcl::Object instproc trace args {} ::xotcl::Slot instmixin add ::xotcl::Slot::Nocheck } append r "::xotcl::configure softrecreate [::xotcl::configure softrecreate]" append r \n [my serializeExportedMethods $s] # export the objects and classes #$s warn "export objects = [my array names exportObjects]" #$s warn "export objects = [my array names exportMethods]" append r [$s serialize-objects [$s allInstances ::xotcl::Object] 0] foreach o [list ::xotcl::Object ::xotcl::Class] { foreach x {mixin instmixin invar instinvar} { set v [$o info $x] if {$v ne "" && $v ne "::xotcl::Object"} { append r "$o configure " [$s pcmd [list $x $v]] "\n" } } } append r { ::xotcl::alias ::xotcl::Object trace -objscope ::trace ::xotcl::Slot instmixin delete ::xotcl::Slot::Nocheck ::xotcl::configure filter $::xotcl::__filterstate unset ::xotcl::__filterstate } ::xotcl::configure filter $filterstate return $r } Serializer proc methodSerialize {object method prefix} { set s [my new -childof [self] -volatile] concat $object [$s unescaped-method-serialize $object $method $prefix] } Serializer proc deepSerialize args { set s [my new -childof [self] -volatile] set nr [eval $s configure $args] foreach o [lrange $args 0 [incr nr -1]] { append r [$s deepSerialize [$o]] } if {[$s exists map]} {return [string map [$s map] $r]} return $r } # register serialize a global method ::xotcl::Object instproc serialize {} { ::Serializer deepSerialize [self] } # include this method in the serialized code Serializer exportMethods { ::xotcl::Object instproc contains } # include Serializer in the serialized code Serializer exportObjects [namespace current]::Serializer namespace eval :: "namespace import -force [namespace current]::*" } ./xotcl-1.6.8/library/store/._COPYRIGHT000644 000765 000024 00000000430 12327000602 020115 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/COPYRIGHT000644 000765 000024 00000003401 12327000602 017701 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/store/._JufGdbmStorage.xotcl000644 000765 000024 00000000430 12161600406 022544 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/JufGdbmStorage.xotcl000644 000765 000024 00000002214 12161600406 022331 0ustar00neumannstaff000000 000000 # $Id: JufGdbmStorage.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ package provide xotcl::store::jufgdbm 0.81 package require xotcl::store::juf_gdbm package require xotcl::store package require XOTcl 1 namespace eval ::xotcl::store::jufgdbm { namespace import ::xotcl::* # # a simple GNU Gdbm DB Store Access # Class Storage=JufGdbm -superclass Storage Storage=JufGdbm instproc open f { my set persistenceDB [juf_gdbm open $f rwc] } Storage=JufGdbm instproc store {k v} { #my showCall juf_gdbm store [my set persistenceDB] $k $v } Storage=JufGdbm instproc list {} { juf_gdbm list [my set persistenceDB] } Storage=JufGdbm instproc fetch {k var} { my instvar persistenceDB if {[juf_gdbm exists $persistenceDB $k]} { upvar [self callinglevel] $var value set value [juf_gdbm fetch $persistenceDB $k] return 1 } return 0 } Storage=JufGdbm instproc close args { juf_gdbm close [my set persistenceDB] } Storage=JufGdbm instproc delete k { juf_gdbm delete [my set persistenceDB] $k } namespace export Storage=JufGdbm } namespace import ::xotcl::store::jufgdbm::* ./xotcl-1.6.8/library/store/._MemStorage.xotcl000644 000765 000024 00000000430 12161600406 021744 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/MemStorage.xotcl000644 000765 000024 00000005115 12161600406 021534 0ustar00neumannstaff000000 000000 # $Id: MemStorage.xotcl,v 1.6 2006/09/27 08:12:40 neumann Exp $ package provide xotcl::store::mem 0.84 package require xotcl::store 0.84 package require XOTcl 1 namespace eval ::xotcl::store::mem { namespace import ::xotcl::* Object ::xotcl::memStoragePool ::xotcl::memStoragePool proc add {filename} { my set memStores($filename) [Object new -childof [self]] } ::xotcl::memStoragePool proc get {filename} { if {[my exists memStores($filename)]} { return [my set memStores($filename)] } return "" } ::xotcl::memStoragePool proc remove {filename} { catch { set store [my set memStores($filename)] $store destroy my unset memStores($filename) } } # # a class using an XOTcl Object for memory storage Class Storage=Mem -superclass Storage Storage=Mem instproc init args { my instvar searchID ::set searchID "" } Storage=Mem instproc names {} { my instvar store $store array names v } Storage=Mem instproc exists name { my instvar store $store exists v($name) } Storage=Mem instproc unset name { my instvar store $store unset v($name) } Storage=Mem instproc set args { my instvar store ::set l [llength $args] if {$l == 1} { $store set v([lindex $args 0]) } elseif {$l == 2} { $store set v([lindex $args 0]) [lindex $args 1] } else { eval $store set $args } } Storage=Mem instproc close {} { my instvar store ::unset store } Storage=Mem instproc open filename { my instvar store if {[::set store [::xotcl::memStoragePool get $filename]] == ""} { ::set store [::xotcl::memStoragePool add $filename] } } Storage=Mem instproc firstkey {} { my instvar store $store instvar v my instvar searchID if {$searchID ne ""} { array donesearch v $searchID } ::set searchID [array startsearch v] return [array nextelement v $searchID] } Storage=Mem instproc nextkey {} { my instvar store $store instvar v my instvar searchID if {$searchID eq ""} { error "[self class]: firstkey was not invoked on storage search" } ::set elt [array nextelement v $searchID] if {$elt eq ""} { # if array end is reach search is terminated automatically!! ::set searchID "" } return $elt } ### warum geht eigentlich folgendes nicht: ## Object o; o set a::b::c 1 ### dann koennte man sich das set und exists schenken... namespace export Storage=Mem } namespace import ::xotcl::store::mem::* #namespace eval ::xotcl {namespace import ::xotcl::store::mem::*} ./xotcl-1.6.8/library/store/._MultiStorage.xotcl000644 000765 000024 00000000430 12161606505 022326 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/MultiStorage.xotcl000644 000765 000024 00000003523 12161606505 022117 0ustar00neumannstaff000000 000000 package provide xotcl::store::multi 1.0 package require -exact xotcl::store 1.0 package require XOTcl 1 namespace eval ::xotcl::store::multi { namespace import ::xotcl::* Class Storage=multi -superclass Storage Storage=multi instproc add {dbPackage args} { my instvar storages names if {$dbPackage eq ""} { set dbPackage [Storage defaultPackage] } package require xotcl::store::[string tolower $dbPackage] lappend storages [eval Storage=$dbPackage new -childof [self] $args] } Storage=multi instproc init args { my instvar storages set storages {} } Storage=multi instproc names {} { my instvar storages [lindex $storages 0] $names } Storage=multi instproc exists name { my instvar storages [lindex $storages 0] exists $name } Storage=multi instproc unset name { my instvar storages foreach s $storages {$s [self proc] $name} } Storage=multi instproc set args { my instvar storages set l [llength $args] set name [lindex $args 0] if {$l == 1} { [lindex $storages 0] set $name } elseif {$l == 2} { foreach s $storages { $s set $name [lindex $args 1]} } else { eval set $args } } Storage=multi instproc close {} { my instvar storages foreach s $storages {$s [self proc]} } Storage=multi instproc dbOpen {} { my instvar storages foreach s $storages {$s [self proc]} } Storage=multi instproc firstkey {} { my instvar storages [lindex $storages 0] firstkey } Storage=multi instproc nextkey {} { my instvar storages [lindex $storages 0] nextkey } Storage=multi instproc checkdir {} { my instvar storages foreach s $storages {$s [self proc]} } Storage=multi instproc dbOpen {} { my instvar storages foreach s $storages {$s [self proc]} } namespace export Storage=multi } namespace import ::xotcl::store::multi::* ./xotcl-1.6.8/library/store/._Persistence.xotcl000644 000765 000024 00000000430 12161611375 022174 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/Persistence.xotcl000644 000765 000024 00000022620 12161611375 021764 0ustar00neumannstaff000000 000000 package provide xotcl::store::persistence 1.0 package require -exact xotcl::trace 1.0 package require -exact xotcl::package 1.0 package require -exact xotcl::mixinStrategy 1.0 package require -exact xotcl::store 1.0 package require XOTcl 1 namespace eval ::xotcl::store::persistence { namespace import ::xotcl::* @ @File { description { Persistent store for XOTcl objects with Eager and Lazy persistence. Take a look at "persistenceExample.xotcl" for exmaple of usage. } } @ Class PersistenceMgr { description { A persistent store requires a persistent manager. The persistent manager implements the Storage interface via storage mixin. With the parameter "dbPackage" we can specify which storage will be used. The persistent manager than tries to load the package "xotcl::${dbPackage}Storage". Default is Sdbm. Example: <@pre> PersistenceMgr pmgr -persistenceDir . -persistenceFile example-db } } # # base class for persistent managers -- just register corresponding # storage mixin and open DB # Class PersistenceMgr -parameter { {fileName {[string trimleft [self] :]}} {dbPackage Sdbm} trace dirName } PersistenceMgr instproc init args { my instvar dbPackage package require xotcl::store::[string tolower $dbPackage] Storage=$dbPackage [self]::store $args foreach v {dirName fileName} { if {[my exists $v]} { [self]::store $v [my set $v] } } if {[my exists trace]} { [self]::store filter traceFilter } my array set persistentObjs {} next } # delegate methods to the store object PersistenceMgr instproc store args { eval [self]::store $args } PersistenceMgr instproc destroy args { foreach obj [my array names persistentObjs] { $obj storeall $obj persistenceMgr "" } [self]::store close next } PersistenceMgr instproc assureOpenDb {} { if {![my exists dbOpen]} { [self]::store dbOpen my set dbOpen 1 } } PersistenceMgr instproc addPersistentObj {obj} { my set persistentObjs($obj) "" } PersistenceMgr instproc removePersistentObj {obj} { if {[my exists persistentObjs($obj)]} { my unset persistentObjs($obj) } } @ Class Persistent { description { Superclass or mixin class for all persistent objects. Normally subclasses are used as mixins or instmixins on object, like: <@pre> o mixin Persistent=Eager p mixin Persistent=Lazy } } # # Persistence (mixin) classes# Class Persistent -parameter { persistenceMgr } # can be overloaded by subclasses, that need a cleanup on # persistenceMgr->destroy (like Lazy) Persistent instproc storeall {} {;} @ Persistent instproc persistenceMgr {args "persistent manager name"} { description { Specify which persistence manager to use for [self] object, like: <@pre> o persistenceMgr pmgr Each persistent object must have a persistence manager specified, before vars can be made persistent. } } # # turn off persistence with ... persistenceMgr "", but # persistent vars stay persistent # Persistent instproc persistenceMgr args { if {[llength $args] == 0} { return [my set [self proc]] } elseif {[llength $args] == 1} { set pmgr [lindex $args 0] if {$pmgr eq "" && [my exists persistenceMgr]} { [my set persistenceMgr] removePersistentObj [self] my unset persistenceMgr return "" } $pmgr addPersistentObj [self] return [my set [self proc] $pmgr] } else { error "wrong # args: [self] [self proc] ?value?" } } @ Persistent instproc persistentVars {} { description { Returns list of persistent vars. } } Persistent instproc persistentVars {} { if {[my exists __persistentVars]} { return [my set __persistentVars] } return "" } @ Persistent instproc persistent {list "persistent variables" } { description { Make a list of object variables persistent. If a persistent DB exists, the values are read from this DB, overwriting the current value. E.g.: <@pre> o persistent {x y} } } Persistent instproc persistent {list} { my instvar persistenceMgr if {![info exists persistenceMgr]} {return} set store ${persistenceMgr}::store $persistenceMgr assureOpenDb foreach var $list { my lappend __persistentVars $var # try to refetch vars from db if {[$store exists [self]::${var}(_____arraynames)]} { #puts stderr array=[self]::${var} foreach i [$store set [self]::${var}(_____arraynames)] { my set ${var}($i) [$store set [self]::${var}($i)] } } elseif {[$store exists [self]::$var]} { #puts stderr "---store=$store exists [self]::$var" #puts stderr "---set [self]::$var <[$store set [self]::$var]>" my instvar $var #set name [$store set [self]::$var] #puts ***name*[set name]--$var set $var [$store set [self]::$var] } elseif {[my exists $var]} { # # first store of the variable in persistent store if {[my array exists $var]} { # this variable is an array #puts stderr array=[self]::$var set anames [my array names $var] foreach n $anames { $store set [self]::${var}($n) [my set ${var}($n)] } $store set [self]::${var}(_____arraynames) $anames } else { #puts stderr "+++set [self]::$var [$store set [self]::$var]" $store set [self]::$var [my set $var] } } else { error "persistent: $var is not a variable on [self]" } } } @ Persistent instproc persistent+init {list "persistent variables" } { description { Initialize all data in the list as empty strings, if they do not exist yet, and then make them persistent using the 'persistent' method } } Persistent instproc persistent+init {list} { foreach pd $list { if {![my exists $pd]} { my set $pd "" } } my persistent $list } @ Persistent instproc unPersistent {list "persistent variables" } { description { Make a list of object variables not persistent. } } Persistent instproc unPersistent {list} { my instvar __persistentVars set pMgr [my set persistenceMgr] foreach v $list { set i [lsearch -exact $__persistentVars $v] catch { set __persistentVars [lreplace $__persistentVars $i $i] ${pMgr}::store unset [self]::$v } } } @ Persistent instproc makeVarScript {} { description { Build a Tcl script of "set ..." statements reflecting the current situation in the database. } } Persistent instproc makeVarScript {} { set script "" foreach v [my persistentVars] { set vt [namespace tail $v] append script [list my set $vt [my set $vt]]\n } #set script [concat [next] $script] return $script } Persistent instproc destroy args { if {[my exists persistenceMgr]} { [my set persistenceMgr] removePersistentObj [self] my unset persistenceMgr } next #my showMsg "Persistent object [self] destroyed." } @ Class Persistent=Eager { description { Eager persistence strategy. Store everything at the same moment to the database } } Class Persistent=Eager -superclass Persistent # # we use 'strange' argument names to avoid name clashes with given # variable names, when we have to instvar "[self] instvar $nametail" # Persistent=Eager instproc vartrace {__name_vartrace __sub_vartrace __op_vartrace} { #my showCall if {$__op_vartrace eq "w"} { my instvar persistenceMgr if {![info exists persistenceMgr]} {return} set store ${persistenceMgr}::store set nametail [namespace tail $__name_vartrace] set key [self]::$nametail if {$__sub_vartrace eq ""} { my instvar $nametail #puts stderr "+++VT: $store set $key [set $nametail]" $store set $key [set $nametail] } else { if {$__sub_vartrace ne "_____arraynames"} { my instvar "${nametail}($__sub_vartrace) subname" $store set ${key}($__sub_vartrace) $subname $store set ${key}(_____arraynames) [my array names $nametail] } else { error "With persistent arrays you may not use '_____arraynames' as index" } } } } Persistent=Eager instproc persistent {list} { #my showCall next foreach v $list { #puts stderr "***trace variable [self]::$v w [list my vartrace]" my trace variable $v w [list [self] vartrace] } } Persistent=Eager instproc unPersistent {list} { foreach v $list { my trace vdelete $v w [list [self] vartrace] } next } @ Class Persistent=Lazy { description { Lazy persistence strategy. Store everything on object destroy (or program termination). } } Class Persistent=Lazy -superclass Persistent Persistent=Lazy instproc storeall {} { my instvar persistenceMgr if {![info exists persistenceMgr]} {return} set store ${persistenceMgr}::store foreach v [my persistentVars] { if {[my array exists $v]} { set anames "" foreach sub [my array names $v] { if {[my exists ${v}($sub)]} { set key [self]::${v}($sub) $store set $key [my set ${v}($sub)] lappend anames $sub } } $store set [self]::${v}(_____arraynames) $anames } else { if {[my exists $v]} { set key [self]::$v $store set $key [my set $v] } } } } Persistent=Lazy instproc destroy args { my storeall next } namespace export PersistenceMgr Persistent Persistent=Eager Persistent=Lazy } namespace import ::xotcl::store::persistence::* ./xotcl-1.6.8/library/store/._persistenceExample.xotcl000755 000765 000024 00000000430 12161600406 023544 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/persistenceExample.xotcl000755 000765 000024 00000002653 12161600406 023340 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: persistenceExample.xotcl,v 1.2 2006/02/18 22:17:33 neumann Exp $ # # load the persistence component package require xotcl::store::persistence # Two example objects Object o # set two variables to default values o set x 1 o set y 1 Object p # set two variables to default values p set x 1 p set y 1 #################################### # now we make these vars persistent #################################### # 1. we need the PersistenceMgr (for gdbm we have to specify a file # name). If we want to get rid of the current setting and start again # we default values, we have to delete this file PersistenceMgr pmgr -dirName . -fileName example-db # 2. we have to make the objects persistent. We register the # persistence strategy as per-object mixin on the two objects # # one uses the lazy, one the eager strategy o mixin Persistent=Eager p mixin Persistent=Lazy # 3. tell the objects, which PersistenceMgr to use o persistenceMgr pmgr p persistenceMgr pmgr # 4. make the vars persistent o persistent {x y} p persistent {x y} ##################################### # now the vars are loaded from the persistence store # # we incr them to demonstrate the persistency; and print the results o incr x 2 o append y 1 p incr x 3 p append y 2 puts "Values:" puts " o->x: [o set x]" puts " o->y: [o set y]" puts " p->x: [p set x]" puts " p->y: [p set y]" # now run the program several times to see the results ./xotcl-1.6.8/library/store/._pkgIndex-subdir.add000644 000765 000024 00000000430 12161600406 022337 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/pkgIndex-subdir.add000644 000765 000024 00000000332 12161600406 022123 0ustar00neumannstaff000000 000000 set __store_dir__ $dir foreach index [glob -nocomplain [file join $dir * pkgIndex.tcl]] { set dir [file dirname $index] #puts subdir=$dir,index=$index source $index } set dir $__store_dir__ unset __store_dir__ ./xotcl-1.6.8/library/store/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 021121 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/pkgIndex.tcl000644 000765 000024 00000002467 12327774260 020720 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded xotcl::store 1.0 [list source [file join $dir Storage.xotcl]] package ifneeded xotcl::store::jufgdbm 0.81 [list source [file join $dir JufGdbmStorage.xotcl]] package ifneeded xotcl::store::mem 0.84 [list source [file join $dir MemStorage.xotcl]] package ifneeded xotcl::store::multi 1.0 [list source [file join $dir MultiStorage.xotcl]] package ifneeded xotcl::store::persistence 1.0 [list source [file join $dir Persistence.xotcl]] package ifneeded xotcl::store::tclgdbm 0.84 [list source [file join $dir TclGdbmStorage.xotcl]] package ifneeded xotcl::store::textfile 1.0 [list source [file join $dir TextFileStorage.xotcl]] set __store_dir__ $dir foreach index [glob -nocomplain [file join $dir * pkgIndex.tcl]] { set dir [file dirname $index] #puts subdir=$dir,index=$index source $index } set dir $__store_dir__ unset __store_dir__ ./xotcl-1.6.8/library/store/._Storage.xotcl000644 000765 000024 00000000430 12161603635 021314 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/Storage.xotcl000644 000765 000024 00000010252 12161603635 021102 0ustar00neumannstaff000000 000000 # $Id: Storage.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ package provide xotcl::store 1.0 package require XOTcl 1 namespace eval ::xotcl::store { namespace import ::xotcl::* @ @File { description { Simple generic storage interface for hashtable-like (persistent) storages. There are several different existing stores, including a memory storage, a GDBM storage, a SDBM storage, and a TextFile storage. } date { $Date: 2005/09/09 21:09:01 $ } } # # abstract interface for storage access # @ Class Storage { description { Abstract storage interface class (superclass of all storages). } } Class Storage -parameter {{dirName .} fileName} ### @ Storage instproc open { filename "database filename (or filename base, if more than one file has to be created)" } { Description { Each storage object represents exactly one database table. The db has to be opened, before it can it used. If it is not opened all other methods return errors. } return "empty string" } Storage abstract instproc open filename ### @ Storage instproc close {} { Description { Close associated database. } return "empty string" } Storage abstract instproc close {} ### @ Storage instproc exists { key {Key to be searched for.} } { Description { Search for a key whether it exists or not. } return {1, if key exists in the database, otherwise 0} } Storage abstract instproc exists key ### @ Storage instproc set { key {Key to be set.} ?value? {Optional value that might be set} } { Description { Set or query a database key in the same way as Tcl's set functions. } return {Key value.} } Storage abstract instproc set {key ?value?} ### @ Storage instproc unset { key {Key to be unset.} } { Description { Unset a database key in the same way as Tcl's unset functions. } return {empty string} } Storage abstract instproc unset key ### @ Storage instproc names {} { Description { Return a list of keys in the database (functions in the same way as Tcl's array names) } return {List of keys in the db.} } Storage abstract instproc names {} ### @ Storage instproc firstkey {} { Description { Start a traversal of the database, starting with any key. } return {Name of first key.} } Storage abstract instproc firstkey {} ### @ Storage instproc nextkey {} { Description { Proceed with the db traversal. Requires a firstkey before first usage, otherwise it returns an error. } return {Name of next key, if one exists. Otherwise an empty string is returned.} } Storage abstract instproc nextkey {} Storage instproc traceFilter args { set context "[self callingclass]->[self callingproc]" set method [self calledproc] set dargs $args puts "CALL $context> [self]->$method $dargs" set result [next] puts "EXIT $context> [self]->$method ($result)" return $result } ### @ Storage proc someNewChildStore {} { Description { Create a childStore according to a preference list depending on which storages are available. Currently the preference list has the following order: Gdbm, Sdbm and TextFile. } return {name of the created storage object.} } Storage proc someNewChildStore {} { foreach store {Gdbm Sdbm TextFile} { if {![catch {package require xotcl::store::[string tolower $store]}]} { set s [Storage=$store new -childof [self]] break } } return $s } Storage instproc checkDir {} { my instvar dirName if {[info exists dirName]} { if {![file exists $dirName]} { file mkdir $dirName } elseif {![file isdirectory $dirName]} { error "specified directory $dirName is no directory!" } } } Storage instproc mkFileName {} { my instvar dirName fileName if {[info exists dirName]} { return [file join $dirName $fileName] } else { return $fileName } } Storage instproc dbOpen {} { my checkDir my open [my mkFileName] } Storage proc defaultPackage {} { return Sdbm } namespace export Storage } namespace import ::xotcl::store::* ./xotcl-1.6.8/library/store/._TclGdbmStorage.xotcl000644 000765 000024 00000000430 12161600406 022542 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/TclGdbmStorage.xotcl000644 000765 000024 00000002625 12161600406 022335 0ustar00neumannstaff000000 000000 # $Id: TclGdbmStorage.xotcl,v 1.3 2005/09/09 21:09:01 neumann Exp $ package provide xotcl::store::tclgdbm 0.84 package require xotcl::store::gdbm package require xotcl::store package require XOTcl 1 namespace eval ::xotcl::store::tclgdbm { namespace import ::xotcl::* # # a simple GNU Gdbm DB Store Access based on TclGdbm # Class Storage=TclGdbm -superclass Storage Storage=TclGdbm instproc open f { my instvar persistenceDB ::set persistenceDB [gdbm_open -wrcreat $f] } Storage=TclGdbm instproc set args { my instvar persistenceDB ::set l [llength $args] if {$l == 1} {[::set persistenceDB] fetch [lindex $args 0] } elseif {$l == 2} {[::set persistenceDB] -replace store \ [lindex $args 0] [lindex $args 1] } else { next } } Storage=TclGdbm instproc exists k { my instvar persistenceDB $persistenceDB exists $k } Storage=TclGdbm instproc names {} { my instvar persistenceDB ::set list "" if {[::set key [$persistenceDB firstkey]] != ""} { lappend list $key while {[::set key [$persistenceDB nextkey $key]] != ""} { lappend list $key } } return $list } Storage=TclGdbm instproc close args { my instvar persistenceDB $persistenceDB close } Storage=TclGdbm instproc unset k { my instvar persistenceDB $persistenceDB delete $k } namespace export Storage=TclGdbm } namespace import ::xotcl::store::tclgdbm::* ./xotcl-1.6.8/library/store/._TextFileStorage.xotcl000644 000765 000024 00000000430 12161606554 022764 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/TextFileStorage.xotcl000644 000765 000024 00000007753 12161606554 022566 0ustar00neumannstaff000000 000000 package provide xotcl::store::textfile 1.0 package require -exact xotcl::store 1.0 package require XOTcl 1 namespace eval ::xotcl::store::textfile { namespace import ::xotcl::* Class Storage=TextFile -superclass Storage -parameter { filename reorgCounter reorgMaxValue } Storage=TextFile instproc init args { my instvar reorgCounter reorgMaxValue searchID ::set reorgCounter 0 ::set reorgMaxValue 1000 ::set searchID "" next } Storage=TextFile instproc reorganizeDB {} { my instvar noreorg reorgCounter reorgMaxValue filename keys ::set reorgCounter -1 #puts "***reorganizeDB" if {[::info exists filename]} { ::set noreorg 1 ::array set bkeys [::array get keys] ::array set keys {} # parray bkeys ::set bak $filename.orig file rename -force $filename $bak foreach k [::array names bkeys] { ::set bf [::open $bak r] seek $bf [lindex $bkeys($k) 0] ::set c [read $bf [lindex $bkeys($k) 1]] ::close $bf #puts "***STORING $k [lindex $c 1]" my set $k [lindex $c 1] } file delete -force $bak ::unset noreorg } } Storage=TextFile instproc open fn { my instvar keys filename ::array set keys {} ::set position 0 ::set filename $fn if {[file exists $filename]} { ::set f [::open $filename r] ::set c [read $f] ::close $f foreach {k v} $c { lappend keyList $k } ::set f [::open $filename r] while {1} { set position [tell $f] if {!([gets $f line] >= 0)} { break } set k [lindex $keyList 0] if {[string match $k* $line]} { set lastLength [string length $line] set keys($k) [concat $position $lastLength] set lastKey $k set lastPosition $position set keyList [lreplace $keyList 0 0] } elseif {[info exists lastKey]} { set lastLength [expr $lastLength + [string length $line] + 1] set keys($lastKey) [concat $lastPosition $lastLength] } } ::close $f #parray keys } } Storage=TextFile instproc exists key { my instvar keys info exists keys($key) } Storage=TextFile instproc set args { my instvar keys noreorg reorgCounter reorgMaxValue filename ::set key [lindex $args 0] ::set l [llength $args] if {$l == 1} { ;# fetch if {[::info exists keys($key)]} { ::set f [::open $filename r] #puts "***fetch -- $keys($key)" seek $f [lindex $keys($key) 0] ::set c [read $f [lindex $keys($key) 1]] ::close $f return [lindex $c 1] } else { error "no such variable '$key'" } } elseif {$l == 2} { ;# store if {![::info exists noreorg] && [::info exists keys($key)]} { ::incr reorgCounter } ::set f [::open $filename a+] ::set position [tell $f] #puts "***store -- putting [::list $key [lindex $args 1]] at $position" ::set c [::list $key [lindex $args 1]] puts $f $c ::close $f ::set keys($key) [::list $position [expr {[string length $c] + 1}]] # parray keys if {$reorgCounter > $reorgMaxValue} { my reorganizeDB } } else { next } } Storage=TextFile instproc names {} { my array names keys } Storage=TextFile instproc close {} { my instvar filename keys my reorganizeDB ::unset filename ::unset keys } Storage=TextFile instproc unset key { my instvar keys if {[::info exists keys($key)]} { ::unset keys($key) } my reorganizeDB } Storage=TextFile instproc firstkey {} { my instvar keys searchID if {$searchID ne ""} { array donesearch keys $searchID } ::set searchID [array startsearch keys] return [array nextelement keys $searchID] } Storage=TextFile instproc nextkey {} { my instvar keys searchID if {$searchID eq ""} { error "[self class]: firstkey was not invoked on storage search" } ::set elt [array nextelement keys $searchID] if {$elt eq ""} { # if array end is reach search is terminated automatically!! ::set searchID "" } return $elt } namespace export Storage=TextFile } namespace import ::xotcl::store::textfile::* ./xotcl-1.6.8/library/store/XOTclGdbm/._aclocal.m4000644 000765 000024 00000000430 12161600406 022251 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/aclocal.m4000644 000765 000024 00000000063 12161600406 022036 0ustar00neumannstaff000000 000000 builtin(include,xotcl.m4) builtin(include,tcl.m4) ./xotcl-1.6.8/library/store/XOTclGdbm/._configure000755 000765 000024 00000000430 12327656422 022335 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/configure000755 000765 000024 00001034737 12327656422 022142 0ustar00neumannstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for xotclgdbm 1.2. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='xotclgdbm' PACKAGE_TARNAME='xotclgdbm' PACKAGE_VERSION='1.2' PACKAGE_STRING='xotclgdbm 1.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS TCL_INCLUDES PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL_SCRIPT INSTALL_PROGRAM INSTALL_DATA INSTALL CPP TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_gdbm with_xotcl with_tcl with_tclinclude enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures xotclgdbm 1.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/xotclgdbm] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of xotclgdbm 1.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gdbm=GDBM_INCLUDE_DIR,GDBM_LIB_DIR absolute path to gdbm.h and optionally the path to the library, --without-gdbm disables build of Tcl Gdbm --with-xotcl=DIR_CONTAINING_XOTCLCONFIG_SH absolute path to xotclConfig.sh, --without-xotcl disables, but this is pointless --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF xotclgdbm configure 1.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by xotclgdbm $as_me 1.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in ../../../tclconfig "$srcdir"/../../../tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../../tclconfig \"$srcdir\"/../../../tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- # Check whether --with-gdbm was given. if test "${with_gdbm+set}" = set; then : withval=$with_gdbm; with_gdbm=$withval else with_gdbm=no fi # Check whether --with-xotcl was given. if test "${with_xotcl+set}" = set; then : withval=$with_xotcl; with_xotcl=$withval else as_fn_error $? "--with-xotcl is required" "$LINENO" 5 fi #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" INSTALL_DATA="\${INSTALL} -m 644" INSTALL_PROGRAM="\${INSTALL}" INSTALL_SCRIPT="\${INSTALL}" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- if test ! "${with_gdbm}" = no; then GDBM_INC_DIR="`echo $with_gdbm |cut -f1 -d,`" GDBM_LIB_DIR="`echo $with_gdbm |cut -f2 -d, -s`" fi if test -z "$GDBM_INC_DIR" ; then gdbm_h_ok=1 GDBM_INC_SPEC="" else GDBM_INC_SPEC="-I${GDBM_INC_DIR}" echo "Checking ${GDBM_INC_DIR}/gdbm.h" if test -f "${GDBM_INC_DIR}/gdbm.h" ; then gdbm_h_ok=1 else gdbm_h_ok=0 fi fi if test "${gdbm_h_ok}" == "0" ; then as_fn_error $? " Could not locate gdbm.h on your machine to build XOTclGdbm. You can download a precompiled lib 'libgdbm' and the header file 'gdbm.h' from http://www.gnu.org/software/gdbm/ and compile again. Alternatively, you can compile XOTcl without gdbm. " "$LINENO" 5 fi if test -z "${GDBM_LIB_DIR}" ; then GDBM_LIB_SPEC="" else GDBM_LIB_SPEC="-L${GDBM_LIB_DIR}" fi #echo "Gdbm include spec = '${GDBM_INC_SPEC}'" #echo "Gdbm lib spec = '${GDBM_LIB_SPEC}'" #-------------------------------------------------------------------- # Load the xotclConfig.sh file #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: Reading file ${with_xotcl}/xotclConfig.sh" >&5 $as_echo "$as_me: Reading file ${with_xotcl}/xotclConfig.sh" >&6;} source ${with_xotcl}/xotclConfig.sh vars="xotclgdbm.c" for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="-I${with_xotcl}/generic ${XOTCL_BUILD_INCLUDE_SPEC} ${GDBM_INC_SPEC}" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="$XOTCL_BUILD_STUB_LIB_SPEC $XOTCL_BUILD_LIB_SPEC $GDBM_LIB_SPEC -lgdbm" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS " vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_sample in this case) so # that we create the export library with the dll. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then $as_echo "#define BUILD_sample 1" >>confdefs.h CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else CLEANFILES="pkgIndex.tcl" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32 #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h #AC_DEFINE(USE_TK_STUBS) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. # Add WISH as well if this is a Tk extension. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by xotclgdbm $as_me 1.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ xotclgdbm config.status 1.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ./xotcl-1.6.8/library/store/XOTclGdbm/._configure.ac000644 000765 000024 00000000430 12327771445 022717 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/configure.ac000644 000765 000024 00000023264 12327771445 022514 0ustar00neumannstaff000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. # # RCS: @(#) $Id: configure.in,v 1.20 2007/10/12 19:53:32 neumann Exp $ #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- configdir=$(srcdir)/../../../tclconfig #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. #----------------------------------------------------------------------- AC_INIT([xotclgdbm], [1.2]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR([../../../tclconfig]) #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- AC_ARG_WITH([gdbm], [ --with-gdbm=GDBM_INCLUDE_DIR[,GDBM_LIB_DIR] absolute path to gdbm.h and optionally the path to the library, --without-gdbm disables build of Tcl Gdbm], [with_gdbm=$withval], [with_gdbm=no]) AC_ARG_WITH([xotcl], [ --with-xotcl=DIR_CONTAINING_XOTCLCONFIG_SH absolute path to xotclConfig.sh, --without-xotcl disables, but this is pointless], [with_xotcl=$withval], [AC_MSG_ERROR([--with-xotcl is required])]) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- if test ! "${with_gdbm}" = no; then GDBM_INC_DIR="`echo $with_gdbm |cut -f1 -d,`" GDBM_LIB_DIR="`echo $with_gdbm |cut -f2 -d, -s`" fi if test -z "$GDBM_INC_DIR" ; then gdbm_h_ok=1 GDBM_INC_SPEC="" else GDBM_INC_SPEC="-I${GDBM_INC_DIR}" echo "Checking ${GDBM_INC_DIR}/gdbm.h" if test -f "${GDBM_INC_DIR}/gdbm.h" ; then gdbm_h_ok=1 else gdbm_h_ok=0 fi fi if test "${gdbm_h_ok}" == "0" ; then AC_MSG_ERROR([ Could not locate gdbm.h on your machine to build XOTclGdbm. You can download a precompiled lib 'libgdbm' and the header file 'gdbm.h' from http://www.gnu.org/software/gdbm/ and compile again. Alternatively, you can compile XOTcl without gdbm. ]) fi if test -z "${GDBM_LIB_DIR}" ; then GDBM_LIB_SPEC="" else GDBM_LIB_SPEC="-L${GDBM_LIB_DIR}" fi #echo "Gdbm include spec = '${GDBM_INC_SPEC}'" #echo "Gdbm lib spec = '${GDBM_LIB_SPEC}'" #-------------------------------------------------------------------- # Load the xotclConfig.sh file #-------------------------------------------------------------------- AC_MSG_NOTICE([Reading file ${with_xotcl}/xotclConfig.sh]) source ${with_xotcl}/xotclConfig.sh TEA_ADD_SOURCES([xotclgdbm.c]) TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([-I${with_xotcl}/generic ${XOTCL_BUILD_INCLUDE_SPEC} ${GDBM_INC_SPEC}]) TEA_ADD_LIBS([$XOTCL_BUILD_STUB_LIB_SPEC $XOTCL_BUILD_LIB_SPEC $GDBM_LIB_SPEC -lgdbm]) TEA_ADD_CFLAGS([]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_sample in this case) so # that we create the export library with the dll. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then AC_DEFINE([BUILD_sample]) CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else CLEANFILES="pkgIndex.tcl" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi AC_SUBST([CLEANFILES]) #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE([USE_TCL_STUBS]) #AC_DEFINE([USE_TK_STUBS]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. # Add WISH as well if this is a Tk extension. #-------------------------------------------------------------------- TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_CONFIG_FILES([Makefile]) AC_OUTPUT ./xotcl-1.6.8/library/store/XOTclGdbm/._Makefile000644 000765 000024 00000000430 12161600406 022051 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/Makefile000644 000765 000024 00000043466 12161600406 021654 0ustar00neumannstaff000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2003 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: Makefile,v 1.27 2007/09/13 15:21:54 neumann Exp $ #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = xotclgdbm.c PKG_OBJECTS = xotclgdbm.o PKG_STUB_SOURCES = PKG_STUB_OBJECTS = #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = libxotclgdbm1.2.dylib PKG_STUB_LIB_FILE = libxotclgdbmstub1.2.a lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = /bin/sh srcdir = . prefix = /usr/local/aolserver-4.5 exec_prefix = /usr/local/aolserver-4.5 bindir = ${exec_prefix}/bin libdir = ${exec_prefix}/lib datadir = ${prefix}/share mandir = ${prefix}/man includedir = ${prefix}/include DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL = /usr/bin/install -c INSTALL_PROGRAM = ${INSTALL} INSTALL_DATA = ${INSTALL} -m 644 INSTALL_SCRIPT = ${INSTALL} PACKAGE_NAME = xotclgdbm PACKAGE_VERSION = 1.2 CC = gcc CFLAGS_DEFAULT = -Os CFLAGS_WARNING = -Wall -Wno-implicit-int CLEANFILES = pkgIndex.tcl EXEEXT = LDFLAGS_DEFAULT = -prebind -headerpad_max_install_names -Wl,-search_paths_first MAKE_LIB = ${SHLIB_LD} -o $@ $(PKG_OBJECTS) ${SHLIB_LD_LIBS} MAKE_SHARED_LIB = ${SHLIB_LD} -o $@ $(PKG_OBJECTS) ${SHLIB_LD_LIBS} MAKE_STATIC_LIB = ${STLIB_LD} $@ $(PKG_OBJECTS) MAKE_STUB_LIB = ${STLIB_LD} $@ $(PKG_STUB_OBJECTS) OBJEXT = o RANLIB = : RANLIB_STUB = ranlib SHLIB_CFLAGS = -fno-common SHLIB_LD = ${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT} -Wl,-single_module SHLIB_LD_FLAGS = @SHLIB_LD_FLAGS@ SHLIB_LD_LIBS = ${LIBS} -L/usr/local/aolserver-4.5/lib -ltclstub8.4 STLIB_LD = ${AR} cr TCL_DEFS = -DNO_VALUES_H=1 -DHAVE_LIMITS_H=1 -DHAVE_UNISTD_H=1 -DHAVE_SYS_PARAM_H=1 -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAVE_PTHREAD_ATTR_SETSTACKSIZE=1 -DHAVE_PTHREAD_ATFORK=1 -DTCL_THREADS=1 -DHAVE_COREFOUNDATION=1 -DMAC_OSX_TCL=1 -DTCL_WIDE_INT_TYPE=long\ long -DHAVE_GETCWD=1 -DHAVE_OPENDIR=1 -DHAVE_STRSTR=1 -DHAVE_STRTOL=1 -DHAVE_STRTOLL=1 -DHAVE_STRTOULL=1 -DHAVE_TMPNAM=1 -DHAVE_WAITPID=1 -DHAVE_GETPWUID_R_5=1 -DHAVE_GETPWUID_R=1 -DHAVE_GETPWNAM_R_5=1 -DHAVE_GETPWNAM_R=1 -DHAVE_GETGRGID_R_5=1 -DHAVE_GETGRGID_R=1 -DHAVE_GETGRNAM_R_5=1 -DHAVE_GETGRNAM_R=1 -DHAVE_MTSAFE_GETHOSTBYNAME=1 -DHAVE_MTSAFE_GETHOSTBYADDR=1 -DUSE_TERMIOS=1 -DHAVE_SYS_TIME_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_TM_ZONE=1 -DHAVE_GMTIME_R=1 -DHAVE_LOCALTIME_R=1 -DHAVE_TM_GMTOFF=1 -DHAVE_ST_BLKSIZE=1 -DSTDC_HEADERS=1 -DHAVE_SIGNED_CHAR=1 -DHAVE_PUTENV_THAT_COPIES=1 -DHAVE_LANGINFO=1 -DHAVE_COPYFILE=1 -DHAVE_LIBKERN_OSATOMIC_H=1 -DHAVE_OSSPINLOCKLOCK=1 -DHAVE_PTHREAD_ATFORK=1 -DUSE_VFORK=1 -DTCL_DEFAULT_ENCODING=\"utf-8\" -DTCL_LOAD_FROM_MEMORY=1 -DHAVE_AVAILABILITYMACROS_H=1 -DHAVE_FTS=1 -DHAVE_SYS_IOCTL_H=1 -DHAVE_SYS_FILIO_H=1 TCL_BIN_DIR = /usr/local/aolserver-4.5/lib TCL_SRC_DIR = /usr/local/src/tcl8.4.14 # This is necessary for packages that use private Tcl headers #TCL_TOP_DIR_NATIVE = @TCL_TOP_DIR_NATIVE@ # Not used, but retained for reference of what libs Tcl required TCL_LIBS = ${DL_LIBS} ${LIBS} ${MATH_LIBS} #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) TCLSH_ENV = TCL_LIBRARY=`echo $(TCL_SRC_DIR)/library` \ DYLD_LIBRARY_PATH="$(EXTRA_PATH):$(DYLD_LIBRARY_PATH)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(top_builddir)" TCLSH_PROG = /usr/local/aolserver-4.5/bin/tclsh8.4 TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) SHARED_BUILD = 1 INCLUDES = -I/Users/neumann/src/xotcl-1.5.5/generic -I./generic -I"/usr/local/aolserver-4.5/include" EXTRA_CFLAGS = # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) -DPACKAGE_NAME=\"xotclgdbm\" -DPACKAGE_TARNAME=\"xotclgdbm\" -DPACKAGE_VERSION=\"1.2\" -DPACKAGE_STRING=\"xotclgdbm\ 1.2\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DNO_VALUES_H=1 -DHAVE_LIMITS_H=1 -DHAVE_SYS_PARAM_H=1 -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 -DTCL_THREADS=1 -DTCL_WIDE_INT_TYPE=long\ long -DUSE_TCL_STUBS=1 $(EXTRA_CFLAGS) DEFS = -DPACKAGE_NAME=\"xotclgdbm\" -DPACKAGE_TARNAME=\"xotclgdbm\" -DPACKAGE_VERSION=\"1.2\" -DPACKAGE_STRING=\"xotclgdbm\ 1.2\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DNO_VALUES_H=1 -DHAVE_LIMITS_H=1 -DHAVE_SYS_PARAM_H=1 -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 -DTCL_THREADS=1 -DTCL_WIDE_INT_TYPE=long\ long -DUSE_TCL_STUBS=1 $(EXTRA_CFLAGS) CONFIG_CLEAN_FILES = Makefile CPPFLAGS = LIBS = -L/Users/neumann/src/xotcl-1.5.5 -lxotclstub1.5.5 -L/Users/neumann/src/xotcl-1.5.5 -lxotcl1.5.5 -lgdbm AR = ar CFLAGS = -pipe ${CFLAGS_DEFAULT} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target inclues executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) pkgIndex.tcl libraries: doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries install-doc install-binaries: binaries install-lib-binaries install-bin-binaries if test "x$(SHARED_BUILD)" = "x1"; then \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # This rule installs platform-independent files, such as header files. #======================================================================== install-libraries: libraries @mkdir -p $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @if test -n "$(PKG_HEADERS)" ; then \ for i in "$(PKG_HEADERS)" ; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; \ fi #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc #install-doc: doc # @mkdir -p $(DESTDIR)$(mandir)/mann # @echo "Installing documentation in $(DESTDIR)$(mandir)" # @for i in $(srcdir)/doc/*.n; do \ # echo "Installing $$i"; \ # rm -f $(DESTDIR)$(mandir)/mann/`basename $$i`; \ # $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ # done test: binaries libraries $(TCLSH) `echo $(srcdir)/tests/all.tcl` $(TESTFLAGS) shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `echo $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win .c.o: $(COMPILE) -c `echo $<` -o $@ #======================================================================== # Create the pkgIndex.tcl file. # It is usually easiest to let Tcl do this for you with pkg_mkIndex, but # you may find that you need to customize the package. If so, either # modify the -hand version, or create a pkgIndex.tcl.in file and have # the configure script output the pkgIndex.tcl by editing configure.in. #======================================================================== #pkgIndex.tcl: # ( echo pkg_mkIndex . $(PKG_LIB_FILE) \; exit; ) | $(TCLSH) pkgIndex.tcl: (echo 'package ifneeded xotcl::store::gdbm $(PACKAGE_VERSION) \ [list load [file join $$dir $(PKG_LIB_FILE)]]'\ ) > pkgIndex.tcl #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = gtar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean mkdir -p $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in cp -p $(srcdir)/*.[ch] $(DIST_DIR)/ mkdir $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ mkdir $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: @mkdir -p $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: @mkdir -p $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done .SUFFIXES: .c .$(OBJEXT) Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ./xotcl-1.6.8/library/store/XOTclGdbm/._Makefile.in000644 000765 000024 00000000430 12326517262 022470 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/Makefile.in000644 000765 000024 00000036641 12326517262 022270 0ustar00neumannstaff000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2003 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: Makefile.in,v 1.5 2007/08/14 16:38:26 neumann Exp $ #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ bindir = @bindir@ libdir = @libdir@ datadir = @datadir@ mandir = @mandir@ includedir = @includedir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ CLEANFILES = @CLEANFILES@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_FLAGS = @SHLIB_LD_FLAGS@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ # This is necessary for packages that use private Tcl headers #TCL_TOP_DIR_NATIVE = @TCL_TOP_DIR_NATIVE@ # Not used, but retained for reference of what libs Tcl required TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \ @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(top_builddir)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) SHARED_BUILD = @SHARED_BUILD@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ EXTRA_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(EXTRA_CFLAGS) DEFS = @DEFS@ $(EXTRA_CFLAGS) CONFIG_CLEAN_FILES = Makefile CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = ar CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target inclues executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) pkgIndex.tcl libraries: doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries install-doc install-binaries: binaries install-lib-binaries install-bin-binaries if test "x$(SHARED_BUILD)" = "x1"; then \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # This rule installs platform-independent files, such as header files. #======================================================================== install-libraries: libraries @mkdir -p $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @if test -n "$(PKG_HEADERS)" ; then \ for i in "$(PKG_HEADERS)" ; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; \ fi #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc #install-doc: doc # @mkdir -p $(DESTDIR)$(mandir)/mann # @echo "Installing documentation in $(DESTDIR)$(mandir)" # @for i in $(srcdir)/doc/*.n; do \ # echo "Installing $$i"; \ # rm -f $(DESTDIR)$(mandir)/mann/`basename $$i`; \ # $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ # done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Create the pkgIndex.tcl file. # It is usually easiest to let Tcl do this for you with pkg_mkIndex, but # you may find that you need to customize the package. If so, either # modify the -hand version, or create a pkgIndex.tcl.in file and have # the configure script output the pkgIndex.tcl by editing configure.in. #======================================================================== #pkgIndex.tcl: # ( echo pkg_mkIndex . $(PKG_LIB_FILE) \; exit; ) | $(TCLSH) pkgIndex.tcl: (echo 'package ifneeded xotcl::store::gdbm $(PACKAGE_VERSION) \ [list load [file join $$dir $(PKG_LIB_FILE)]]'\ ) > pkgIndex.tcl #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = gtar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean mkdir -p $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in cp -p $(srcdir)/*.[ch] $(DIST_DIR)/ mkdir $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ mkdir $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: @mkdir -p $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: @mkdir -p $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done .SUFFIXES: .c .$(OBJEXT) Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ./xotcl-1.6.8/library/store/XOTclGdbm/._tcl.m4000644 000765 000024 00000000521 12326520370 021442 0ustar00neumannstaff000000 000000 Mac OS X  2QATTRQ¸™¸€com.apple.acl.text8com.apple.quarantine!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity q/0001;5341449d;Firefox;./xotcl-1.6.8/library/store/XOTclGdbm/tcl.m4000644 000765 000024 00000405647 12326520370 021247 0ustar00neumannstaff000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef _WIN32 #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) INSTALL_DATA="\${INSTALL} -m 644" AC_SUBST(INSTALL_DATA) INSTALL_PROGRAM="\${INSTALL}" AC_SUBST(INSTALL_PROGRAM) INSTALL_SCRIPT="\${INSTALL}" AC_SUBST(INSTALL_SCRIPT) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ./xotcl-1.6.8/library/store/XOTclGdbm/tclconfig/._install-sh000755 000765 000024 00000000430 12327660005 024372 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/tclconfig/install-sh000755 000765 000024 00000033054 12327660005 024165 0ustar00neumannstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -S $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ./xotcl-1.6.8/library/store/XOTclGdbm/._xotcl.m4000644 000765 000024 00000000430 12161600406 022004 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/xotcl.m4000644 000765 000024 00000007512 12161600406 021577 0ustar00neumannstaff000000 000000 # xotcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999 Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #------------------------------------------------------------------------ # SC_PATH_XOTCLCONFIG -- # # Locate the xotclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-xotcl=... # # Defines the following vars: # XOTCL_BIN_DIR Full path to the directory containing # the xotclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN(SC_PATH_XOTCLCONFIG, [ # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_xotcl}" = x ; then # we reset no_xotcl in case something fails here no_xotcl=true AC_ARG_WITH(xotcl, [ --with-xotcl directory containing xotcl configuration (xotclConfig.sh)], with_xotclconfig=${withval}) AC_MSG_CHECKING([for XOTcl configuration]) AC_CACHE_VAL(ac_cv_c_xotclconfig,[ # First check to see if --with-xotcl was specified. if test x"${with_xotclconfig}" != x ; then if test -f "${with_xotclconfig}/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd ${with_xotclconfig}; pwd)` else AC_MSG_ERROR([${with_xotclconfig} directory doesn't contain xotclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_xotclconfig}" = x ; then for i in \ ${srcdir}/../xotcl \ `ls -dr ${srcdir}/../xotcl-* 2>/dev/null` \ ${srcdir}/../../xotcl \ `ls -dr ${srcdir}/../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../xotcl \ `ls -dr ${srcdir}/../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../xotcl \ `ls -dr ${srcdir}/../../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../../xotcl \ `ls -dr ${srcdir}/../../../../../xotcl-* 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_xotclconfig}" = x ; then for i in `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_xotclconfig}" = x ; then XOTCL_BIN_DIR="# no XOTcl configs found" AC_MSG_WARN(Can't find XOTcl configuration definitions) exit 0 else no_xotcl= XOTCL_BIN_DIR=${ac_cv_c_xotclconfig} AC_MSG_RESULT(found $XOTCL_BIN_DIR/xotclConfig.sh) fi fi ]) #------------------------------------------------------------------------ # SC_LOAD_XOTCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # XOTCL_BIN_DIR # # Results: # # Subst the vars: # #------------------------------------------------------------------------ AC_DEFUN(SC_LOAD_XOTCLCONFIG, [ AC_MSG_CHECKING([for existence of $XOTCL_BIN_DIR/xotclConfig.sh]) if test -f "$XOTCL_BIN_DIR/xotclConfig.sh" ; then AC_MSG_RESULT([loading]) . $XOTCL_BIN_DIR/xotclConfig.sh else AC_MSG_RESULT([file not found]) fi # # The eval is required to do the TCL_DBGX substitution in the # TCL_LIB_FILE variable # AC_SUBST(XOTCL_VERSION) AC_SUBST(XOTCL_MAJOR_VERSION) AC_SUBST(XOTCL_MINOR_VERSION) AC_SUBST(XOTCL_RELEASE_LEVEL) AC_SUBST(XOTCL_LIB_FILE) AC_SUBST(XOTCL_BUILD_LIB_SPEC) AC_SUBST(XOTCL_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_FILE) AC_SUBST(XOTCL_BUILD_STUB_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_SPEC) AC_SUBST(XOTCL_SRC_DIR) ]) ./xotcl-1.6.8/library/store/XOTclGdbm/._xotclgdbm.c000644 000765 000024 00000000430 12161600406 022540 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclGdbm/xotclgdbm.c000644 000765 000024 00000023200 12161600406 022323 0ustar00neumannstaff000000 000000 /* * xotclgdbm.c * * based on Tclndbm 0.5 by John Ellson (ellson@lucent.com) */ #include #include #include #include #include #include #if (TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<1) # define TclObjStr(obj) Tcl_GetStringFromObj(obj, ((int*)NULL)) #else # define TclObjStr(obj) Tcl_GetString(obj) #endif typedef struct db_s { datum* lastSearchKey; GDBM_FILE db; } db_t; void gdbmFatalFunc(char* message) { fprintf(stderr, "GDBM FATAL:\n%s\n", message); exit(1); } static int XOTclGdbmOpenMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { db_t *db; XOTcl_Object* obj = (XOTcl_Object*) cd; int flags, block_size, mode; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 2) return XOTclObjErrArgCnt(in, obj->cmdName, "open filename"); /* name not in hashtab - create new db */ if (XOTclGetObjClientData(obj)) return XOTclVarErrMsg(in, "Called open on '", TclObjStr(obj->cmdName), "', but open database was not closed before.", 0); db = (db_t*) ckalloc (sizeof(db_t)); db->lastSearchKey = NULL; flags = GDBM_WRCREAT; block_size = 0; mode = 0644; db->db = gdbm_open(TclObjStr(objv[1]), block_size, flags, mode, gdbmFatalFunc); if (db->db == NULL) { ckfree ((char*) db); db = (db_t*) NULL ; return XOTclVarErrMsg(in, "Open on '", TclObjStr(obj->cmdName), "' failed with '", TclObjStr(objv[1]),"': ", gdbm_strerror(gdbm_errno), 0); } /* * success */ XOTclSetObjClientData(obj, (ClientData) db); return TCL_OK; } static int XOTclGdbmCloseMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { db_t *db; XOTcl_Object* obj = (XOTcl_Object *) cd; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "close"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called close on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); gdbm_close(db->db); ckfree ((char*)db); XOTclSetObjClientData(obj, 0); return TCL_OK; } static int XOTclGdbmNamesMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; Tcl_Obj *list; db_t *db; Tcl_DString result; datum del, key; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "names"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called names on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); Tcl_DStringInit(&result); key = gdbm_firstkey(db->db); if (!key.dptr) { /* empty db */ return TCL_OK ; } /* * copy key to result and go to next key */ list = Tcl_NewListObj(0, NULL); do { Tcl_ListObjAppendElement(in,list,Tcl_NewStringObj(key.dptr,key.dsize-1)); del.dptr = key.dptr; key = gdbm_nextkey(db->db, key); free(del.dptr); } while (key.dptr); Tcl_SetObjResult(in, list); return TCL_OK; } static int XOTclGdbmSetMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *)cd; db_t *db; datum key, content; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc <2 || objc > 3) return XOTclObjErrArgCnt(in, obj->cmdName, "set key ?value?"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called set on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); key.dptr = TclObjStr(objv[1]); key.dsize = objv[1]->length + 1; if (objc == 2) { /* get value */ content = gdbm_fetch(db->db, key); if (content.dptr) { /* found */ Tcl_Obj *r = Tcl_NewStringObj(content.dptr, content.dsize-1); Tcl_SetObjResult(in, r); free(content.dptr); } else { /* key not found */ return XOTclVarErrMsg(in, "no such variable '", key.dptr, "'", 0); } } else { /* set value */ content.dptr = TclObjStr(objv[2]); content.dsize = objv[2]->length + 1; if (gdbm_store(db->db, key, content, GDBM_REPLACE) == 0) { /*fprintf(stderr,"setting %s to '%s'\n",key.dptr,content.dptr);*/ Tcl_SetObjResult(in, objv[2]); } else { return XOTclVarErrMsg(in, "set of variable '", TclObjStr(obj->cmdName), "' failed.", 0); } } return TCL_OK; } static int XOTclGdbmExistsMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum key; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 2) return XOTclObjErrArgCnt(in, obj->cmdName, "exists variable"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called exists on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); key.dptr = TclObjStr(objv[1]); key.dsize = objv[1]->length + 1; if (gdbm_exists(db->db, key)) Tcl_SetIntObj(Tcl_GetObjResult(in), 1); else Tcl_SetIntObj(Tcl_GetObjResult(in), 0); return TCL_OK; } static int XOTclGdbmUnsetMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum key; int ret; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 2) return XOTclObjErrArgCnt(in, obj->cmdName, "unset key"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called unset on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); key.dptr = TclObjStr(objv[1]); key.dsize = objv[1]->length + 1; ret = gdbm_delete(db->db, key); if (ret == 0) { return TCL_OK; } else { return XOTclVarErrMsg(in, "Tried to unset '", TclObjStr(objv[1]), "' but key does not exist.", 0); } } static int XOTclGdbmFirstKeyMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum key; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "firstkey"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called unset on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); if (db->lastSearchKey != 0) { ckfree((char*) db->lastSearchKey->dptr); ckfree((char*) db->lastSearchKey); db->lastSearchKey = 0; } key = gdbm_firstkey(db->db); if (!key.dptr) { /* * empty db */ return TCL_OK; } Tcl_AppendResult (in, key.dptr, (char*)0); db->lastSearchKey = (datum*) ckalloc(sizeof(datum)); db->lastSearchKey->dptr = key.dptr; db->lastSearchKey->dsize = key.dsize; return TCL_OK; } static int XOTclGdbmNextKeyMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum newkey; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "nextkey"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called unset on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); if (db->lastSearchKey == 0) return XOTclVarErrMsg(in, "nextkey invoked, but no search was started on '", TclObjStr(obj->cmdName), "'", 0); newkey = gdbm_nextkey(db->db, *db->lastSearchKey); if (!newkey.dptr) { /* * end of search */ if (db->lastSearchKey != 0) { free((char*) db->lastSearchKey->dptr); ckfree((char*) db->lastSearchKey); db->lastSearchKey = 0; } return TCL_OK ; } Tcl_AppendResult (in, newkey.dptr, (char*)0); if (db->lastSearchKey != 0) { free((char*) db->lastSearchKey->dptr); } db->lastSearchKey->dptr = newkey.dptr; db->lastSearchKey->dsize = newkey.dsize; return TCL_OK; } /* * Xotclgdbm_Init * register commands, init data structures */ extern int Xotclgdbm_Init(Tcl_Interp * in) { XOTcl_Class* cl; int result; #ifdef USE_TCL_STUBS if (Tcl_InitStubs(in, TCL_VERSION, 0) == NULL) { return TCL_ERROR; } # ifdef USE_XOTCL_STUBS if (Xotcl_InitStubs(in, "1.1", 0) == NULL) { return TCL_ERROR; } # endif #else if (Tcl_PkgRequire(in, "Tcl", TCL_VERSION, 0) == NULL) { return TCL_ERROR; } #endif Tcl_PkgProvide(in, "xotcl::store::gdbm", PACKAGE_VERSION); #ifdef PACKAGE_REQUIRE_XOTL_FROM_SLAVE_INTERP_WORKS_NOW if (Tcl_PkgRequire(in, "XOTcl", XOTCLVERSION, 0) == NULL) { return TCL_ERROR; } #endif if (Tcl_PkgRequire(in, "xotcl::store", 0, 0) == NULL) { return TCL_ERROR; } result = Tcl_VarEval (in, "::xotcl::Class Storage=Gdbm -superclass Storage", (char *) NULL); if (result != TCL_OK) return result; cl = XOTclGetClass(in, "Storage=Gdbm"); XOTclAddIMethod(in, cl, "open", XOTclGdbmOpenMethod, 0, 0); XOTclAddIMethod(in, cl, "close", XOTclGdbmCloseMethod, 0, 0); XOTclAddIMethod(in, cl, "set", XOTclGdbmSetMethod, 0, 0); XOTclAddIMethod(in, cl, "exists", XOTclGdbmExistsMethod, 0, 0); XOTclAddIMethod(in, cl, "names", XOTclGdbmNamesMethod, 0, 0); XOTclAddIMethod(in, cl, "unset", XOTclGdbmUnsetMethod, 0, 0); XOTclAddIMethod(in, cl, "firstkey", XOTclGdbmFirstKeyMethod, 0, 0); XOTclAddIMethod(in, cl, "nextkey", XOTclGdbmNextKeyMethod, 0, 0); Tcl_SetIntObj(Tcl_GetObjResult(in), 1); return TCL_OK; } extern int Xotclgdbm_SafeInit(interp) Tcl_Interp *interp; { return Xotclgdbm_Init(interp); } ./xotcl-1.6.8/library/store/XOTclSdbm/._aclocal.m4000644 000765 000024 00000000430 12161600406 022265 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/aclocal.m4000644 000765 000024 00000000063 12161600406 022052 0ustar00neumannstaff000000 000000 builtin(include,xotcl.m4) builtin(include,tcl.m4) ./xotcl-1.6.8/library/store/XOTclSdbm/._configure000755 000765 000024 00000000430 12327656273 022355 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/configure000755 000765 000024 00001032206 12327656273 022147 0ustar00neumannstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for xotclsdbm 1.2. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='xotclsdbm' PACKAGE_TARNAME='xotclsdbm' PACKAGE_VERSION='1.2' PACKAGE_STRING='xotclsdbm 1.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS TCL_INCLUDES PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL_SCRIPT INSTALL_PROGRAM INSTALL_DATA INSTALL CPP TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_xotcl with_tcl with_tclinclude enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures xotclsdbm 1.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/xotclsdbm] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of xotclsdbm 1.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-xotcl=DIR_CONTAINING_XOTCLCONFIG_SH absolute path to xotclConfig.sh, --without-xotcl disables, but this is pointless --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF xotclsdbm configure 1.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by xotclsdbm $as_me 1.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in ../../../tclconfig "$srcdir"/../../../tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../../tclconfig \"$srcdir\"/../../../tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- # Check whether --with-xotcl was given. if test "${with_xotcl+set}" = set; then : withval=$with_xotcl; with_xotcl=$withval else as_fn_error $? "--with-xotcl is required" "$LINENO" 5 fi #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" INSTALL_DATA="\${INSTALL} -m 644" INSTALL_PROGRAM="\${INSTALL}" INSTALL_SCRIPT="\${INSTALL}" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #-------------------------------------------------------------------- # Load the xotclConfig.sh file #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: Reading file ${with_xotcl}/xotclConfig.sh" >&5 $as_echo "$as_me: Reading file ${with_xotcl}/xotclConfig.sh" >&6;} source ${with_xotcl}/xotclConfig.sh #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- vars="hash.c pair.c sdbm.c xotclsdbm.c" for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="-I${with_xotcl}/generic ${XOTCL_BUILD_INCLUDE_SPEC}" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="$XOTCL_BUILD_STUB_LIB_SPEC $XOTCL_BUILD_LIB_SPEC" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS " vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_sample in this case) so # that we create the export library with the dll. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then $as_echo "#define BUILD_sample 1" >>confdefs.h CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else CLEANFILES="pkgIndex.tcl" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32 #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h #AC_DEFINE(USE_TK_STUBS) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. # Add WISH as well if this is a Tk extension. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by xotclsdbm $as_me 1.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ xotclsdbm config.status 1.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ./xotcl-1.6.8/library/store/XOTclSdbm/._configure.ac000644 000765 000024 00000000430 12327771445 022733 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/configure.ac000644 000765 000024 00000020272 12327771445 022524 0ustar00neumannstaff000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. # # RCS: @(#) $Id: configure.in,v 1.20 2007/10/12 19:53:32 neumann Exp $ #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- configdir=$(srcdir)/../../../tclconfig #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. #----------------------------------------------------------------------- AC_INIT([xotclsdbm], [1.2]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR([../../../tclconfig]) #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- AC_ARG_WITH([xotcl], [ --with-xotcl=DIR_CONTAINING_XOTCLCONFIG_SH absolute path to xotclConfig.sh, --without-xotcl disables, but this is pointless], [with_xotcl=$withval], [AC_MSG_ERROR([--with-xotcl is required])]) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #-------------------------------------------------------------------- # Load the xotclConfig.sh file #-------------------------------------------------------------------- AC_MSG_NOTICE([Reading file ${with_xotcl}/xotclConfig.sh]) source ${with_xotcl}/xotclConfig.sh #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- TEA_ADD_SOURCES([hash.c pair.c sdbm.c xotclsdbm.c]) TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([-I${with_xotcl}/generic ${XOTCL_BUILD_INCLUDE_SPEC}]) TEA_ADD_LIBS([$XOTCL_BUILD_STUB_LIB_SPEC $XOTCL_BUILD_LIB_SPEC]) TEA_ADD_CFLAGS([]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_sample in this case) so # that we create the export library with the dll. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then AC_DEFINE([BUILD_sample]) CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else CLEANFILES="pkgIndex.tcl" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi AC_SUBST([CLEANFILES]) #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE([USE_TCL_STUBS]) #AC_DEFINE([USE_TK_STUBS]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. # Add WISH as well if this is a Tk extension. #-------------------------------------------------------------------- TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile]) ./xotcl-1.6.8/library/store/XOTclSdbm/._dllEntryPoint.c000644 000765 000024 00000000430 12161600406 023400 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/dllEntryPoint.c000644 000765 000024 00000001534 12161600406 023171 0ustar00neumannstaff000000 000000 /* * dllEntryPoint.c -- * * This file implements the Dll entry point as needed by Windows. */ #define WIN32_LEAN_AND_MEAN #include #if defined(_MSC_VER) # define DllEntryPoint DllMain #endif /* *---------------------------------------------------------------------- * * DllEntryPoint -- * * This wrapper function is used by Windows to invoke the * initialization code for the DLL. If we are compiling * with Visual C++, this routine will be renamed to DllMain. * * Results: * Returns TRUE; * * Side effects: * None. * *---------------------------------------------------------------------- */ BOOL APIENTRY DllEntryPoint(hInst, reason, reserved) HINSTANCE hInst; /* Library instance handle. */ DWORD reason; /* Reason this function is being called. */ LPVOID reserved; /* Not used. */ { return TRUE; } ./xotcl-1.6.8/library/store/XOTclSdbm/._hash.c000644 000765 000024 00000000430 12161600406 021514 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/hash.c000644 000765 000024 00000001723 12161600406 021305 0ustar00neumannstaff000000 000000 /* * sdbm - ndbm work-alike hashed database library * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978). * author: oz@nexus.yorku.ca * status: public domain. keep it that way. * * hashing routine */ #include "sdbm.h" /* * polynomial conversion ignoring overflows * [this seems to work remarkably well, in fact better * then the ndbm hash function. Replace at your own risk] * use: 65599 nice. * 65587 even better. */ long sdbm_hash(str, len) register char *str; #ifdef VISUAL_CC register int len; #else register size_t len; #endif { register unsigned long n = 0; #ifdef HAVE_DUFF #define HASHC n = *str++ + 65599 * n if (len > 0) { register int loop = (len + 8 - 1) >> 3; switch(len & (8 - 1)) { case 0: do { HASHC; case 7: HASHC; case 6: HASHC; case 5: HASHC; case 4: HASHC; case 3: HASHC; case 2: HASHC; case 1: HASHC; } while (--loop); } } #else while (len--) n = *str++ + 65599 * n; #endif return n; } ./xotcl-1.6.8/library/store/XOTclSdbm/._Makefile.in000644 000765 000024 00000000430 12326517230 022477 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/Makefile.in000644 000765 000024 00000036641 12326517230 022277 0ustar00neumannstaff000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2003 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: Makefile.in,v 1.5 2007/08/14 16:38:26 neumann Exp $ #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ bindir = @bindir@ libdir = @libdir@ datadir = @datadir@ mandir = @mandir@ includedir = @includedir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ CLEANFILES = @CLEANFILES@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_FLAGS = @SHLIB_LD_FLAGS@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ # This is necessary for packages that use private Tcl headers #TCL_TOP_DIR_NATIVE = @TCL_TOP_DIR_NATIVE@ # Not used, but retained for reference of what libs Tcl required TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \ @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(top_builddir)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) SHARED_BUILD = @SHARED_BUILD@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ EXTRA_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(EXTRA_CFLAGS) DEFS = @DEFS@ $(EXTRA_CFLAGS) CONFIG_CLEAN_FILES = Makefile CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = ar CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target inclues executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) pkgIndex.tcl libraries: doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries install-doc install-binaries: binaries install-lib-binaries install-bin-binaries if test "x$(SHARED_BUILD)" = "x1"; then \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # This rule installs platform-independent files, such as header files. #======================================================================== install-libraries: libraries @mkdir -p $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @if test -n "$(PKG_HEADERS)" ; then \ for i in "$(PKG_HEADERS)" ; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; \ fi #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc #install-doc: doc # @mkdir -p $(DESTDIR)$(mandir)/mann # @echo "Installing documentation in $(DESTDIR)$(mandir)" # @for i in $(srcdir)/doc/*.n; do \ # echo "Installing $$i"; \ # rm -f $(DESTDIR)$(mandir)/mann/`basename $$i`; \ # $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ # done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Create the pkgIndex.tcl file. # It is usually easiest to let Tcl do this for you with pkg_mkIndex, but # you may find that you need to customize the package. If so, either # modify the -hand version, or create a pkgIndex.tcl.in file and have # the configure script output the pkgIndex.tcl by editing configure.in. #======================================================================== #pkgIndex.tcl: # ( echo pkg_mkIndex . $(PKG_LIB_FILE) \; exit; ) | $(TCLSH) pkgIndex.tcl: (echo 'package ifneeded xotcl::store::sdbm $(PACKAGE_VERSION) \ [list load [file join $$dir $(PKG_LIB_FILE)]]'\ ) > pkgIndex.tcl #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = gtar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean mkdir -p $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in cp -p $(srcdir)/*.[ch] $(DIST_DIR)/ mkdir $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ mkdir $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: @mkdir -p $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: @mkdir -p $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done .SUFFIXES: .c .$(OBJEXT) Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ./xotcl-1.6.8/library/store/XOTclSdbm/._Makefile.vc000644 000765 000024 00000000430 12161600406 022474 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/Makefile.vc000644 000765 000024 00000013406 12161600406 022266 0ustar00neumannstaff000000 000000 ###################################################################### # # XOTclSdbm Makefile for Visual C++ # ###################################################################### # Be sure to adapt the "configs.vc" file in the toplevel directory # to your system settings. !include "..\..\..\win\configs.vc" BINROOT = . ROOT = .. NAMEPREFIX = lib NAME = xotclsdbm XOTCL_DIR = ..\..\.. GENERICDIR = . WINDIR = . ###################################################################### !if $(DEBUG) TMPNAME = Debug DBGX = d !else TMPNAME = Release DBGX = !endif TMP_DIR = $(BINROOT)\$(TMPNAME) OUT_DIR = $(TMP_DIR) !if $(STATIC_BUILD) OUTNAME = $(NAMEPREFIX)$(NAME)$(XOTCL_VERSION)$(DBGX) TARGET = "$(OUT_DIR)\$(OUTNAME).lib" !else OUTNAME = $(NAMEPREFIX)$(NAME)$(XOTCL_VERSION)$(DBGX) IMPLIB = "$(OUT_DIR)\$(OUTNAME).lib" TARGET = "$(OUT_DIR)\$(OUTNAME).dll" !endif TCLSTUBLIB = "$(TCLROOT)\win\Release\tclstub$(TCL_VERSION).lib" TCLIMPLIB = "$(TCLROOT)\win\$(OUT_DIR)\tcl$(TCL_VERSION)$(DBGX).lib" TCLSH = "$(TCLROOT)\win\$(OUT_DIR)\tclsh$(TCL_VERSION)$(DBGX).exe" XOTCLSTUBLIB = "$(XOTCL_DIR)\win\Release\libxotclstub$(XOTCL_VERSION).lib" XOTCLIMPLIB = "$(XOTCL_DIR)\win\$(OUT_DIR)\libxotcl$(XOTCL_VERSION)$(DBGX).lib" LIB_INSTALL_DIR = $(INSTALLDIR)\lib BIN_INSTALL_DIR = $(INSTALLDIR)\bin SCRIPT_INSTALL_DIR = $(INSTALLDIR)\lib\xotcl$(XOTCL_VERSION) INCLUDE_INSTALL_DIR = $(INSTALLDIR)\include OBJS = $(TMP_DIR)\hash.obj \ $(TMP_DIR)\pair.obj \ $(TMP_DIR)\sdbm.obj \ $(TMP_DIR)\xotclsdbm.obj \ !if $(STATIC_BUILD) == 0 $(TMP_DIR)\dllEntryPoint.obj !endif ###################################################################### # Link flags ###################################################################### !if $(DEBUG) ldebug = -debug:full -debugtype:cv -pdb:none !else ldebug = -release -opt:ref !endif # declarations common to all linker options lcommon = -nologo -link50compat -machine:$(MACHINE) LFLAGS = $(lcommon) -subsystem:windows -dll !if $(USE_TCL_STUBS) == 0 LLIBS = $(TCLIMPLIB) $(XOTCLIMPLIB) !else ### should be: ### LLIBS = $(TCLSTUBLIB) $(XOTCLSTUBLIB) when xotcl stub lib is mature ### LLIBS = $(TCLSTUBLIB) $(XOTCLIMPLIB) LLIBS = $(TCLSTUBLIB) $(XOTCLSTUBLIB) !endif ###################################################################### # Compile flags ###################################################################### !IF $(DEBUG) == 0 !IF "$(MACHINE)" == "ALPHA" # MSVC on Alpha doesn't understand -Ot cdebug = -O2i !ELSE cdebug = -Ox !ENDIF !ELSE !if $(MSDEV_VER) < 6 cdebug = -Zi -Od -WX !else cdebug = -ZI -Od -WX !endif !ENDIF !if $(STATIC_BUILD) cdll = !else cdll = -GD !endif # declarations common to all compiler options ccommon = -nologo -c -W3 -YX \ !if $(STATIC_BUILD) && $(NOMSVCRT) crt = -MT$(DBGX) !else crt = -MD$(DBGX) !endif INCLUDES = -I"$(TCLROOT)\generic" -I"$(XOTCL_DIR)\generic" DEFINES = -DBUILD_$(NAME) -DTCL_THREADS=1 \ -DXOLIBPKG=$(INST_XOLIBPKG) \ -DXOTCLVERSION=$(XOTCLVERSION) \ -DPACKAGE_VERSION=$(XOTCLVERSION) \ -DVERSION=$(XOTCLVERSION) \ -DXOTCLPATCHLEVEL=$(XOTCLPATCHLEVEL) \ -D__WIN32__ -DVISUAL_CC EXE_CFLAGS = $(ccommon) $(cdebug) $(crt) $(cdll) $(INCLUDES) $(DEFINES) !if $(USE_TCL_STUBS) #CFLAGS = $(EXE_CFLAGS) -DUSE_TCL_STUBS CFLAGS = $(EXE_CFLAGS) -DUSE_TCL_STUBS -DUSE_XOTCL_STUBS !else CFLAGS = $(EXE_CFLAGS) !endif ###################################################################### # Project specific targets ###################################################################### all : libs ./pkgIndex.tcl libs : setup $(TARGET) copy $(TARGET) .. setup : @$(vcvars) > nul @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) &\ echo Created directory '$(TMP_DIR)' @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) &\ echo Created directory '$(OUT_DIR)' $(TARGET) : $(OBJS) !if $(STATIC_BUILD) $(lib32) -nologo -machine:$(MACHINE) -out:$@ @<< !else $(link32) $(LFLAGS) -base:@$(XOTCL_DIR)\win\dllBase.txt,$@ -out:$@ $(LLIBS) @<< !endif $(OBJS) << ./pkgIndex.tcl : $(TARGET) echo package ifneeded xotcl::store::sdbm $(XOTCL_VERSION) [list load [file join $$dir $(TMPNAME)/$(OUTNAME).dll]] > \ ".\pkgIndex.tcl" install : all if not exist "$(INSTALLDIR)" mkdir "$(INSTALLDIR)" if not exist "$(BIN_INSTALL_DIR)" mkdir "$(BIN_INSTALL_DIR)" if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)" if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" if not exist "$(INCLUDE_INSTALL_DIR)" mkdir "$(INCLUDE_INSTALL_DIR)" copy $(TARGET) "$(SCRIPT_INSTALL_DIR)" ###################################################################### # Inference rules. Use batch-mode when supported. ###################################################################### !if $(_NMAKE_VER) < 162 {$(WINDIR)}.c{$(TMP_DIR)}.obj : !else {$(WINDIR)}.c{$(TMP_DIR)}.obj :: !endif $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$(TMP_DIR)\ @<< $< << !if $(_NMAKE_VER) < 162 {$(GENERICDIR)}.c{$(TMP_DIR)}.obj : !else {$(GENERICDIR)}.c{$(TMP_DIR)}.obj :: !endif $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$(TMP_DIR)\ @<< $< << #{$(RCDIR)}.rc{$(TMP_DIR)}.res : # $(rc32) -fo $@ -DDEBUG=$(DEBUG) $(XOTCL_VERSION_DEFINES) $(XOTCL_INCLUDES) $(TCL_INCLUDES) $(XOTCL_DEFINES) $< ###################################################################### # Clean up ###################################################################### tidy : -del $(TMP_DIR)\*.pch -del $(TMP_DIR)\*.obj -del $(TMP_DIR)\*.res -del .\*.pch -del .\*.pdb clean : tidy -del $(OUT_DIR)\*.exp -del $(OUT_DIR)\*.lib -del $(OUT_DIR)\*.dll -del $(OUT_DIR)\*.tcl -del ..\*.exp -del ..\*.lib -del ..\*.dll distclean : clean -rmdir $(OUT_DIR) -rmdir $(TMP_DIR) ./xotcl-1.6.8/library/store/XOTclSdbm/._pair.c000644 000765 000024 00000000430 12161600406 021524 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/pair.c000644 000765 000024 00000013160 12161600406 021313 0ustar00neumannstaff000000 000000 /* * sdbm - ndbm work-alike hashed database library * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978). * author: oz@nexus.yorku.ca * status: public domain. * * page-level routines */ #include "sdbm.h" #include "tune.h" #include "pair.h" #include #include #define exhash(item) sdbm_hash((item).dptr, (item).dsize) /* * forward */ static int seepair proto((char *, int, char *, size_t)); /* * page format: * +------------------------------+ * ino | n | keyoff | datoff | keyoff | * +------------+--------+--------+ * | datoff | - - - ----> | * +--------+---------------------+ * | F R E E A R E A | * +--------------+---------------+ * | <---- - - - | data | * +--------+-----+----+----------+ * | key | data | key | * +--------+----------+----------+ * * calculating the offsets for free area: if the number * of entries (ino[0]) is zero, the offset to the END of * the free area is the block size. Otherwise, it is the * nth (ino[ino[0]]) entry's offset. */ int fitpair(pag, need) char *pag; int need; { register int n; register int off; register int free_space; /* this cast "increases the alignment". Its not the only one, though.*/ register short *ino = (short *) pag; off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ; free_space = off - (n + 1) * sizeof(short); need += 2 * sizeof(short); debug(("free %d need %d\n", free_space, need)); return need <= free_space; } void putpair(pag, key, val) char *pag; datum key; datum val; { register int n; register int off; register short *ino = (short *) pag; off = ((n = ino[0]) > 0) ? ino[n] : PBLKSIZ; /* * enter the key first */ off -= key.dsize; (void) memcpy(pag + off, key.dptr, key.dsize); ino[n + 1] = off; /* * now the data */ off -= val.dsize; (void) memcpy(pag + off, val.dptr, val.dsize); ino[n + 2] = off; /* * adjust item count */ ino[0] += 2; } datum getpair(pag, key) char *pag; datum key; { register int i; register int n; datum val; register short *ino = (short *) pag; if ((n = ino[0]) == 0) return nullitem; if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0) return nullitem; val.dptr = pag + ino[i + 1]; val.dsize = ino[i] - ino[i + 1]; return val; } #ifdef SEEDUPS int duppair(pag, key) char *pag; datum key; { register short *ino = (short *) pag; return ino[0] > 0 && seepair(pag, ino[0], key.dptr, key.dsize) > 0; } #endif datum getnkey(pag, num) char *pag; int num; { datum key; register int off; register short *ino = (short *) pag; num = num * 2 - 1; if (ino[0] == 0 || num > ino[0]) return nullitem; off = (num > 1) ? ino[num - 1] : PBLKSIZ; key.dptr = pag + ino[num]; key.dsize = off - ino[num]; return key; } int delpair(pag, key) char *pag; datum key; { register int n; register int i; register short *ino = (short *) pag; if ((n = ino[0]) == 0) return 0; if ((i = seepair(pag, n, key.dptr, key.dsize)) == 0) return 0; /* * found the key. if it is the last entry * [i.e. i == n - 1] we just adjust the entry count. * hard case: move all data down onto the deleted pair, * shift offsets onto deleted offsets, and adjust them. * [note: 0 < i < n] */ if (i < n - 1) { register int m; register char *dst = pag + (i == 1 ? PBLKSIZ : ino[i - 1]); register char *src = pag + ino[i + 1]; register int zoo = dst - src; debug(("free-up %d ", zoo)); /* * shift data/keys down */ m = ino[i + 1] - ino[n]; #ifdef DUFF #define MOVB *--dst = *--src if (m > 0) { register int loop = (m + 8 - 1) >> 3; switch (m & (8 - 1)) { case 0: do { MOVB; case 7: MOVB; case 6: MOVB; case 5: MOVB; case 4: MOVB; case 3: MOVB; case 2: MOVB; case 1: MOVB; } while (--loop); } } #else #ifdef MEMMOVE memmove(dst, src, m); #else while (m--) *--dst = *--src; #endif #endif /* * adjust offset index up */ while (i < n - 1) { ino[i] = ino[i + 2] + zoo; i++; } } ino[0] -= 2; return 1; } /* * search for the key in the page. * return offset index in the range 0 < i < n. * return 0 if not found. */ static int seepair(pag, n, key, siz) char *pag; register int n; register char *key; register size_t siz; { register int i; register int off = PBLKSIZ; register short *ino = (short *) pag; for (i = 1; i < n; i += 2) { if ((int)siz == off - ino[i] && memcmp(key, pag + ino[i], siz) == 0) return i; off = ino[i + 1]; } return 0; } void splpage(pag, new, sbit) char *pag; char *new; long sbit; { datum key; datum val; register int n; register int off = PBLKSIZ; char cur[PBLKSIZ]; register short *ino = (short *) cur; (void) memcpy(cur, pag, PBLKSIZ); (void) memset(pag, 0, PBLKSIZ); (void) memset(new, 0, PBLKSIZ); n = ino[0]; for (ino++; n > 0; ino += 2) { key.dptr = cur + ino[0]; key.dsize = off - ino[0]; val.dptr = cur + ino[1]; val.dsize = ino[0] - ino[1]; /* * select the page pointer (by looking at sbit) and insert */ (void) putpair((exhash(key) & sbit) ? new : pag, key, val); off = ino[1]; n -= 2; } debug(("%d split %d/%d\n", ((short *) cur)[0] / 2, ((short *) new)[0] / 2, ((short *) pag)[0] / 2)); } /* * check page sanity: * number of entries should be something * reasonable, and all offsets in the index should be in order. * this could be made more rigorous. */ int chkpage(pag) char *pag; { register int n; register int off; register short *ino = (short *) pag; if ((n = ino[0]) < 0 || n > PBLKSIZ / sizeof(short)) return 0; if (n > 0) { off = PBLKSIZ; for (ino++; n > 0; ino += 2) { if (ino[0] > off || ino[1] > off || ino[1] > ino[0]) return 0; off = ino[1]; n -= 2; } } return 1; } ./xotcl-1.6.8/library/store/XOTclSdbm/._pair.h000644 000765 000024 00000000430 12161600406 021531 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/pair.h000644 000765 000024 00000000572 12161600406 021323 0ustar00neumannstaff000000 000000 extern int fitpair proto((char *, int)); extern void putpair proto((char *, datum, datum)); extern datum getpair proto((char *, datum)); extern int delpair proto((char *, datum)); extern int chkpage proto((char *)); extern datum getnkey proto((char *, int)); extern void splpage proto((char *, char *, long)); #ifdef SEEDUPS extern int duppair proto((char *, datum)); #endif ./xotcl-1.6.8/library/store/XOTclSdbm/._sdbm.c000644 000765 000024 00000000430 12161600406 021516 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/sdbm.c000644 000765 000024 00000025702 12161600406 021312 0ustar00neumannstaff000000 000000 /* * sdbm - ndbm work-alike hashed database library * based on Per-Aake Larson's Dynamic Hashing algorithms. BIT 18 (1978). * author: oz@nexus.yorku.ca * status: public domain. * * core routines */ #include "sdbm.h" #include "tune.h" #include "pair.h" #ifdef HAVE_UNISTD_H #include #endif #include #ifdef HAVE_MEMORY_H #include #endif #include #include #include #include #include #ifdef HAVE_SYS_FILE_H # include #endif #ifdef _WIN32 # define HAVE_FCNTL_H # include #endif /* #ifdef HAVE_FCNTL_H */ # include /* #endif */ #ifdef __STDC__ #include #endif #ifndef NULL #define NULL 0 #endif /* * externals */ #ifndef _WIN32 #ifndef HAVE_UNISTD_H extern long lseek(); #endif #endif /* * forward */ static int getdbit proto((DBM *, long)); static int setdbit proto((DBM *, long)); static int getpage proto((DBM *, long)); static datum getnext proto((DBM *)); static int makroom proto((DBM *, long, int)); /* * useful macros */ #define bad(x) ((x).dptr == NULL || (x).dsize <= 0) #define exhash(item) sdbm_hash((item).dptr, (item).dsize) #define ioerr(db) ((db)->flags |= SDBM_IOERR) #define OFF_PAG(off) (long) (off) * PBLKSIZ #define OFF_DIR(off) (long) (off) * DBLKSIZ static long masks[] = { 000000000000, 000000000001, 000000000003, 000000000007, 000000000017, 000000000037, 000000000077, 000000000177, 000000000377, 000000000777, 000000001777, 000000003777, 000000007777, 000000017777, 000000037777, 000000077777, 000000177777, 000000377777, 000000777777, 000001777777, 000003777777, 000007777777, 000017777777, 000037777777, 000077777777, 000177777777, 000377777777, 000777777777, 001777777777, 003777777777, 007777777777, 017777777777 }; datum nullitem = {NULL, 0}; DBM * sdbm_open(file, flags, mode) register char *file; register int flags; register int mode; { register DBM *db; register char *dirname; register char *pagname; register int n; if (file == NULL || !*file) return errno = EINVAL, (DBM *) NULL; /* * need space for two seperate filenames */ n = strlen(file) * 2 + strlen(DIRFEXT) + strlen(PAGFEXT) + 2; if ((dirname = malloc((unsigned) n)) == NULL) return errno = ENOMEM, (DBM *) NULL; /* * build the file names */ strcpy(dirname, file); dirname = strcat(dirname, DIRFEXT); pagname = strcpy(dirname + strlen(dirname) + 1, file); pagname = strcat(pagname, PAGFEXT); db = sdbm_prep(dirname, pagname, flags, mode); free((char *) dirname); return db; } DBM * sdbm_prep(dirname, pagname, flags, mode) char *dirname; char *pagname; int flags; int mode; { register DBM *db; struct stat dstat; if ((db = (DBM *) malloc(sizeof(DBM))) == NULL) return errno = ENOMEM, (DBM *) NULL; db->flags = 0; db->hmask = 0; db->blkptr = 0; db->keyptr = 0; /* * adjust user flags so that WRONLY becomes RDWR, * as required by this package. Also set our internal * flag for RDONLY if needed. */ if (flags & O_WRONLY) flags = (flags & ~O_WRONLY) | O_RDWR; else if ((flags & 03) == O_RDONLY) db->flags = SDBM_RDONLY; #ifdef O_BINARY /* GO32 / DOS-Braindamage */ flags |= O_BINARY; #endif /* * open the files in sequence, and stat the dirfile. * If we fail anywhere, undo everything, return NULL. */ if ((db->pagf = open(pagname, flags, mode)) > -1) { if ((db->dirf = open(dirname, flags, mode)) > -1) { /* * need the dirfile size to establish max bit number. */ if (fstat(db->dirf, &dstat) == 0) { /* * zero size: either a fresh database, or one with a single, * unsplit data page: dirpage is all zeros. */ db->dirbno = (!dstat.st_size) ? 0 : -1; db->pagbno = -1; db->maxbno = dstat.st_size * BYTESIZ; (void) memset(db->pagbuf, 0, PBLKSIZ); (void) memset(db->dirbuf, 0, DBLKSIZ); /* * success */ return db; } (void) close(db->dirf); } (void) close(db->pagf); } free((char *) db); return (DBM *) NULL; } void sdbm_close(db) register DBM *db; { if (db == NULL) errno = EINVAL; else { (void) close(db->dirf); (void) close(db->pagf); free((char *) db); } } datum sdbm_fetch(db, key) register DBM *db; datum key; { if (db == NULL || bad(key)) return errno = EINVAL, nullitem; if (getpage(db, exhash(key))) return getpair(db->pagbuf, key); return ioerr(db), nullitem; } int sdbm_delete(db, key) register DBM *db; datum key; { if (db == NULL || bad(key)) return errno = EINVAL, -1; if (sdbm_rdonly(db)) return errno = EPERM, -1; if (getpage(db, exhash(key))) { if (!delpair(db->pagbuf, key)) return -1; /* * update the page file */ if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) return ioerr(db), -1; return 0; } return ioerr(db), -1; } int sdbm_store(db, key, val, flags) register DBM *db; datum key; datum val; int flags; { int need; register long hash; if (db == NULL || bad(key)) return errno = EINVAL, -1; if (sdbm_rdonly(db)) return errno = EPERM, -1; need = key.dsize + val.dsize; /* * is the pair too big (or too small) for this database ?? */ if (need < 0 || need > PAIRMAX) return errno = EINVAL, -1; if (getpage(db, (hash = exhash(key)))) { /* * if we need to replace, delete the key/data pair * first. If it is not there, ignore. */ if (flags == SDBM_REPLACE) (void) delpair(db->pagbuf, key); #ifdef SEEDUPS else if (duppair(db->pagbuf, key)) return 1; #endif /* * if we do not have enough room, we have to split. */ if (!fitpair(db->pagbuf, need)) if (!makroom(db, hash, need)) return ioerr(db), -1; /* * we have enough room or split is successful. insert the key, * and update the page file. */ (void) putpair(db->pagbuf, key, val); if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) return ioerr(db), -1; /* * success */ return 0; } return ioerr(db), -1; } /* * makroom - make room by splitting the overfull page * this routine will attempt to make room for SPLTMAX times before * giving up. */ static int makroom(db, hash, need) register DBM *db; long hash; int need; { long newp; char twin[PBLKSIZ]; char *pag = db->pagbuf; char *new = twin; register int smax = SPLTMAX; do { /* * split the current page */ (void) splpage(pag, new, db->hmask + 1); /* * address of the new page */ newp = (hash & db->hmask) | (db->hmask + 1); /* * write delay, read avoidence/cache shuffle: * select the page for incoming pair: if key is to go to the new page, * write out the previous one, and copy the new one over, thus making * it the current page. If not, simply write the new page, and we are * still looking at the page of interest. current page is not updated * here, as sdbm_store will do so, after it inserts the incoming pair. */ if (hash & (db->hmask + 1)) { if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) return 0; db->pagbno = newp; (void) memcpy(pag, new, PBLKSIZ); } else if (lseek(db->pagf, OFF_PAG(newp), SEEK_SET) < 0 || write(db->pagf, new, PBLKSIZ) < 0) return 0; if (!setdbit(db, db->curbit)) return 0; /* * see if we have enough room now */ if (fitpair(pag, need)) return 1; /* * try again... update curbit and hmask as getpage would have * done. because of our update of the current page, we do not * need to read in anything. BUT we have to write the current * [deferred] page out, as the window of failure is too great. */ db->curbit = 2 * db->curbit + ((hash & (db->hmask + 1)) ? 2 : 1); db->hmask |= db->hmask + 1; if (lseek(db->pagf, OFF_PAG(db->pagbno), SEEK_SET) < 0 || write(db->pagf, db->pagbuf, PBLKSIZ) < 0) return 0; } while (--smax); /* * if we are here, this is real bad news. After SPLTMAX splits, * we still cannot fit the key. say goodnight. */ #ifdef BADMESS (void) write(2, "sdbm: cannot insert after SPLTMAX attempts.\n", 44); #endif return 0; } /* * the following two routines will break if * deletions aren't taken into account. (ndbm bug) */ datum sdbm_firstkey(db) register DBM *db; { if (db == NULL) return errno = EINVAL, nullitem; /* * start at page 0 */ if (lseek(db->pagf, OFF_PAG(0), SEEK_SET) < 0 || read(db->pagf, db->pagbuf, PBLKSIZ) < 0) return ioerr(db), nullitem; db->pagbno = 0; db->blkptr = 0; db->keyptr = 0; return getnext(db); } datum sdbm_nextkey(db) register DBM *db; { if (db == NULL) return errno = EINVAL, nullitem; return getnext(db); } /* * all important binary trie traversal */ static int getpage(db, hash) register DBM *db; register long hash; { register int hbit; register long dbit; register long pagb; dbit = 0; hbit = 0; while (dbit < db->maxbno && getdbit(db, dbit)) dbit = 2 * dbit + ((hash & (1 << hbit++)) ? 2 : 1); debug(("dbit: %d...", dbit)); db->curbit = dbit; db->hmask = masks[hbit]; pagb = hash & db->hmask; /* * see if the block we need is already in memory. * note: this lookaside cache has about 10% hit rate. */ if (pagb != db->pagbno) { /* * note: here, we assume a "hole" is read as 0s. * if not, must zero pagbuf first. */ if (lseek(db->pagf, OFF_PAG(pagb), SEEK_SET) < 0 || read(db->pagf, db->pagbuf, PBLKSIZ) < 0) return 0; if (!chkpage(db->pagbuf)) return 0; db->pagbno = pagb; debug(("pag read: %d\n", pagb)); } return 1; } static int getdbit(db, dbit) register DBM *db; register long dbit; { register long c; register long dirb; c = dbit / BYTESIZ; dirb = c / DBLKSIZ; if (dirb != db->dirbno) { if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0 || read(db->dirf, db->dirbuf, DBLKSIZ) < 0) return 0; db->dirbno = dirb; debug(("dir read: %d\n", dirb)); } return db->dirbuf[c % DBLKSIZ] & (1 << dbit % BYTESIZ); } static int setdbit(db, dbit) register DBM *db; register long dbit; { register long c; register long dirb; c = dbit / BYTESIZ; dirb = c / DBLKSIZ; if (dirb != db->dirbno) { if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0 || read(db->dirf, db->dirbuf, DBLKSIZ) < 0) return 0; db->dirbno = dirb; debug(("dir read: %d\n", dirb)); } db->dirbuf[c % DBLKSIZ] |= (1 << dbit % BYTESIZ); if (dbit >= db->maxbno) db->maxbno += DBLKSIZ * BYTESIZ; if (lseek(db->dirf, OFF_DIR(dirb), SEEK_SET) < 0 || write(db->dirf, db->dirbuf, DBLKSIZ) < 0) return 0; return 1; } /* * getnext - get the next key in the page, and if done with * the page, try the next page in sequence */ static datum getnext(db) register DBM *db; { datum key; for (;;) { db->keyptr++; key = getnkey(db->pagbuf, db->keyptr); if (key.dptr != NULL) return key; /* * we either run out, or there is nothing on this page.. * try the next one... If we lost our position on the * file, we will have to seek. */ db->keyptr = 0; if (db->pagbno != db->blkptr++) if (lseek(db->pagf, OFF_PAG(db->blkptr), SEEK_SET) < 0) break; db->pagbno = db->blkptr; if (read(db->pagf, db->pagbuf, PBLKSIZ) <= 0) break; if (!chkpage(db->pagbuf)) break; } return ioerr(db), nullitem; } ./xotcl-1.6.8/library/store/XOTclSdbm/._sdbm.h000644 000765 000024 00000000430 12161600406 021523 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/sdbm.h000644 000765 000024 00000004547 12161600406 021323 0ustar00neumannstaff000000 000000 /* * sdbm - ndbm work-alike hashed database library * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978). * author: oz@nexus.yorku.ca * status: public domain. */ #ifndef VISUAL_CC #include #endif #define DBLKSIZ 4096 #define PBLKSIZ 1024 #define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */ #define SPLTMAX 10 /* maximum allowed splits */ /* for a single insertion */ #define DIRFEXT ".dir" #define PAGFEXT ".pag" typedef struct { int dirf; /* directory file descriptor */ int pagf; /* page file descriptor */ int flags; /* status/error flags, see below */ long maxbno; /* size of dirfile in bits */ long curbit; /* current bit number */ long hmask; /* current hash mask */ long blkptr; /* current block for nextkey */ int keyptr; /* current key for nextkey */ long blkno; /* current page to read/write */ long pagbno; /* current page in pagbuf */ char pagbuf[PBLKSIZ]; /* page file block buffer */ long dirbno; /* current block in dirbuf */ char dirbuf[DBLKSIZ]; /* directory file block buffer */ } DBM; #define SDBM_RDONLY 0x1 /* data base open read-only */ #define SDBM_IOERR 0x2 /* data base I/O error */ /* * utility macros */ #define sdbm_rdonly(db) ((db)->flags & SDBM_RDONLY) #define sdbm_error(db) ((db)->flags & SDBM_IOERR) #define sdbm_clearerr(db) ((db)->flags &= ~SDBM_IOERR) /* ouch */ #define sdbm_dirfno(db) ((db)->dirf) #define sdbm_pagfno(db) ((db)->pagf) #ifdef VISUAL_CC typedef struct { char *dptr; int dsize; } datum; #else typedef struct { char *dptr; size_t dsize; } datum; #endif extern datum nullitem; #ifdef __STDC__ #define proto(p) p #else #define proto(p) () #endif /* * flags to sdbm_store */ #define SDBM_INSERT 0 #define SDBM_REPLACE 1 /* * ndbm interface */ extern DBM *sdbm_open proto((char *, int, int)); extern void sdbm_close proto((DBM *)); extern datum sdbm_fetch proto((DBM *, datum)); extern int sdbm_delete proto((DBM *, datum)); extern int sdbm_store proto((DBM *, datum, datum, int)); extern datum sdbm_firstkey proto((DBM *)); extern datum sdbm_nextkey proto((DBM *)); /* * other */ extern DBM *sdbm_prep proto((char *, char *, int, int)); #ifdef VISUAL_CC extern long sdbm_hash proto((char *, int)); #else extern long sdbm_hash proto((char *, size_t)); #endif ./xotcl-1.6.8/library/store/XOTclSdbm/._tcl.m4000644 000765 000024 00000000521 12326520402 021452 0ustar00neumannstaff000000 000000 Mac OS X  2QATTRQ¸™¸€com.apple.acl.text8com.apple.quarantine!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity q/0001;5341449d;Firefox;./xotcl-1.6.8/library/store/XOTclSdbm/tcl.m4000644 000765 000024 00000405647 12326520402 021257 0ustar00neumannstaff000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef _WIN32 #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) INSTALL_DATA="\${INSTALL} -m 644" AC_SUBST(INSTALL_DATA) INSTALL_PROGRAM="\${INSTALL}" AC_SUBST(INSTALL_PROGRAM) INSTALL_SCRIPT="\${INSTALL}" AC_SUBST(INSTALL_SCRIPT) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ./xotcl-1.6.8/library/store/XOTclSdbm/tclconfig/._install-sh000755 000765 000024 00000000430 12327657637 024427 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/tclconfig/install-sh000755 000765 000024 00000033054 12327657637 024222 0ustar00neumannstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -S $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ./xotcl-1.6.8/library/store/XOTclSdbm/._tune.h000644 000765 000024 00000000430 12161600406 021551 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/tune.h000644 000765 000024 00000001231 12161600406 021334 0ustar00neumannstaff000000 000000 /* * sdbm - ndbm work-alike hashed database library * tuning and portability constructs [not nearly enough] * author: oz@nexus.yorku.ca */ #define BYTESIZ 8 #ifdef SVID #include #endif #ifdef BSD42 #define SEEK_SET L_SET #define memset(s,c,n) bzero(s, n) /* only when c is zero */ #define memcpy(s1,s2,n) bcopy(s2, s1, n) #define memcmp(s1,s2,n) bcmp(s1,s2,n) #endif /* * important tuning parms (hah) */ #define SEEDUPS /* always detect duplicates */ #define BADMESS /* generate a message for worst case: cannot make room after SPLTMAX splits */ /* * misc */ #ifdef DEBUG #define debug(x) printf x #else #define debug(x) #endif ./xotcl-1.6.8/library/store/XOTclSdbm/._util.c000644 000765 000024 00000000430 12161600406 021546 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/util.c000644 000765 000024 00000012036 12161600406 021336 0ustar00neumannstaff000000 000000 #include "config.h" #include #include #include "sdbm.h" #ifdef HAVE_SYS_FILE_H #include #endif #ifdef HAVE_UNISTD_H #include #endif #include extern int errno; void oops(s1, s2) register char *s1; register char *s2; { #ifndef HAVE_STRERROR extern int sys_nerr; extern char *sys_errlist[]; #endif extern char *progname; if (progname) fprintf(stderr, "%s: ", progname); fprintf(stderr, s1, s2); #ifndef HAVE_STRERROR if (errno > 0 && errno < sys_nerr) fprintf(stderr, " (%s)", sys_errlist[errno]); #else if (errno > 0) fprintf(stderr, " (%s)", strerror(errno)); #endif fprintf(stderr, "\n"); exit(1); } int okpage(char *pag) { register unsigned n; register off; register short *ino = (short *) pag; if ((n = ino[0]) > PBLKSIZ / sizeof(short)) return 0; if (!n) return 1; off = PBLKSIZ; for (ino++; n; ino += 2) { if (ino[0] > off || ino[1] > off || ino[1] > ino[0]) return 0; off = ino[1]; n -= 2; } return 1; } /***************************************************************************\ ** ** ** Function name: getopt() ** ** Author: Henry Spencer, UofT ** ** Coding date: 84/04/28 ** ** ** ** Description: ** ** ** ** Parses argv[] for arguments. ** ** Works with Whitesmith's C compiler. ** ** ** ** Inputs - The number of arguments ** ** - The base address of the array of arguments ** ** - A string listing the valid options (':' indicates an ** ** argument to the preceding option is required, a ';' ** ** indicates an argument to the preceding option is optional) ** ** ** ** Outputs - Returns the next option character, ** ** '?' for non '-' arguments ** ** or ':' when there is no more arguments. ** ** ** ** Side Effects + The argument to an option is pointed to by 'optarg' ** ** ** ***************************************************************************** ** ** ** REVISION HISTORY: ** ** ** ** DATE NAME DESCRIPTION ** ** YY/MM/DD ------------------ ------------------------------------ ** ** 88/10/20 Janick Bergeron Returns '?' on unamed arguments ** ** returns '!' on unknown options ** ** and 'EOF' only when exhausted. ** ** 88/11/18 Janick Bergeron Return ':' when no more arguments ** ** 89/08/11 Janick Bergeron Optional optarg when ';' in optstring ** ** ** \***************************************************************************/ char *optarg; /* Global argument pointer. */ #ifdef VMS #define index strchr #endif #ifndef HAVE_GETOPT char getopt(argc, argv, optstring) int argc; char **argv; char *optstring; { register int c; register char *place; extern char *index(); static int optind = 0; static char *scan = NULL; optarg = NULL; if (scan == NULL || *scan == '\0') { if (optind == 0) optind++; if (optind >= argc) return ':'; optarg = place = argv[optind++]; if (place[0] != '-' || place[1] == '\0') return '?'; if (place[1] == '-' && place[2] == '\0') return '?'; scan = place + 1; } c = *scan++; place = index(optstring, c); if (place == NULL || c == ':' || c == ';') { (void) fprintf(stderr, "%s: unknown option %c\n", argv[0], c); scan = NULL; return '!'; } if (*++place == ':') { if (*scan != '\0') { optarg = scan; scan = NULL; } else { if (optind >= argc) { (void) fprintf(stderr, "%s: %c requires an argument\n", argv[0], c); return '!'; } optarg = argv[optind]; optind++; } } else if (*place == ';') { if (*scan != '\0') { optarg = scan; scan = NULL; } else { if (optind >= argc || *argv[optind] == '-') optarg = NULL; else { optarg = argv[optind]; optind++; } } } return c; } #endif ./xotcl-1.6.8/library/store/XOTclSdbm/._xotcl.m4000644 000765 000024 00000000430 12161600406 022020 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/xotcl.m4000644 000765 000024 00000007512 12161600406 021613 0ustar00neumannstaff000000 000000 # xotcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999 Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #------------------------------------------------------------------------ # SC_PATH_XOTCLCONFIG -- # # Locate the xotclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-xotcl=... # # Defines the following vars: # XOTCL_BIN_DIR Full path to the directory containing # the xotclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN(SC_PATH_XOTCLCONFIG, [ # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_xotcl}" = x ; then # we reset no_xotcl in case something fails here no_xotcl=true AC_ARG_WITH(xotcl, [ --with-xotcl directory containing xotcl configuration (xotclConfig.sh)], with_xotclconfig=${withval}) AC_MSG_CHECKING([for XOTcl configuration]) AC_CACHE_VAL(ac_cv_c_xotclconfig,[ # First check to see if --with-xotcl was specified. if test x"${with_xotclconfig}" != x ; then if test -f "${with_xotclconfig}/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd ${with_xotclconfig}; pwd)` else AC_MSG_ERROR([${with_xotclconfig} directory doesn't contain xotclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_xotclconfig}" = x ; then for i in \ ${srcdir}/../xotcl \ `ls -dr ${srcdir}/../xotcl-* 2>/dev/null` \ ${srcdir}/../../xotcl \ `ls -dr ${srcdir}/../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../xotcl \ `ls -dr ${srcdir}/../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../xotcl \ `ls -dr ${srcdir}/../../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../../xotcl \ `ls -dr ${srcdir}/../../../../../xotcl-* 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_xotclconfig}" = x ; then for i in `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_xotclconfig}" = x ; then XOTCL_BIN_DIR="# no XOTcl configs found" AC_MSG_WARN(Can't find XOTcl configuration definitions) exit 0 else no_xotcl= XOTCL_BIN_DIR=${ac_cv_c_xotclconfig} AC_MSG_RESULT(found $XOTCL_BIN_DIR/xotclConfig.sh) fi fi ]) #------------------------------------------------------------------------ # SC_LOAD_XOTCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # XOTCL_BIN_DIR # # Results: # # Subst the vars: # #------------------------------------------------------------------------ AC_DEFUN(SC_LOAD_XOTCLCONFIG, [ AC_MSG_CHECKING([for existence of $XOTCL_BIN_DIR/xotclConfig.sh]) if test -f "$XOTCL_BIN_DIR/xotclConfig.sh" ; then AC_MSG_RESULT([loading]) . $XOTCL_BIN_DIR/xotclConfig.sh else AC_MSG_RESULT([file not found]) fi # # The eval is required to do the TCL_DBGX substitution in the # TCL_LIB_FILE variable # AC_SUBST(XOTCL_VERSION) AC_SUBST(XOTCL_MAJOR_VERSION) AC_SUBST(XOTCL_MINOR_VERSION) AC_SUBST(XOTCL_RELEASE_LEVEL) AC_SUBST(XOTCL_LIB_FILE) AC_SUBST(XOTCL_BUILD_LIB_SPEC) AC_SUBST(XOTCL_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_FILE) AC_SUBST(XOTCL_BUILD_STUB_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_SPEC) AC_SUBST(XOTCL_SRC_DIR) ]) ./xotcl-1.6.8/library/store/XOTclSdbm/._xotclsdbm.c000644 000765 000024 00000000430 12161600406 022570 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/store/XOTclSdbm/xotclsdbm.c000644 000765 000024 00000025054 12161600406 022364 0ustar00neumannstaff000000 000000 /* * xotclsdbm.c * * based on Tclndbm 0.5 by John Ellson (ellson@lucent.com) */ #include #include #include "sdbm.h" #include #include #if (TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<1) # define TclObjStr(obj) Tcl_GetStringFromObj(obj, ((int*)NULL)) #else # define TclObjStr(obj) Tcl_GetString(obj) #endif /* * a database .. */ typedef struct db_s { int mode; DBM *db; } db_t ; static int XOTclSdbmOpenMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { int mode; db_t *db; XOTcl_Object* obj = (XOTcl_Object *) cd; /* int i; fprintf(stderr, "Method=XOTclSdbmOpenMethod\n"); for (i=0; i< objc; i++) fprintf(stderr, " objv[%d]=%s\n",i,TclObjStr(objv[i])); */ if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 2) return XOTclObjErrArgCnt(in, obj->cmdName, "open filename"); /* * check mode string if given * mode = O_RDONLY ; if (argc == 3) { if (strcmp(argv[2],"r")==0) mode = O_RDONLY ; else if (strcmp(argv[2],"rw")==0) mode = O_RDWR | O_SYNC ; else if (strcmp(argv[2],"rwc")==0) mode = O_CREAT | O_RDWR | O_SYNC ; else if (strcmp(argv[2],"rwn")==0) mode = O_CREAT | O_EXCL | O_RDWR | O_SYNC ; else { sprintf(buf, BAD_MODE, argv[0], argv[2]); Tcl_AppendResult (interp,buf,(char *)0); return (TCL_ERROR); } } */ /* Storage interface at the moment assumes mode=rwc */ #ifdef O_SYNC mode = O_CREAT | O_RDWR | O_SYNC; #else mode = O_CREAT | O_RDWR; #endif /* name not in hashtab - create new db */ if (XOTclGetObjClientData(obj)) return XOTclVarErrMsg(in, "Called open on '", TclObjStr(obj->cmdName), "', but open database was not closed before.", 0); db = (db_t*) ckalloc (sizeof(db_t)); /* * create new name and malloc space for it * malloc extra space for name db->name = (char *) malloc (strlen(buf)+1) ; if (!db->name) { perror ("malloc for name in db_open"); exit (-1); } strcpy(db->name,buf); */ db->mode = mode; db->db = sdbm_open(TclObjStr(objv[1]), mode, 0644); if (!db->db) { /* * error occurred * free previously allocated memory */ /*ckfree ((char*) db->name);*/ ckfree ((char*) db); db = (db_t*) NULL ; return XOTclVarErrMsg(in, "Open on '", TclObjStr(obj->cmdName), "' failed with '", TclObjStr(objv[1]),"'.", 0); } else { /* * success */ XOTclSetObjClientData(obj, (ClientData) db); return TCL_OK; } } static int XOTclSdbmCloseMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { db_t *db; XOTcl_Object* obj = (XOTcl_Object *) cd; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "close"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called close on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); sdbm_close (db->db); /*ckfree((char*)db->name);*/ ckfree ((char*)db); XOTclSetObjClientData(obj, 0); return TCL_OK; } static int XOTclSdbmNamesMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; Tcl_Obj *list; db_t *db; Tcl_DString result; datum key; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "names"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called names on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); Tcl_DStringInit(&result); key = sdbm_firstkey(db->db); if (!key.dptr) { /* empty db */ return TCL_OK ; } /* * copy key to result and go to next key */ list = Tcl_NewListObj(0, NULL); do { Tcl_ListObjAppendElement(in,list,Tcl_NewStringObj(key.dptr,(int)(key.dsize-1))); key = sdbm_nextkey(db->db); } while (key.dptr); Tcl_SetObjResult(in, list); return TCL_OK; } static int XOTclSdbmSetMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum key, content; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc <2 || objc > 3) return XOTclObjErrArgCnt(in, obj->cmdName, "set key ?value?"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called set on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); key.dptr = TclObjStr(objv[1]); key.dsize = objv[1]->length + 1; if (objc == 2) { /* get value */ content = sdbm_fetch(db->db,key); if (content.dptr) { /* found */ Tcl_Obj *r = Tcl_NewStringObj(content.dptr, (int)(content.dsize-1)); Tcl_SetObjResult(in, r); } else { /* key not found */ return XOTclVarErrMsg(in, "no such variable '", key.dptr, "'", 0); } } else { /* set value */ if (db->mode == O_RDONLY) { return XOTclVarErrMsg(in, "Trying to set '", TclObjStr(obj->cmdName), "', but database is in read mode.", 0); } content.dptr = TclObjStr(objv[2]); content.dsize = objv[2]->length + 1; if (sdbm_store(db->db, key, content, SDBM_REPLACE) == 0) { /*fprintf(stderr,"setting %s to '%s'\n",key.dptr,content.dptr);*/ Tcl_SetObjResult(in, objv[2]); } else { return XOTclVarErrMsg(in, "set of variable '", TclObjStr(obj->cmdName), "' failed.", 0); } } return TCL_OK; } static int XOTclSdbmExistsMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum key, content; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 2) return XOTclObjErrArgCnt(in, obj->cmdName, "exists variable"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called exists on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); key.dptr = TclObjStr(objv[1]); key.dsize = objv[1]->length + 1; content = sdbm_fetch(db->db,key); Tcl_SetIntObj(Tcl_GetObjResult(in), content.dptr != NULL); return TCL_OK; } static int XOTclSdbmUnsetMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum key; int ret; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 2) return XOTclObjErrArgCnt(in, obj->cmdName, "unset key"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called unset on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); /* check for read mode */ if (db->mode == O_RDONLY) { return XOTclVarErrMsg(in, "Called unset on '", TclObjStr(obj->cmdName), "', but database is in read mode.", 0); } key.dptr = TclObjStr(objv[1]); key.dsize = objv[1]->length + 1; ret = sdbm_delete(db->db, key); if (ret == 0) { return TCL_OK; } else { return XOTclVarErrMsg(in, "Tried to unset '", TclObjStr(objv[1]), "' but key does not exist.", 0); } } /* * ndbm_firstkey */ static int XOTclSdbmFirstKeyMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum key; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "firstkey"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called unset on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); key = sdbm_firstkey(db->db); if (!key.dptr) { /* * empty db */ return TCL_OK; } Tcl_AppendResult (in, key.dptr, (char*)0); return TCL_OK; } static int XOTclSdbmNextKeyMethod(ClientData cd, Tcl_Interp* in, int objc, Tcl_Obj* CONST objv[]) { XOTcl_Object* obj = (XOTcl_Object *) cd; db_t *db; datum newkey; if (!obj) return XOTclObjErrType(in, obj->cmdName, "Object"); if (objc != 1) return XOTclObjErrArgCnt(in, obj->cmdName, "nextkey"); db = (db_t*) XOTclGetObjClientData(obj); if (!db) return XOTclVarErrMsg(in, "Called unset on '", TclObjStr(obj->cmdName), "', but database was not opened yet.", 0); newkey = sdbm_nextkey(db->db); if (!newkey.dptr) { /* * empty db */ return TCL_OK ; } Tcl_AppendResult (in, newkey.dptr, (char*)0); return TCL_OK ; } /* * Xotclsdbm_Init * register commands, init data structures */ /* this should be done via the stubs ... for the time being simply export */ #ifdef VISUAL_CC DLLEXPORT extern int Xotclsdbm_Init(Tcl_Interp * in); #endif extern int Xotclsdbm_Init(Tcl_Interp * in) { XOTcl_Class* cl; int result; #ifdef USE_TCL_STUBS if (Tcl_InitStubs(in, "8.1", 0) == NULL) { return TCL_ERROR; } # ifdef USE_XOTCL_STUBS if (Xotcl_InitStubs(in, "1.1", 0) == NULL) { return TCL_ERROR; } # endif #else if (Tcl_PkgRequire(in, "Tcl", TCL_VERSION, 0) == NULL) { return TCL_ERROR; } #endif Tcl_PkgProvide(in, "xotcl::store::sdbm", PACKAGE_VERSION); #ifdef PACKAGE_REQUIRE_XOTCL_FROM_SLAVE_INTERP_WORKS_NOW if (Tcl_PkgRequire(in, "XOTcl", XOTCLVERSION, 0) == NULL) { return TCL_ERROR; } #endif if (Tcl_PkgRequire(in, "xotcl::store", 0, 0) == NULL) { return TCL_ERROR; } result = Tcl_VarEval (in, "::xotcl::Class create Storage=Sdbm -superclass Storage", (char *) NULL); if (result != TCL_OK) return result; /*{ Tcl_Obj *res = Tcl_GetObjResult(in); fprintf(stderr,"res='%s'\n", TclObjStr(res)); cl = XOTclGetClass(in, "Storage=Sdbm"); fprintf(stderr,"cl=%p\n",cl); }*/ cl = XOTclGetClass(in, "Storage=Sdbm"); if (!cl) { return TCL_ERROR; } XOTclAddIMethod(in, cl, "open", XOTclSdbmOpenMethod, 0, 0); XOTclAddIMethod(in, cl, "close", XOTclSdbmCloseMethod, 0, 0); XOTclAddIMethod(in, cl, "set", XOTclSdbmSetMethod, 0, 0); XOTclAddIMethod(in, cl, "exists", XOTclSdbmExistsMethod, 0, 0); XOTclAddIMethod(in, cl, "names", XOTclSdbmNamesMethod, 0, 0); XOTclAddIMethod(in, cl, "unset", XOTclSdbmUnsetMethod, 0, 0); XOTclAddIMethod(in, cl, "firstkey", XOTclSdbmFirstKeyMethod, 0, 0); XOTclAddIMethod(in, cl, "nextkey", XOTclSdbmNextKeyMethod, 0, 0); Tcl_SetIntObj(Tcl_GetObjResult(in), 1); return TCL_OK; } extern int Xotclsdbm_SafeInit(interp) Tcl_Interp *interp; { return Xotclsdbm_Init(interp); } ./xotcl-1.6.8/library/xml/._COPYRIGHT000644 000765 000024 00000000430 12327000606 017565 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/COPYRIGHT000644 000765 000024 00000003401 12327000606 017351 0ustar00neumannstaff000000 000000 * XOTcl - Extended OTcl * * Copyright (C) 1999-2014 Gustaf Neumann (a) (b) * Copyright (C) 1999-2007 Uwe Zdun (a) (b) * * (a) Vienna University of Economics and Business Administration * Dept. of Information Systems / New Media * A-1090, Augasse 2-6 * Vienna, Austria * * (b) University of Essen * Specification of Software Systems * Altendorferstraße 97-101 * D-45143 Essen, Germany * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this permission * notice appear in supporting documentation. We make no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied * warranty. * * * This software is based upon MIT Object Tcl by David Wetherall and * Christopher J. Lindblad, that contains the following copyright * message: * * "Copyright 1993 Massachusetts Institute of Technology * * Permission to use, copy, modify, distribute, and sell this * software and its documentation for any purpose is hereby granted * without fee, provided that the above copyright notice appear in * all copies and that both that copyright notice and this * permission notice appear in supporting documentation, and that * the name of M.I.T. not be used in advertising or publicity * pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about * the suitability of this software for any purpose. It is * provided "as is" without express or implied warranty." ./xotcl-1.6.8/library/xml/._pkgIndex.tcl000644 000765 000024 00000000430 12327774260 020565 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/pkgIndex.tcl000644 000765 000024 00000001572 12327774260 020360 0ustar00neumannstaff000000 000000 # Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex -direct" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded sgml 1.6 [list source [file join $dir sgml.tcl]] package ifneeded xml 1.8 [list source [file join $dir xml.tcl]] package ifneeded xotcl::xml::parser 1.0 [list source [file join $dir xoXML.xotcl]] package ifneeded xotcl::xml::printVisitor 1.0 [list source [file join $dir printVisitor.xotcl]] package ifneeded xotcl::xml::recreatorVisitor 1.0 [list source [file join $dir xmlRecreatorVisitor.xotcl]] ./xotcl-1.6.8/library/xml/._printVisitor.xotcl000644 000765 000024 00000000430 12161607064 022070 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/printVisitor.xotcl000644 000765 000024 00000001403 12161607064 021654 0ustar00neumannstaff000000 000000 package provide xotcl::xml::printVisitor 1.0 package require -exact xotcl::xml::parser 1.0 package require XOTcl 1 namespace eval ::xotcl::xml::printVisitor { namespace import ::xotcl::* ############################################################################## # # Small debugging visitor that just uses node's print method to print the # node tree # ############################################################################## Class PrintVisitor -superclass NodeTreeVisitor -parameter parser PrintVisitor instproc visit objName { puts [$objName print] } PrintVisitor instproc interpretNodeTree node { $node accept [self] } namespace export PrintVisitor } namespace import ::xotcl::xml::printVisitor::* ./xotcl-1.6.8/library/xml/._sgml.tcl000644 000765 000024 00000000430 12161600406 017740 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/sgml.tcl000644 000765 000024 00000126311 12161600406 017532 0ustar00neumannstaff000000 000000 # sgml.tcl -- # # This file provides generic parsing services for SGML-based # languages, namely HTML and XML. # # NB. It is a misnomer. There is no support for parsing # arbitrary SGML as such. # # Copyright (c) 1998,1999 Zveno Pty Ltd # http://www.zveno.com/ # # Zveno makes this software available free of charge for any purpose. # Copies may be made of this software but all of this notice must be included # on any copy. # # The software was developed for research purposes only and Zveno does not # warrant that it is error free or fit for any purpose. Zveno disclaims any # liability for all claims, expenses, losses, damages and costs any user may # incur as a result of using, copying or modifying this software. # # Copyright (c) 1997 ANU and CSIRO on behalf of the # participants in the CRC for Advanced Computational Systems ('ACSys'). # # ACSys makes this software and all associated data and documentation # ('Software') available free of charge for any purpose. You may make copies # of the Software but you must include all of this notice on any copy. # # The Software was developed for research purposes and ACSys does not warrant # that it is error free or fit for any purpose. ACSys disclaims any # liability for all claims, expenses, losses, damages and costs any user may # incur as a result of using, copying or modifying the Software. # # $Id: sgml.tcl,v 1.4 2006/09/27 08:12:40 neumann Exp $ package provide sgml 1.6 namespace eval sgml { namespace export tokenise parseEvent namespace export parseDTD # Convenience routine proc cl x { return "\[$x\]" } # Define various regular expressions # white space variable Wsp " \t\r\n" variable noWsp [cl ^$Wsp] # Various XML names variable nmtoken [cl -a-zA-Z0-9._]+ variable name [cl a-zA-Z_][cl -a-zA-Z0-9._]* # Other variable ParseEventNum if {![info exists ParseEventNum]} { set ParseEventNum 0 } variable ParseDTDnum if {![info exists ParseDTDNum]} { set ParseDTDNum 0 } # table of predefined entities for XML variable EntityPredef array set EntityPredef { lt < gt > amp & quot \" apos ' } } # sgml::tokenise -- # # Transform the given HTML/XML text into a Tcl list. # # Arguments: # sgml text to tokenize # elemExpr RE to recognise tags # elemSub transform for matched tags # args options # # Valid Options: # -final boolean True if no more data is to be supplied # -statevariable varName Name of a variable used to store info # # Results: # Returns a Tcl list representing the document. proc sgml::tokenise {sgml elemExpr elemSub args} { array set options {-final 1} catch {array set options $args} set options(-final) [Boolean $options(-final)] # If the data is not final then there must be a variable to store # unused data. if {!$options(-final) && ![info exists options(-statevariable)]} { return -code error {option "-statevariable" required if not final} } # Pre-process stage # # Extract the internal DTD subset, if any catch {upvar #0 $options(-internaldtdvariable) dtd} if {[regexp {]*$)} [lindex $sgml end] x text unused]} { set sgml [lreplace $sgml end end $text] } } else { # Performance note (Tcl 8.0): # In this case, no conversion to list object is performed regsub -all $elemExpr $sgml $elemSub sgml set sgml "{} {} {} {} \{$sgml\}" } return $sgml } # sgml::parseEvent -- # # Produces an event stream for a XML/HTML document, # given the Tcl list format returned by tokenise. # # This procedure checks that the document is well-formed, # and throws an error if the document is found to be not # well formed. Warnings are passed via the -warningcommand script. # # The procedure only check for well-formedness, # no DTD is required. However, facilities are provided for entity expansion. # # Arguments: # sgml Instance data, as a Tcl list. # args option/value pairs # # Valid Options: # -final Indicates end of document data # -elementstartcommand Called when an element starts # -elementendcommand Called when an element ends # -characterdatacommand Called when character data occurs # -entityreferencecommand Called when an entity reference occurs # -processinginstructioncommand Called when a PI occurs # -externalentityrefcommand Called for an external entity reference # # (Not compatible with expat) # -xmldeclcommand Called when the XML declaration occurs # -doctypecommand Called when the document type declaration occurs # -commentcommand Called when a comment occurs # # -errorcommand Script to evaluate for a fatal error # -warningcommand Script to evaluate for a reportable warning # -statevariable global state variable # -normalize whether to normalize names # -reportempty whether to include an indication of empty elements # # Results: # The various callback scripts are invoked. # Returns empty string. # # BUGS: # If command options are set to empty string then they should not be invoked. proc sgml::parseEvent {sgml args} { variable Wsp variable noWsp variable nmtoken variable name variable ParseEventNum array set options [list \ -elementstartcommand [namespace current]::noop \ -elementendcommand [namespace current]::noop \ -characterdatacommand [namespace current]::noop \ -processinginstructioncommand [namespace current]::noop \ -externalentityrefcommand [namespace current]::noop \ -xmldeclcommand [namespace current]::noop \ -doctypecommand [namespace current]::noop \ -commentcommand [namespace current]::noop \ -entityreferencecommand {} \ -warningcommand [namespace current]::noop \ -errorcommand [namespace current]::Error \ -final 1 \ -emptyelement [namespace current]::EmptyElement \ -parseattributelistcommand [namespace current]::noop \ -normalize 1 \ -internaldtd {} \ -reportempty 0 \ -entityvariable [namespace current]::EntityPredef \ ] catch {array set options $args} if {![info exists options(-statevariable)]} { set options(-statevariable) [namespace current]::ParseEvent[incr ParseEventNum] } upvar #0 $options(-statevariable) state upvar #0 $options(-entityvariable) entities if {![info exists state]} { # Initialise the state variable array set state { mode normal haveXMLDecl 0 haveDocElement 0 context {} stack {} line 0 } } foreach {tag close empty param text} $sgml { # Keep track of lines in the input incr state(line) [regsub -all \n $param {} discard] incr state(line) [regsub -all \n $text {} discard] # If the current mode is cdata or comment then we must undo what the # regsub has done to reconstitute the data switch $state(mode) { comment { # This had "[string length $param] && " as a guard - # can't remember why :-( if {[regexp ([cl ^-]*)--\$ $tag discard comm1]} { # end of comment (in tag) set tag {} set close {} set empty {} set state(mode) normal uplevel #0 $options(-commentcommand) [list $state(commentdata)<$comm1] unset state(commentdata) } elseif {[regexp ([cl ^-]*)--\$ $param discard comm1]} { # end of comment (in attributes) uplevel #0 $options(-commentcommand) [list $state(commentdata)<$close$tag$empty>$comm1] unset state(commentdata) set tag {} set param {} set close {} set empty {} set state(mode) normal } elseif {[regexp ([cl ^-]*)-->(.*) $text discard comm1 text]} { # end of comment (in text) uplevel #0 $options(-commentcommand) [list $state(commentdata)<$close$tag$param$empty>$comm1] unset state(commentdata) set tag {} set param {} set close {} set empty {} set state(mode) normal } else { # comment continues append state(commentdata) <$close$tag$param$empty>$text continue } } cdata { if {[string length $param] && [regexp ([cl ^\]]*)\]\][cl $Wsp]*\$ $tag discard cdata1]} { # end of CDATA (in tag) uplevel #0 $options(-characterdatacommand) [list $state(cdata)<$close$cdata1$text] set text {} set tag {} unset state(cdata) set state(mode) normal } elseif {[regexp ([cl ^\]]*)\]\][cl $Wsp]*\$ $param discard cdata1]} { # end of CDATA (in attributes) uplevel #0 $options(-characterdatacommand) [list $state(cdata)<$close$tag$cdata1$text] set text {} set tag {} set param {} unset state(cdata) set state(mode) normal } elseif {[regexp ([cl ^\]]*)\]\][cl $Wsp]*>(.*) $text discard cdata1 text]} { # end of CDATA (in text) uplevel #0 $options(-characterdatacommand) [list $state(cdata)<$close$tag$param$empty>$cdata1$text] set text {} set tag {} set param {} set close {} set empty {} unset state(cdata) set state(mode) normal } else { # CDATA continues append state(cdata) <$close$tag$param$empty>$text continue } } } # default: normal mode # Bug: if the attribute list has a right angle bracket then the empty # element marker will not be seen set isEmpty [uplevel #0 $options(-emptyelement) [list $tag $param $empty]] if {[llength $isEmpty]} { foreach {empty tag param} $isEmpty break } switch -glob -- [string length $tag],[regexp {^\?|!.*} $tag],$close,$empty { 0,0,, { # Ignore empty tag - dealt with non-normal mode above } *,0,, { # Start tag for an element. # Check for a right angle bracket in an attribute value # This manifests itself by terminating the value before # the delimiter is seen, and the delimiter appearing # in the text # BUG: If two or more attribute values have right angle # brackets then this will fail on the second one. if {[regexp [format {=[%s]*"[^"]*$} $Wsp] $param] && \ [regexp {([^"]*"[^>]*)>(.*)} $text discard attrListRemainder text]} { append param >$attrListRemainder } elseif {[regexp [format {=[%s]*'[^']*$} $Wsp] $param] && \ [regexp {([^']*'[^>]*)>(.*)} $text discard attrListRemainder text]} { append param >$attrListRemainder } # Check if the internal DTD entity is in an attribute # value regsub -all &xml:intdtd\; $param \[$options(-internaldtd)\] param ParseEvent:ElementOpen $tag $param options set state(haveDocElement) 1 } *,0,/, { # End tag for an element. ParseEvent:ElementClose $tag options } *,0,,/ { # Empty element ParseEvent:ElementOpen $tag $param options -empty 1 ParseEvent:ElementClose $tag options -empty 1 } *,1,* { # Processing instructions or XML declaration switch -glob -- $tag { {\?xml} { # XML Declaration if {$state(haveXMLDecl)} { uplevel #0 $options(-errorcommand) "unexpected characters \"<$tag\" around line $state(line)" } elseif {![regexp {\?$} $param]} { uplevel #0 $options(-errorcommand) "XML Declaration missing characters \"?>\" around line $state(line)" } else { # Get the version number if {[regexp {[ ]*version="(-+|[a-zA-Z0-9_.:]+)"[ ]*} $param discard version] || [regexp {[ ]*version='(-+|[a-zA-Z0-9_.:]+)'[ ]*} $param discard version]} { if {$version ne "1.0" } { # Should we support future versions? # At least 1.X? uplevel #0 $options(-errorcommand) "document XML version \"$version\" is incompatible with XML version 1.0" } } else { uplevel #0 $options(-errorcommand) "XML Declaration missing version information around line $state(line)" } # Get the encoding declaration set encoding {} regexp {[ ]*encoding="([A-Za-z]([A-Za-z0-9._]|-)*)"[ ]*} $param discard encoding regexp {[ ]*encoding='([A-Za-z]([A-Za-z0-9._]|-)*)'[ ]*} $param discard encoding # Get the standalone declaration set standalone {} regexp {[ ]*standalone="(yes|no)"[ ]*} $param discard standalone regexp {[ ]*standalone='(yes|no)'[ ]*} $param discard standalone # Invoke the callback uplevel #0 $options(-xmldeclcommand) [list $version $encoding $standalone] } } {\?*} { # Processing instruction if {![regsub {\?$} $param {} param]} { uplevel #0 $options(-errorcommand) "PI: expected '?' character around line $state(line)" } else { uplevel #0 $options(-processinginstructioncommand) [list [string range $tag 1 end] [string trimleft $param]] } } !DOCTYPE { # External entity reference # This should move into xml.tcl # Parse the params supplied. Looking for Name, ExternalID and MarkupDecl regexp ^[cl $Wsp]*($name)(.*) $param x state(doc_name) param set state(doc_name) [Normalize $state(doc_name) $options(-normalize)] set externalID {} set pubidlit {} set systemlit {} set externalID {} if {[regexp -nocase ^[cl $Wsp]*(SYSTEM|PUBLIC)(.*) $param x id param]} { switch [string toupper $id] { SYSTEM { if {[regexp ^[cl $Wsp]+"([cl ^"]*)"(.*) $param x systemlit param] || [regexp ^[cl $Wsp]+'([cl ^']*)'(.*) $param x systemlit param]} { set externalID [list SYSTEM $systemlit] ;# " } else { uplevel #0 $options(-errorcommand) {{syntax error: SYSTEM identifier not followed by literal}} } } PUBLIC { if {[regexp ^[cl $Wsp]+"([cl ^"]*)"(.*) $param x pubidlit param] || [regexp ^[cl $Wsp]+'([cl ^']*)'(.*) $param x pubidlit param]} { if {[regexp ^[cl $Wsp]+"([cl ^"]*)"(.*) $param x systemlit param] || [regexp ^[cl $Wsp]+'([cl ^']*)'(.*) $param x systemlit param]} { set externalID [list PUBLIC $pubidlit $systemlit] } else { uplevel #0 $options(-errorcommand) "syntax error: PUBLIC identifier not followed by system literal around line $state(line)" } } else { uplevel #0 $options(-errorcommand) "syntax error: PUBLIC identifier not followed by literal around line $state(line)" } } } if {[regexp -nocase ^[cl $Wsp]+NDATA[cl $Wsp]+($name)(.*) $param x notation param]} { lappend externalID $notation } } uplevel #0 $options(-doctypecommand) $state(doc_name) [list $pubidlit $systemlit $options(-internaldtd)] } !--* { # Start of a comment # See if it ends in the same tag, otherwise change the # parsing mode regexp {!--(.*)} $tag discard comm1 if {[regexp ([cl ^-]*)--[cl $Wsp]*\$ $comm1 discard comm1_1]} { # processed comment (end in tag) uplevel #0 $options(-commentcommand) [list $comm1_1] } elseif {[regexp ([cl ^-]*)--[cl $Wsp]*\$ $param discard comm2]} { # processed comment (end in attributes) uplevel #0 $options(-commentcommand) [list $comm1$comm2] } elseif {[regexp ([cl ^-]*)-->(.*) $text discard comm2 text]} { # processed comment (end in text) uplevel #0 $options(-commentcommand) [list $comm1$param>$comm2] } else { # start of comment set state(mode) comment set state(commentdata) "$comm1$param>$text" continue } } {!\[CDATA\[*} { regexp {!\[CDATA\[(.*)} $tag discard cdata1 if {[regexp {(.*)]]$} $param discard cdata2]} { # processed CDATA (end in attribute) uplevel #0 $options(-characterdatacommand) [list $cdata1$cdata2$text] set text {} } elseif {[regexp {(.*)]]>(.*)} $text discard cdata2 text]} { # processed CDATA (end in text) uplevel #0 $options(-characterdatacommand) [list $cdata1$param$empty>$cdata2$text] set text {} } else { # start CDATA set state(cdata) "$cdata1$param>$text" set state(mode) cdata continue } } !ELEMENT { # Internal DTD declaration } !ATTLIST { } !ENTITY { } !NOTATION { } !* { uplevel #0 $options(-processinginstructioncommand) [list $tag $param] } default { uplevel #0 $options(-errorcommand) [list "unknown processing instruction \"<$tag>\" around line $state(line)"] } } } *,1,* - *,0,/,/ { # Syntax error uplevel #0 $options(-errorcommand) [list [list syntax error: closed/empty tag: tag $tag param $param empty $empty close $close around line $state(line)]] } } # Process character data if {$state(haveDocElement) && [llength $state(stack)]} { # Check if the internal DTD entity is in the text regsub -all &xml:intdtd\; $text \[$options(-internaldtd)\] text # Look for entity references if {([array size entities] || [string length $options(-entityreferencecommand)]) && \ [regexp {&[^;]+;} $text]} { # protect Tcl specials regsub -all {([][$\\])} $text {\\\1} text # Mark entity references regsub -all {&([^;]+);} $text [format {%s; %s {\1} ; %s %s} \}\} [namespace code [list Entity options $options(-entityreferencecommand) $options(-characterdatacommand) $options(-entityvariable)]] [list uplevel #0 $options(-characterdatacommand)] \{\{] text set text "uplevel #0 $options(-characterdatacommand) {{$text}}" eval $text } else { # Restore protected special characters regsub -all {\\([{}\\])} $text {\1} text uplevel #0 $options(-characterdatacommand) [list $text] } } elseif {[string length [string trim $text]]} { uplevel #0 $options(-errorcommand) "unexpected text \"$text\" in document prolog around line $state(line)" } } # If this is the end of the document, close all open containers if {$options(-final) && [llength $state(stack)]} { eval $options(-errorcommand) [list [list element [lindex $state(stack) end] remains unclosed around line $state(line)]] } return {} } # sgml::ParseEvent:ElementOpen -- # # Start of an element. # # Arguments: # tag Element name # attr Attribute list # opts Option variable in caller # args further configuration options # # Options: # -empty boolean # indicates whether the element was an empty element # # Results: # Modify state and invoke callback proc sgml::ParseEvent:ElementOpen {tag attr opts args} { upvar $opts options upvar #0 $options(-statevariable) state array set cfg {-empty 0} array set cfg $args if {$options(-normalize)} { set tag [string toupper $tag] } # Update state lappend state(stack) $tag # Parse attribute list into a key-value representation if {[string compare $options(-parseattributelistcommand) {}]} { if {[catch {uplevel #0 $options(-parseattributelistcommand) [list $attr]} attr]} { uplevel #0 $options(-errorcommand) [list $attr around line $state(line)] set attr {} } } set empty {} if {$cfg(-empty) && $options(-reportempty)} { set empty {-empty 1} } # Invoke callback uplevel #0 $options(-elementstartcommand) [list $tag $attr] $empty return {} } # sgml::ParseEvent:ElementClose -- # # End of an element. # # Arguments: # tag Element name # opts Option variable in caller # args further configuration options # # Options: # -empty boolean # indicates whether the element as an empty element # # Results: # Modify state and invoke callback proc sgml::ParseEvent:ElementClose {tag opts args} { upvar $opts options upvar #0 $options(-statevariable) state array set cfg {-empty 0} array set cfg $args # WF check if {$tag ne [lindex $state(stack) end] } { uplevel #0 $options(-errorcommand) [list "end tag \"$tag\" does not match open element \"[lindex $state(stack) end]\" around line $state(line)"] return } # Update state set state(stack) [lreplace $state(stack) end end] set empty {} if {$cfg(-empty) && $options(-reportempty)} { set empty {-empty 1} } # Invoke callback uplevel #0 $options(-elementendcommand) [list $tag] $empty return {} } # sgml::Normalize -- # # Perform name normalization if required # # Arguments: # name name to normalize # req normalization required # # Results: # Name returned as upper-case if normalization required proc sgml::Normalize {name req} { if {$req} { return [string toupper $name] } else { return $name } } # sgml::Entity -- # # Resolve XML entity references (syntax: &xxx;). # # Arguments: # opts options array variable in caller # entityrefcmd application callback for entity references # pcdatacmd application callback for character data # entities name of array containing entity definitions. # ref entity reference (the "xxx" bit) # # Results: # Returns substitution text for given entity. proc sgml::Entity {opts entityrefcmd pcdatacmd entities ref} { upvar 2 $opts options upvar #0 $options(-statevariable) state if {![string length $entities]} { set entities [namespace current EntityPredef] } switch -glob -- $ref { %* { # Parameter entity - not recognised outside of a DTD } #x* { # Character entity - hex if {[catch {format %c [scan [string range $ref 2 end] %x tmp; set tmp]} char]} { return -code error "malformed character entity \"$ref\"" } uplevel #0 $pcdatacmd [list $char] return {} } #* { # Character entity - decimal if {[catch {format %c [scan [string range $ref 1 end] %d tmp; set tmp]} char]} { return -code error "malformed character entity \"$ref\"" } uplevel #0 $pcdatacmd [list $char] return {} } default { # General entity upvar #0 $entities map if {[info exists map($ref)]} { if {![regexp {<|&} $map($ref)]} { # Simple text replacement - optimise uplevel #0 $pcdatacmd [list $map($ref)] return {} } # Otherwise an additional round of parsing is required. # This only applies to XML, since HTML doesn't have general entities # Must parse the replacement text for start & end tags, etc # This text must be self-contained: balanced closing tags, and so on set tokenised [tokenise $map($ref) $::xml::tokExpr $::xml::substExpr] set final $options(-final) unset options(-final) eval parseEvent [list $tokenised] [array get options] -final 0 set options(-final) $final return {} } elseif {[string length $entityrefcmd]} { uplevel #0 $entityrefcmd [list $ref] return {} } } } # If all else fails leave the entity reference untouched uplevel #0 $pcdatacmd [list &$ref\;] return {} } #################################### # # DTD parser for SGML (XML). # # This DTD actually only handles XML DTDs. Other language's # DTD's, such as HTML, must be written in terms of a XML DTD. # # A DTD is represented as a three element Tcl list. # The first element contains the content models for elements, # the second contains the attribute lists for elements and # the last element contains the entities for the document. # #################################### # sgml::parseDTD -- # # Entry point to the SGML DTD parser. # # Arguments: # dtd data defining the DTD to be parsed # args configuration options # # Results: # Returns a three element list, first element is the content model # for each element, second element are the attribute lists of the # elements and the third element is the entity map. proc sgml::parseDTD {dtd args} { variable Wsp variable ParseDTDnum array set opts [list \ -errorcommand [namespace current]::noop \ state [namespace current]::parseDTD[incr ParseDTDnum] ] array set opts $args set exp ]+)[cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*([cl ^>]*)> set sub {{\1} {\2} {\3} } regsub -all $exp $dtd $sub dtd foreach {decl id value} $dtd { catch {DTD:[string toupper $decl] $id $value} err } return [list [array get contentmodel] [array get attributes] [array get entities]] } # Procedures for handling the various declarative elements in a DTD. # New elements may be added by creating a procedure of the form # parse:DTD:_element_ # For each of these procedures, the various regular expressions they use # are created outside of the proc to avoid overhead at runtime # sgml::DTD:ELEMENT -- # # defines an element. # # The content model for the element is stored in the contentmodel array, # indexed by the element name. The content model is parsed into the # following list form: # # {} Content model is EMPTY. # Indicated by an empty list. # * Content model is ANY. # Indicated by an asterix. # {ELEMENT ...} # Content model is element-only. # {MIXED {element1 element2 ...}} # Content model is mixed (PCDATA and elements). # The second element of the list contains the # elements that may occur. #PCDATA is assumed # (ie. the list is normalised). # # Arguments: # id identifier for the element. # value other information in the PI proc sgml::DTD:ELEMENT {id value} { dbgputs DTD_parse [list DTD:ELEMENT $id $value] variable Wsp upvar opts state upvar contentmodel cm if {[info exists cm($id)]} { eval $state(-errorcommand) element [list "element \"$id\" already declared"] } else { switch -- $value { EMPTY { set cm($id) {} } ANY { set cm($id) * } default { if {[regexp [format {^\([%s]*#PCDATA[%s]*(\|([^)]+))?[%s]*\)*[%s]*$} $Wsp $Wsp $Wsp $Wsp] discard discard mtoks]} { set cm($id) [list MIXED [split $mtoks |]] } else { if {[catch {CModelParse $state(state) $value} result]} { eval $state(-errorcommand) element [list $result] } else { set cm($id) [list ELEMENT $result] } } } } } } # sgml::CModelParse -- # # Parse an element content model (non-mixed). # A syntax tree is constructed. # A transition table is built next. # # This is going to need alot of work! # # Arguments: # state state array variable # value the content model data # # Results: # A Tcl list representing the content model. proc sgml::CModelParse {state value} { upvar #0 $state var # First build syntax tree set syntaxTree [CModelMakeSyntaxTree $state $value] # Build transition table set transitionTable [CModelMakeTransitionTable $state $syntaxTree] return [list $syntaxTree $transitionTable] } # sgml::CModelMakeSyntaxTree -- # # Construct a syntax tree for the regular expression. # # Syntax tree is represented as a Tcl list: # rep {:choice|:seq {{rep list1} {rep list2} ...}} # where: rep is repetition character, *, + or ?. {} for no repetition # listN is nested expression or Name # # Arguments: # spec Element specification # # Results: # Syntax tree for element spec as nested Tcl list. # # Examples: # (memo) # {} {:seq {{} memo}} # (front, body, back?) # {} {:seq {{} front} {{} body} {? back}} # (head, (p | list | note)*, div2*) # {} {:seq {{} head} {* {:choice {{} p} {{} list} {{} note}}} {* div2}} # (p | a | ul)+ # + {:choice {{} p} {{} a} {{} ul}} proc sgml::CModelMakeSyntaxTree {state spec} { upvar #0 $state var variable Wsp variable name # Translate the spec into a Tcl list. # None of the Tcl special characters are allowed in a content model spec. if {[regexp {\$|\[|\]|\{|\}} $spec]} { return -code error "illegal characters in specification" } regsub -all [format {(%s)[%s]*(\?|\*|\+)?[%s]*(,|\|)?} $name $Wsp $Wsp] $spec [format {%sCModelSTname %s {\1} {\2} {\3}} \n $state] spec regsub -all {\(} $spec "\nCModelSTopenParen $state " spec regsub -all [format {\)[%s]*(\?|\*|\+)?[%s]*(,|\|)?} $Wsp $Wsp] $spec [format {%sCModelSTcloseParen %s {\1} {\2}} \n $state] spec array set var {stack {} state start} eval $spec # Peel off the outer seq, its redundant return [lindex [lindex $var(stack) 1] 0] } # sgml::CModelSTname -- # # Processes a name in a content model spec. # # Arguments: # state state array variable # name name specified # rep repetition operator # cs choice or sequence delimiter # # Results: # See CModelSTcp. proc sgml::CModelSTname {state name rep cs args} { if {[llength $args]} { return -code error "syntax error in specification: \"$args\"" } CModelSTcp $state $name $rep $cs } # sgml::CModelSTcp -- # # Process a content particle. # # Arguments: # state state array variable # name name specified # rep repetition operator # cs choice or sequence delimiter # # Results: # The content particle is added to the current group. proc sgml::CModelSTcp {state cp rep cs} { upvar #0 $state var switch -glob -- [lindex $var(state) end]=$cs { start= { set var(state) [lreplace $var(state) end end end] # Add (dummy) grouping, either choice or sequence will do CModelSTcsSet $state , CModelSTcpAdd $state $cp $rep } :choice= - :seq= { set var(state) [lreplace $var(state) end end end] CModelSTcpAdd $state $cp $rep } start=| - start=, { set var(state) [lreplace $var(state) end end [expr {$cs eq "," ? ":seq" : ":choice"}]] CModelSTcsSet $state $cs CModelSTcpAdd $state $cp $rep } :choice=| - :seq=, { CModelSTcpAdd $state $cp $rep } :choice=, - :seq=| { return -code error "syntax error in specification: incorrect delimiter after \"$cp\", should be \"[expr {$cs eq "," ? "|" : ","}]\"" } end=* { return -code error "syntax error in specification: no delimiter before \"$cp\"" } default { return -code error "syntax error" } } } # sgml::CModelSTcsSet -- # # Start a choice or sequence on the stack. # # Arguments: # state state array # cs choice oir sequence # # Results: # state is modified: end element of state is appended. proc sgml::CModelSTcsSet {state cs} { upvar #0 $state var set cs [expr {$cs eq "," ? ":seq" : ":choice"}] if {[llength $var(stack)]} { set var(stack) [lreplace $var(stack) end end $cs] } else { set var(stack) [list $cs {}] } } # sgml::CModelSTcpAdd -- # # Append a content particle to the top of the stack. # # Arguments: # state state array # cp content particle # rep repetition # # Results: # state is modified: end element of state is appended. proc sgml::CModelSTcpAdd {state cp rep} { upvar #0 $state var if {[llength $var(stack)]} { set top [lindex $var(stack) end] lappend top [list $rep $cp] set var(stack) [lreplace $var(stack) end end $top] } else { set var(stack) [list $rep $cp] } } # sgml::CModelSTopenParen -- # # Processes a '(' in a content model spec. # # Arguments: # state state array # # Results: # Pushes stack in state array. proc sgml::CModelSTopenParen {state args} { upvar #0 $state var if {[llength $args]} { return -code error "syntax error in specification: \"$args\"" } lappend var(state) start lappend var(stack) [list {} {}] } # sgml::CModelSTcloseParen -- # # Processes a ')' in a content model spec. # # Arguments: # state state array # rep repetition # cs choice or sequence delimiter # # Results: # Stack is popped, and former top of stack is appended to previous element. proc sgml::CModelSTcloseParen {state rep cs args} { upvar #0 $state var if {[llength $args]} { return -code error "syntax error in specification: \"$args\"" } set cp [lindex $var(stack) end] set var(stack) [lreplace $var(stack) end end] set var(state) [lreplace $var(state) end end] CModelSTcp $state $cp $rep $cs } # sgml::CModelMakeTransitionTable -- # # Given a content model's syntax tree, constructs # the transition table for the regular expression. # # See "Compilers, Principles, Techniques, and Tools", # Aho, Sethi and Ullman. Section 3.9, algorithm 3.5. # # Arguments: # state state array variable # st syntax tree # # Results: # The transition table is returned, as a key/value Tcl list. proc sgml::CModelMakeTransitionTable {state st} { upvar #0 $state var # Construct nullable, firstpos and lastpos functions array set var {number 0} foreach {nullable firstpos lastpos} [ \ TraverseDepth1st $state $st { # Evaluated for leaf nodes # Compute nullable(n) # Compute firstpos(n) # Compute lastpos(n) set nullable [nullable leaf $rep $name] set firstpos [list {} $var(number)] set lastpos [list {} $var(number)] set var(pos:$var(number)) $name } { # Evaluated for nonterminal nodes # Compute nullable, firstpos, lastpos set firstpos [firstpos $cs $firstpos $nullable] set lastpos [lastpos $cs $lastpos $nullable] set nullable [nullable nonterm $rep $cs $nullable] } \ ] break set accepting [incr var(number)] set var(pos:$accepting) # # var(pos:N) maps from position to symbol. # Construct reverse map for convenience. # NB. A symbol may appear in more than one position. # var is about to be reset, so use different arrays. foreach {pos symbol} [array get var pos:*] { set pos [lindex [split $pos :] 1] set pos2symbol($pos) $symbol lappend sym2pos($symbol) $pos } # Construct the followpos functions catch {unset var} followpos $state $st $firstpos $lastpos # Construct transition table # Dstates is [union $marked $unmarked] set unmarked [list [lindex $firstpos 1]] while {[llength $unmarked]} { set T [lindex $unmarked 0] lappend marked $T set unmarked [lrange $unmarked 1 end] # Find which input symbols occur in T set symbols {} foreach pos $T { if {$pos != $accepting && [lsearch $symbols $pos2symbol($pos)] < 0} { lappend symbols $pos2symbol($pos) } } foreach a $symbols { set U {} foreach pos $sym2pos($a) { if {[lsearch $T $pos] >= 0} { # add followpos($pos) if {$var($pos) == {}} { lappend U $accepting } else { eval lappend U $var($pos) } } } set U [makeSet $U] if {[llength $U] && [lsearch $marked $U] < 0 && [lsearch $unmarked $U] < 0} { lappend unmarked $U } set Dtran($T,$a) $U } } return [list [array get Dtran] [array get sym2pos] $accepting] } # sgml::followpos -- # # Compute the followpos function, using the already computed # firstpos and lastpos. # # Arguments: # state array variable to store followpos functions # st syntax tree # firstpos firstpos functions for the syntax tree # lastpos lastpos functions # # Results: # followpos functions for each leaf node, in name/value format proc sgml::followpos {state st firstpos lastpos} { upvar #0 $state var switch -- [lindex [lindex $st 1] 0] { :seq { for {set i 1} {$i < [llength [lindex $st 1]]} {incr i} { followpos $state [lindex [lindex $st 1] $i] \ [lindex [lindex $firstpos 0] [expr {$i - 1}]] \ [lindex [lindex $lastpos 0] [expr {$i - 1}]] foreach pos [lindex [lindex [lindex $lastpos 0] [expr {$i - 1}]] 1] { eval lappend var($pos) [lindex [lindex [lindex $firstpos 0] $i] 1] set var($pos) [makeSet $var($pos)] } } } :choice { for {set i 1} {$i < [llength [lindex $st 1]]} {incr i} { followpos $state [lindex [lindex $st 1] $i] \ [lindex [lindex $firstpos 0] [expr {$i - 1}]] \ [lindex [lindex $lastpos 0] [expr {$i - 1}]] } } default { # No action at leaf nodes } } switch -- [lindex $st 0] { ? { # We having nothing to do here ! Doing the same as # for * effectively converts this qualifier into the other. } * { foreach pos [lindex $lastpos 1] { eval lappend var($pos) [lindex $firstpos 1] set var($pos) [makeSet $var($pos)] } } } } # sgml::TraverseDepth1st -- # # Perform depth-first traversal of a tree. # A new tree is constructed, with each node computed by f. # # Arguments: # state state array variable # t The tree to traverse, a Tcl list # leaf Evaluated at a leaf node # nonTerm Evaluated at a nonterminal node # # Results: # A new tree is returned. proc sgml::TraverseDepth1st {state t leaf nonTerm} { upvar #0 $state var set nullable {} set firstpos {} set lastpos {} switch -- [lindex [lindex $t 1] 0] { :seq - :choice { set rep [lindex $t 0] set cs [lindex [lindex $t 1] 0] foreach child [lrange [lindex $t 1] 1 end] { foreach {childNullable childFirstpos childLastpos} \ [TraverseDepth1st $state $child $leaf $nonTerm] break lappend nullable $childNullable lappend firstpos $childFirstpos lappend lastpos $childLastpos } eval $nonTerm } default { incr var(number) set rep [lindex [lindex $t 0] 0] set name [lindex [lindex $t 1] 0] eval $leaf } } return [list $nullable $firstpos $lastpos] } # sgml::firstpos -- # # Computes the firstpos function for a nonterminal node. # # Arguments: # cs node type, choice or sequence # firstpos firstpos functions for the subtree # nullable nullable functions for the subtree # # Results: # firstpos function for this node is returned. proc sgml::firstpos {cs firstpos nullable} { switch -- $cs { :seq { set result [lindex [lindex $firstpos 0] 1] for {set i 0} {$i < [llength $nullable]} {incr i} { if {[lindex [lindex $nullable $i] 1]} { eval lappend result [lindex [lindex $firstpos [expr {$i + 1}]] 1] } else { break } } } :choice { foreach child $firstpos { eval lappend result $child } } } return [list $firstpos [makeSet $result]] } # sgml::lastpos -- # # Computes the lastpos function for a nonterminal node. # Same as firstpos, only logic is reversed # # Arguments: # cs node type, choice or sequence # lastpos lastpos functions for the subtree # nullable nullable functions forthe subtree # # Results: # lastpos function for this node is returned. proc sgml::lastpos {cs lastpos nullable} { switch -- $cs { :seq { set result [lindex [lindex $lastpos end] 1] for {set i [expr {[llength $nullable] - 1}]} {$i >= 0} {incr i -1} { if {[lindex [lindex $nullable $i] 1]} { eval lappend result [lindex [lindex $lastpos $i] 1] } else { break } } } :choice { foreach child $lastpos { eval lappend result $child } } } return [list $lastpos [makeSet $result]] } # sgml::makeSet -- # # Turn a list into a set, ie. remove duplicates. # # Arguments: # s a list # # Results: # A set is returned, which is a list with duplicates removed. proc sgml::makeSet s { foreach r $s { if {[llength $r]} { set unique($r) {} } } return [array names unique] } # sgml::nullable -- # # Compute the nullable function for a node. # # Arguments: # nodeType leaf or nonterminal # rep repetition applying to this node # name leaf node: symbol for this node, nonterm node: choice or seq node # subtree nonterm node: nullable functions for the subtree # # Results: # Returns nullable function for this branch of the tree. proc sgml::nullable {nodeType rep name {subtree {}}} { switch -glob -- $rep:$nodeType { :leaf - +:leaf { return [list {} 0] } \\*:leaf - \\?:leaf { return [list {} 1] } \\*:nonterm - \\?:nonterm { return [list $subtree 1] } :nonterm - +:nonterm { switch -- $name { :choice { set result 0 foreach child $subtree { set result [expr {$result || [lindex $child 1]}] } } :seq { set result 1 foreach child $subtree { set result [expr {$result && [lindex $child 1]}] } } } return [list $subtree $result] } } } # These regular expressions are defined here once for better performance namespace eval sgml { variable Wsp # Watch out for case-sensitivity set attlist_exp [cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*(#REQUIRED|#IMPLIED) set attlist_enum_exp [cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*\\(([cl ^)]*)\\)[cl $Wsp]*("([cl ^")])")? ;# " set attlist_fixed_exp [cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*(#FIXED)[cl $Wsp]*([cl ^$Wsp]+) set param_entity_exp [cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*([cl ^"$Wsp]*)[cl $Wsp]*"([cl ^"]*)" set notation_exp [cl $Wsp]*([cl ^$Wsp]+)[cl $Wsp]*(.*) } # sgml::DTD:ATTLIST -- # # defines an attribute list. # # Arguments: # id Element an attribute list is being defined for. # value data from the PI. # # Results: # Attribute list variables are modified. proc sgml::DTD:ATTLIST {id value} { variable attlist_exp variable attlist_enum_exp variable attlist_fixed_exp dbgputs DTD_parse [list DTD:ATTLIST $id $value] upvar opts state upvar attributes am if {[info exists am($id)]} { eval $state(-errorcommand) attlist [list "attribute list for element \"$id\" already declared"] } else { # Parse the attribute list. If it were regular, could just use foreach, # but some attributes may have values. regsub -all {([][$\\])} $value {\\\1} value regsub -all $attlist_exp $value {[DTDAttribute {\1} {\2} {\3}]} value regsub -all $attlist_enum_exp $value {[DTDAttribute {\1} {\2} {\3}]} value regsub -all $attlist_fixed_exp $value {[DTDAttribute {\1} {\2} {\3} {\4}]} value subst $value set am($id) [array get attlist] } } # sgml::DTDAttribute -- # # Parse definition of a single attribute. # # Arguments: # name attribute name # type type of this attribute # default default value of the attribute # value other information proc sgml::DTDAttribute {name type default {value {}}} { upvar attlist al # This needs further work set al($name) [list $default $value] } # sgml::DTD:ENTITY -- # # PI # # Arguments: # id identifier for the entity # value data # # Results: # Modifies the caller's entities array variable proc sgml::DTD:ENTITY {id value} { variable param_entity_exp dbgputs DTD_parse [list DTD:ENTITY $id $value] upvar opts state upvar entities ents if {"%" ne $id } { # Entity declaration if {[info exists ents($id)]} { eval $state(-errorcommand) entity [list "entity \"$id\" already declared"] } else { if {![regexp {"([^"]*)"} $value x entvalue] && ![regexp {'([^']*)'} $value x entvalue]} { eval $state(-errorcommand) entityvalue [list "entity value \"$value\" not correctly specified"] } ;# " set ents($id) $entvalue } } else { # Parameter entity declaration switch -glob [regexp $param_entity_exp $value x name scheme data],[string compare {} $scheme] { 0,* { eval $state(-errorcommand) entityvalue [list "parameter entity \"$value\" not correctly specified"] } *,0 { # SYSTEM or PUBLIC declaration } default { set ents($id) $data } } } } # sgml::DTD:NOTATION -- proc sgml::DTD:NOTATION {id value} { variable notation_exp upvar opts state if {[regexp $notation_exp $value x scheme data] == 2} { } else { eval $state(-errorcommand) notationvalue [list "notation value \"$value\" incorrectly specified"] } } ### Utility procedures # sgml::noop -- # # A do-nothing proc # # Arguments: # args arguments # # Results: # Nothing. proc sgml::noop args { return 0 } # sgml::identity -- # # Identity function. # # Arguments: # a arbitrary argument # # Results: # $a proc sgml::identity a { return $a } # sgml::Error -- # # Throw an error # # Arguments: # args arguments # # Results: # Error return condition. proc sgml::Error args { uplevel return -code error [list $args] } ### Following procedures are based on html_library # sgml::zapWhite -- # # Convert multiple white space into a single space. # # Arguments: # data plain text # # Results: # As above proc sgml::zapWhite data { regsub -all "\[ \t\r\n\]+" $data { } data return $data } proc sgml::Boolean value { regsub {1|true|yes|on} $value 1 value regsub {0|false|no|off} $value 0 value return $value } proc sgml::dbgputs {where text} { variable dbg catch {if {$dbg} {puts stdout "DBG: $where ($text)"}} } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._aclocal.m4000644 000765 000024 00000000430 12161600406 022153 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/aclocal.m4000644 000765 000024 00000000063 12161600406 021740 0ustar00neumannstaff000000 000000 builtin(include,xotcl.m4) builtin(include,tcl.m4) ./xotcl-1.6.8/library/xml/TclExpat-1.1/._asciitab.h000644 000765 000024 00000000430 12161600406 022243 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/asciitab.h000644 000765 000024 00000004377 12161600406 022044 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, /* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_NMSTRT, BT_SEMI, /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, ./xotcl-1.6.8/library/xml/TclExpat-1.1/._codepage.c000644 000765 000024 00000000430 12161600406 022226 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/codepage.c000644 000765 000024 00000003331 12161600406 022014 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include "codepage.h" #ifdef WIN32 #include int codepageMap(int cp, int *map) { int i; CPINFO info; if (!GetCPInfo(cp, &info) || info.MaxCharSize > 2) return 0; for (i = 0; i < 256; i++) map[i] = -1; if (info.MaxCharSize > 1) { for (i = 0; i < MAX_LEADBYTES; i++) { int j, lim; if (info.LeadByte[i] == 0 && info.LeadByte[i + 1] == 0) break; lim = info.LeadByte[i + 1]; for (j = info.LeadByte[i]; j < lim; j++) map[j] = -2; } } for (i = 0; i < 256; i++) { if (map[i] == -1) { char c = i; unsigned short n; if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, &c, 1, &n, 1) == 1) map[i] = n; } } return 1; } int codepageConvert(int cp, const char *p) { unsigned short c; if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS, p, 2, &c, 1) == 1) return c; return -1; } #else /* not WIN32 */ int codepageMap(int cp, int *map) { return 0; } int codepageConvert(int cp, const char *p) { return -1; } #endif /* not WIN32 */ ./xotcl-1.6.8/library/xml/TclExpat-1.1/._codepage.h000644 000765 000024 00000000430 12161600406 022233 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/codepage.h000644 000765 000024 00000001342 12161600406 022021 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ int codepageMap(int cp, int *map); int codepageConvert(int cp, const char *p); ./xotcl-1.6.8/library/xml/TclExpat-1.1/._configure000755 000765 000024 00000000430 12327656552 022243 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/configure000755 000765 000024 00001040510 12327656552 022032 0ustar00neumannstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for xotclexpat 0.9. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='xotclexpat' PACKAGE_TARNAME='xotclexpat' PACKAGE_VERSION='0.9' PACKAGE_STRING='xotclexpat 0.9' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS TCL_INCLUDES PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL_SCRIPT INSTALL_PROGRAM INSTALL_DATA INSTALL CPP TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_xotcl with_expat with_tcl with_tclinclude enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures xotclexpat 0.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/xotclexpat] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of xotclexpat 0.9:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-xotcl=DIR_CONTAINING_XOTCLCONFIG_SH absolute path to xotclConfig.sh, --without-xotcl disables, but this is pointless --with-expat=sys assumes a system-wide expat installation, --with-expat= point to a custom expat installation, --without-expat falls back to the bundled expat installation --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF xotclexpat configure 0.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by xotclexpat $as_me 0.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in ../../../tclconfig "$srcdir"/../../../tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../../../tclconfig \"$srcdir\"/../../../tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- # Check whether --with-xotcl was given. if test "${with_xotcl+set}" = set; then : withval=$with_xotcl; with_xotcl=$withval else as_fn_error $? "--with-xotcl is required" "$LINENO" 5 fi # Check whether --with-expat was given. if test "${with_expat+set}" = set; then : withval=$with_expat; with_expat=$withval else with_expat=bundle fi case $with_expat in bundle) ;; sys) { $as_echo "$as_me:${as_lineno-$LINENO}: result: search for expat in ${prefix} /usr/local /usr" >&5 $as_echo "search for expat in ${prefix} /usr/local /usr" >&6; } for f in $prefix /usr/local /usr; do if test -f "$f/include/expat.h" ; then expat_dir=$f EXPAT_INC_SPEC="-I`(cd $inc_dir; pwd)`" break fi done ;; *) inc_dir="`echo $with_expat |cut -f1 -d,`" lib_dir="`echo $with_expat |cut -f2 -d, -s`" if test -f "$inc_dir/expat.h"; then EXPAT_INC_SPEC="-I`(cd $inc_dir; pwd)`" else as_fn_error $? "${inc_dir} directory does not contain expat.h" "$LINENO" 5 fi expat_dir="`(cd $inc_dir/..; pwd)`" if test -z "${lib_dir}"; then EXPAT_LIB_SPEC="" else EXPAT_LIB_SPEC="-L`(cd $lib_dir; pwd)`" fi esac #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" INSTALL_DATA="\${INSTALL} -m 644" INSTALL_PROGRAM="\${INSTALL}" INSTALL_SCRIPT="\${INSTALL}" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #-------------------------------------------------------------------- # Load the xotclConfig.sh file #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: Reading file ${with_xotcl}/xotclConfig.sh" >&5 $as_echo "$as_me: Reading file ${with_xotcl}/xotclConfig.sh" >&6;} source ${with_xotcl}/xotclConfig.sh #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then filemap="win32filemap.c" else filemap="unixfilemap.c" fi # # general fallback to the bundled expat # if test "${expat_dir}" = ""; then with_expat="bundle" fi if test "${with_expat}" = bundle ; then # 1) the bundled case { $as_echo "$as_me:${as_lineno-$LINENO}: result: using bundled expat distribution" >&5 $as_echo "using bundled expat distribution" >&6; } vars="xmltok.c ${filemap} xmlrole.c xmlwf.c codepage.c xmlparse.c hashtable.c tclexpat.c" for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done else # 2) the shared case { $as_echo "$as_me:${as_lineno-$LINENO}: result: using shared expat found in ${expat_dir}" >&5 $as_echo "using shared expat found in ${expat_dir}" >&6; } vars="tclexpat.c" for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="${EXPAT_INC_SPEC}" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="${EXPAT_LIB_SPEC} -lexpat" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done fi vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="-I${with_xotcl}/generic ${XOTCL_BUILD_INCLUDE_SPEC}" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="$XOTCL_BUILD_STUB_LIB_SPEC" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS " vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_sample in this case) so # that we create the export library with the dll. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then $as_echo "#define BUILD_sample 1" >>confdefs.h CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else CLEANFILES="pkgIndex.tcl" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32 #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h #AC_DEFINE(USE_TK_STUBS) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. # Add WISH as well if this is a Tk extension. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by xotclexpat $as_me 0.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ xotclexpat config.status 0.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ./xotcl-1.6.8/library/xml/TclExpat-1.1/._configure.ac000644 000765 000024 00000000430 12327771445 022621 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/configure.ac000644 000765 000024 00000023525 12327771445 022416 0ustar00neumannstaff000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. # # RCS: @(#) $Id: configure.in,v 1.20 2007/10/12 19:53:32 neumann Exp $ #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- configdir=$(srcdir)/../../../tclconfig #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. #----------------------------------------------------------------------- AC_INIT([xotclexpat], [0.9]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR([../../../tclconfig]) #-------------------------------------------------------------------- # specify some extra flags #-------------------------------------------------------------------- AC_ARG_WITH([xotcl], [ --with-xotcl=DIR_CONTAINING_XOTCLCONFIG_SH absolute path to xotclConfig.sh, --without-xotcl disables, but this is pointless], [with_xotcl=$withval], [AC_MSG_ERROR([--with-xotcl is required])]) AC_ARG_WITH([expat], [ --with-expat=sys assumes a system-wide expat installation, --with-expat= point to a custom expat installation, --without-expat falls back to the bundled expat installation], [with_expat=$withval],[with_expat=bundle]) case $with_expat in bundle) ;; sys) AC_MSG_RESULT([search for expat in ${prefix} /usr/local /usr]) for f in $prefix /usr/local /usr; do if test -f "$f/include/expat.h" ; then expat_dir=$f EXPAT_INC_SPEC="-I`(cd $inc_dir; pwd)`" break fi done ;; *) inc_dir="`echo $with_expat |cut -f1 -d,`" lib_dir="`echo $with_expat |cut -f2 -d, -s`" if test -f "$inc_dir/expat.h"; then EXPAT_INC_SPEC="-I`(cd $inc_dir; pwd)`" else AC_MSG_ERROR([${inc_dir} directory does not contain expat.h]) fi expat_dir="`(cd $inc_dir/..; pwd)`" if test -z "${lib_dir}"; then EXPAT_LIB_SPEC="" else EXPAT_LIB_SPEC="-L`(cd $lib_dir; pwd)`" fi esac #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create # the basic setup necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #-------------------------------------------------------------------- # Load the xotclConfig.sh file #-------------------------------------------------------------------- AC_MSG_NOTICE([Reading file ${with_xotcl}/xotclConfig.sh]) source ${with_xotcl}/xotclConfig.sh #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then filemap="win32filemap.c" else filemap="unixfilemap.c" fi # # general fallback to the bundled expat # if test "${expat_dir}" = ""; then with_expat="bundle" fi if test "${with_expat}" = bundle ; then # 1) the bundled case AC_MSG_RESULT([using bundled expat distribution]) TEA_ADD_SOURCES([xmltok.c ${filemap} xmlrole.c xmlwf.c codepage.c xmlparse.c hashtable.c tclexpat.c]) else # 2) the shared case AC_MSG_RESULT([using shared expat found in ${expat_dir}]) TEA_ADD_SOURCES([tclexpat.c]) TEA_ADD_INCLUDES([${EXPAT_INC_SPEC}]) TEA_ADD_LIBS([${EXPAT_LIB_SPEC} -lexpat]) fi TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([-I${with_xotcl}/generic ${XOTCL_BUILD_INCLUDE_SPEC}]) TEA_ADD_LIBS([$XOTCL_BUILD_STUB_LIB_SPEC]) TEA_ADD_CFLAGS([]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) #-------------------------------------------------------------------- # __CHANGE__ # A few miscellaneous platform-specific items: # # Define a special symbol for Windows (BUILD_sample in this case) so # that we create the export library with the dll. # # Windows creates a few extra files that need to be cleaned up. # You can add more files to clean if your extension creates any extra # files. # # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then AC_DEFINE([BUILD_sample]) CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else CLEANFILES="pkgIndex.tcl" #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi AC_SUBST([CLEANFILES]) #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE([USE_TCL_STUBS]) #AC_DEFINE([USE_TK_STUBS]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl # file during the install process. Don't run the TCLSH_PROG through # ${CYGPATH} because it's being used directly by make. # Require that we use a tclsh shell version 8.2 or later since earlier # versions have bugs in the pkg_mkIndex routine. # Add WISH as well if this is a Tk extension. #-------------------------------------------------------------------- TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile]) ./xotcl-1.6.8/library/xml/TclExpat-1.1/._dllEntryPoint.c000644 000765 000024 00000000430 12161600406 023266 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/dllEntryPoint.c000644 000765 000024 00000001534 12161600406 023057 0ustar00neumannstaff000000 000000 /* * dllEntryPoint.c -- * * This file implements the Dll entry point as needed by Windows. */ #define WIN32_LEAN_AND_MEAN #include #if defined(_MSC_VER) # define DllEntryPoint DllMain #endif /* *---------------------------------------------------------------------- * * DllEntryPoint -- * * This wrapper function is used by Windows to invoke the * initialization code for the DLL. If we are compiling * with Visual C++, this routine will be renamed to DllMain. * * Results: * Returns TRUE; * * Side effects: * None. * *---------------------------------------------------------------------- */ BOOL APIENTRY DllEntryPoint(hInst, reason, reserved) HINSTANCE hInst; /* Library instance handle. */ DWORD reason; /* Reason this function is being called. */ LPVOID reserved; /* Not used. */ { return TRUE; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._dllmain.c000644 000765 000024 00000000430 12161600406 022077 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/dllmain.c000644 000765 000024 00000001414 12161600406 021665 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) { return TRUE; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._filemap.h000644 000765 000024 00000000430 12161600406 022101 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/filemap.h000644 000765 000024 00000001673 12161600406 021676 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include #ifdef XML_UNICODE int filemap(const wchar_t *name, void (*processor)(const void *, size_t, const wchar_t *, void *arg), void *arg); #else int filemap(const char *name, void (*processor)(const void *, size_t, const char *, void *arg), void *arg); #endif ./xotcl-1.6.8/library/xml/TclExpat-1.1/._hashtable.c000644 000765 000024 00000000430 12161600406 022412 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/hashtable.c000644 000765 000024 00000005541 12161600406 022205 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in csompliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include #include #include "xmldef.h" #include "hashtable.h" #ifdef XML_UNICODE #define keycmp wcscmp #else #define keycmp strcmp #endif #define INIT_SIZE 64 static unsigned long hash(KEY s) { unsigned long h = 0; while (*s) h = (h << 5) + h + (unsigned char)*s++; return h; } NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize) { size_t i; if (table->size == 0) { if (!createSize) return 0; table->v = calloc(INIT_SIZE, sizeof(NAMED *)); if (!table->v) return 0; table->size = INIT_SIZE; table->usedLim = INIT_SIZE / 2; i = hash(name) & (table->size - 1); } else { unsigned long h = hash(name); for (i = h & (table->size - 1); table->v[i]; i == 0 ? i = table->size - 1 : --i) { if (keycmp(name, table->v[i]->name) == 0) return table->v[i]; } if (!createSize) return 0; if (table->used == table->usedLim) { /* check for overflow */ size_t newSize = table->size * 2; NAMED **newV = calloc(newSize, sizeof(NAMED *)); if (!newV) return 0; for (i = 0; i < table->size; i++) if (table->v[i]) { size_t j; for (j = hash(table->v[i]->name) & (newSize - 1); newV[j]; j == 0 ? j = newSize - 1 : --j) ; newV[j] = table->v[i]; } free(table->v); table->v = newV; table->size = newSize; table->usedLim = newSize/2; for (i = h & (table->size - 1); table->v[i]; i == 0 ? i = table->size - 1 : --i) ; } } table->v[i] = calloc(1, createSize); if (!table->v[i]) return 0; table->v[i]->name = name; (table->used)++; return table->v[i]; } void hashTableDestroy(HASH_TABLE *table) { size_t i; for (i = 0; i < table->size; i++) { NAMED *p = table->v[i]; if (p) free(p); } free(table->v); } void hashTableInit(HASH_TABLE *p) { p->size = 0; p->usedLim = 0; p->used = 0; p->v = 0; } void hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) { iter->p = table->v; iter->end = iter->p + table->size; } NAMED *hashTableIterNext(HASH_TABLE_ITER *iter) { while (iter->p != iter->end) { NAMED *tem = *(iter->p)++; if (tem) return tem; } return 0; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._hashtable.h000644 000765 000024 00000000430 12161600406 022417 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/hashtable.h000644 000765 000024 00000002267 12161600406 022214 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include #ifdef XML_UNICODE typedef const wchar_t *KEY; #else typedef const char *KEY; #endif typedef struct { KEY name; } NAMED; typedef struct { NAMED **v; size_t size; size_t used; size_t usedLim; } HASH_TABLE; NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize); void hashTableInit(HASH_TABLE *); void hashTableDestroy(HASH_TABLE *); typedef struct { NAMED **p; NAMED **end; } HASH_TABLE_ITER; void hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); NAMED *hashTableIterNext(HASH_TABLE_ITER *); ./xotcl-1.6.8/library/xml/TclExpat-1.1/._iasciitab.h000644 000765 000024 00000000430 12161600406 022414 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/iasciitab.h000644 000765 000024 00000004505 12161600406 022206 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ /* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, /* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_NMSTRT, BT_SEMI, /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, ./xotcl-1.6.8/library/xml/TclExpat-1.1/._latin1tab.h000644 000765 000024 00000000430 12161600406 022343 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/latin1tab.h000644 000765 000024 00000004463 12161600406 022140 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ /* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, /* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, /* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, /* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, ./xotcl-1.6.8/library/xml/TclExpat-1.1/._Makefile.in000644 000765 000024 00000000430 12326517174 022374 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/Makefile.in000644 000765 000024 00000036637 12326517174 022201 0ustar00neumannstaff000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2003 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: Makefile.in,v 1.5 2007/08/14 16:38:27 neumann Exp $ #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ bindir = @bindir@ libdir = @libdir@ datadir = @datadir@ mandir = @mandir@ includedir = @includedir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ CLEANFILES = @CLEANFILES@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_FLAGS = @SHLIB_LD_FLAGS@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ # This is necessary for packages that use private Tcl headers #TCL_TOP_DIR_NATIVE = @TCL_TOP_DIR_NATIVE@ # Not used, but retained for reference of what libs Tcl required TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \ @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(top_builddir)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) SHARED_BUILD = @SHARED_BUILD@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ EXTRA_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(EXTRA_CFLAGS) DEFS = @DEFS@ $(EXTRA_CFLAGS) CONFIG_CLEAN_FILES = Makefile CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = ar CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target inclues executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) pkgIndex.tcl libraries: doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries install-doc install-binaries: binaries install-lib-binaries install-bin-binaries if test "x$(SHARED_BUILD)" = "x1"; then \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # This rule installs platform-independent files, such as header files. #======================================================================== install-libraries: libraries @mkdir -p $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @if test -n "$(PKG_HEADERS)" ; then \ for i in "$(PKG_HEADERS)" ; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; \ fi #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc #install-doc: doc # @mkdir -p $(DESTDIR)$(mandir)/mann # @echo "Installing documentation in $(DESTDIR)$(mandir)" # @for i in $(srcdir)/doc/*.n; do \ # echo "Installing $$i"; \ # rm -f $(DESTDIR)$(mandir)/mann/`basename $$i`; \ # $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ # done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Create the pkgIndex.tcl file. # It is usually easiest to let Tcl do this for you with pkg_mkIndex, but # you may find that you need to customize the package. If so, either # modify the -hand version, or create a pkgIndex.tcl.in file and have # the configure script output the pkgIndex.tcl by editing configure.in. #======================================================================== pkgIndex.tcl: ( echo pkg_mkIndex . $(PKG_LIB_FILE) \; exit; ) | $(TCLSH) pkgIndex.tcl-hand: (echo 'package ifneeded xotcl::xml::expat $(PACKAGE_VERSION) \ [list load [file join $$dir $(PKG_LIB_FILE)]]'\ ) > pkgIndex.tcl #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = gtar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean mkdir -p $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in cp -p $(srcdir)/*.[ch] $(DIST_DIR)/ mkdir $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ mkdir $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: @mkdir -p $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: @mkdir -p $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done .SUFFIXES: .c .$(OBJEXT) Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ./xotcl-1.6.8/library/xml/TclExpat-1.1/._Makefile.vc000644 000765 000024 00000000430 12161600406 022362 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/Makefile.vc000644 000765 000024 00000014512 12161600406 022153 0ustar00neumannstaff000000 000000 ###################################################################### # # XOTclExpat Makefile for Visual C++ # ###################################################################### # Be sure to adapt the "configs.vc" file in the toplevel directory # to your system settings. !include "..\..\..\win\configs.vc" BINROOT = . ROOT = .. NAMEPREFIX = lib NAME = xotclexpat XOTCL_DIR = ..\..\.. GENERICDIR = . WINDIR = . ###################################################################### !if $(DEBUG) TMPNAME = Debug DBGX = d !else TMPNAME = Release DBGX = !endif TMP_DIR = $(BINROOT)\$(TMPNAME) OUT_DIR = $(TMP_DIR) !if $(STATIC_BUILD) OUTNAME = $(NAMEPREFIX)$(NAME)$(XOTCL_VERSION)$(DBGX) TARGET = "$(OUT_DIR)\$(OUTNAME).lib" !else OUTNAME = $(NAMEPREFIX)$(NAME)$(XOTCL_VERSION)$(DBGX) IMPLIB = "$(OUT_DIR)\$(OUTNAME).lib" TARGET = "$(OUT_DIR)\$(OUTNAME).dll" !endif TCLSTUBLIB = "$(TCLROOT)\win\Release\tclstub$(TCL_VERSION).lib" TCLIMPLIB = "$(TCLROOT)\win\$(OUT_DIR)\tcl$(TCL_VERSION)$(DBGX).lib" TCLSH = "$(TCLROOT)\win\$(OUT_DIR)\tclsh$(TCL_VERSION)$(DBGX).exe" XOTCLSTUBLIB = "$(XOTCL_DIR)\win\Release\libxotclstub$(XOTCL_VERSION).lib" XOTCLIMPLIB = "$(XOTCL_DIR)\win\$(OUT_DIR)\libxotcl$(XOTCL_VERSION)$(DBGX).lib" LIB_INSTALL_DIR = $(INSTALLDIR)\lib BIN_INSTALL_DIR = $(INSTALLDIR)\bin SCRIPT_INSTALL_DIR = $(INSTALLDIR)\lib\xotcl$(XOTCL_VERSION) INCLUDE_INSTALL_DIR = $(INSTALLDIR)\include OBJS = $(TMP_DIR)\xmltok.obj \ $(TMP_DIR)\xmlrole.obj \ $(TMP_DIR)\xmlwf.obj \ $(TMP_DIR)\codepage.obj \ $(TMP_DIR)\xmlparse.obj \ $(TMP_DIR)\hashtable.obj \ $(TMP_DIR)\win32filemap.obj \ $(TMP_DIR)\tclexpat.obj \ !if $(STATIC_BUILD) == 0 $(TMP_DIR)\dllEntryPoint.obj !endif ###################################################################### # Link flags ###################################################################### !if $(DEBUG) ldebug = -debug:full -debugtype:cv -pdb:none !else ldebug = -release -opt:ref !endif # declarations common to all linker options lcommon = -nologo -link50compat -machine:$(MACHINE) LFLAGS = $(lcommon) -subsystem:windows -dll !if $(USE_TCL_STUBS) == 0 LLIBS = $(TCLIMPLIB) $(XOTCLIMPLIB) !else ### should be: ### LLIBS = $(TCLSTUBLIB) $(XOTCLSTUBLIB) when xotcl stub lib is mature ### LLIBS = $(TCLSTUBLIB) $(XOTCLIMPLIB) LLIBS = $(TCLSTUBLIB) $(XOTCLSTUBLIB) !endif ###################################################################### # Compile flags ###################################################################### !IF $(DEBUG) == 0 !IF "$(MACHINE)" == "ALPHA" # MSVC on Alpha doesn't understand -Ot cdebug = -O2i !ELSE cdebug = -Ox !ENDIF !ELSE !if $(MSDEV_VER) < 6 cdebug = -Zi -Od -WX !else cdebug = -ZI -Od -WX !endif !ENDIF !if $(STATIC_BUILD) cdll = !else cdll = -GD !endif # declarations common to all compiler options ccommon = -nologo -c -W3 -YX \ !if $(STATIC_BUILD) && $(NOMSVCRT) crt = -MT$(DBGX) !else crt = -MD$(DBGX) !endif INCLUDES = -I"$(TCLROOT)\generic" -I"$(XOTCL_DIR)\generic" -I"." DEFINES = -DBUILD_$(NAME) -DTCL_THREADS=1 \ -DXOLIBPKG=$(INST_XOLIBPKG) \ -DXOTCLVERSION=$(XOTCLVERSION) \ -DPACKAGE_VERSION=$(XOTCLVERSION) \ -DVERSION=$(XOTCLVERSION) \ -DXOTCLPATCHLEVEL=$(XOTCLPATCHLEVEL) \ -D__WIN32__ -DVISUAL_CC EXE_CFLAGS = $(ccommon) $(cdebug) $(crt) $(cdll) $(INCLUDES) $(DEFINES) !if $(USE_TCL_STUBS) #CFLAGS = $(EXE_CFLAGS) -DUSE_TCL_STUBS CFLAGS = $(EXE_CFLAGS) -DUSE_TCL_STUBS -DUSE_XOTCL_STUBS !else CFLAGS = $(EXE_CFLAGS) !endif ###################################################################### # Project specific targets ###################################################################### all : libs libs : setup $(TARGET) copy $(TARGET) .. setup : @$(vcvars) > nul @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) &\ echo Created directory '$(TMP_DIR)' @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) &\ echo Created directory '$(OUT_DIR)' $(TARGET) : $(OBJS) !if $(STATIC_BUILD) $(lib32) -nologo -machine:$(MACHINE) -out:$@ @<< !else $(link32) $(LFLAGS) -base:@$(XOTCL_DIR)\win\dllBase.txt,$@ -out:$@ $(LLIBS) @<< !endif $(OBJS) << install : all if not exist "$(INSTALLDIR)" mkdir "$(INSTALLDIR)" if not exist "$(BIN_INSTALL_DIR)" mkdir "$(BIN_INSTALL_DIR)" if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)" if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" if not exist "$(INCLUDE_INSTALL_DIR)" mkdir "$(INCLUDE_INSTALL_DIR)" copy $(TARGET) "$(SCRIPT_INSTALL_DIR)" ###################################################################### # Inference rules. Use batch-mode when supported. ###################################################################### !if $(_NMAKE_VER) < 162 {$(WINDIR)}.c{$(TMP_DIR)}.obj : !else {$(WINDIR)}.c{$(TMP_DIR)}.obj :: !endif $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$(TMP_DIR)\ @<< $< << !if $(_NMAKE_VER) < 162 {$(GENERICDIR)}.c{$(TMP_DIR)}.obj : !else {$(GENERICDIR)}.c{$(TMP_DIR)}.obj :: !endif $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$(TMP_DIR)\ @<< $< << #$(TMP_DIR)\xmltok.obj : expat\xmltok\xmltok.c # $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$@ $? #$(TMP_DIR)\xmlrole.obj : expat\xmltok\xmlrole.c # $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$@ $? #$(TMP_DIR)\xmlwf.obj : expat\xmlwf\xmlwf.c # $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$@ $? #$(TMP_DIR)\readfilemap.obj : expat\xmlwf\readfilemap.c # $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$@ $? #$(TMP_DIR)\codepage.obj : expat\xmlwf\codepage.c # $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$@ $? #$(TMP_DIR)\xmlparse.obj : expat\xmlparse\xmlparse.c # $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$@ $? #$(TMP_DIR)\hashtable.obj : expat\xmlparse\hashtable.c # $(cc32) -DDLL_BUILD $(CFLAGS) -Fo$@ $? #{$(RCDIR)}.rc{$(TMP_DIR)}.res : # $(rc32) -fo $@ -DDEBUG=$(DEBUG) $(XOTCL_VERSION_DEFINES) $(XOTCL_INCLUDES) $(TCL_INCLUDES) $(XOTCL_DEFINES) $< ###################################################################### # Clean up ###################################################################### tidy : -del $(TMP_DIR)\*.pch -del $(TMP_DIR)\*.obj -del $(TMP_DIR)\*.res -del .\*.pch -del .\*.pdb clean : tidy -del $(OUT_DIR)\*.exp -del $(OUT_DIR)\*.lib -del $(OUT_DIR)\*.dll -del ..\*.exp -del ..\*.lib -del ..\*.dll distclean : clean -rmdir $(OUT_DIR) -rmdir $(TMP_DIR) ./xotcl-1.6.8/library/xml/TclExpat-1.1/._nametab.h000644 000765 000024 00000000430 12161600406 022073 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/nametab.h000644 000765 000024 00000015612 12161600406 021666 0ustar00neumannstaff000000 000000 static const unsigned namingBitmap[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, 0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, 0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, 0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, 0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, 0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, 0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, 0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, 0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, 0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, 0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, 0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, 0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, 0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, 0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, 0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, 0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, 0x40000000, 0xF580C900, 0x00000007, 0x02010800, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, 0x00000000, 0x00004C40, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, 0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, 0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, 0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, 0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, 0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, 0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, 0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, 0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, 0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, 0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, 0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, 0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, 0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, 0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, 0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, 0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, 0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, 0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, 0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, 0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, 0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, }; static const unsigned char nmstrtPages[] = { 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char namePages[] = { 0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, 0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; ./xotcl-1.6.8/library/xml/TclExpat-1.1/._readfilemap.c000644 000765 000024 00000000430 12161600406 022730 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/readfilemap.c000644 000765 000024 00000003664 12161600406 022527 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include #include #include #include #include #ifndef S_ISREG #ifndef S_IFREG #define S_IFREG _S_IFREG #endif #ifndef S_IFMT #define S_IFMT _S_IFMT #endif #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif /* not S_ISREG */ #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 #endif #endif int filemap(const char *name, void (*processor)(const void *, size_t, const char *, void *arg), void *arg) { size_t nbytes; int fd; int n; struct stat sb; void *p; fd = open(name, O_RDONLY|O_BINARY); if (fd < 0) { perror(name); return 0; } if (fstat(fd, &sb) < 0) { perror(name); close(fd); return 0; } if (!S_ISREG(sb.st_mode)) { fprintf(stderr, "%s: not a regular file\n", name); close(fd); return 0; } nbytes = sb.st_size; p = malloc(nbytes); if (!p) { fprintf(stderr, "%s: out of memory\n", name); close(fd); return 0; } n = read(fd, p, nbytes); if (n < 0) { perror(name); close(fd); free(p); return 0; } if (n != nbytes) { fprintf(stderr, "%s: read unexpected number of bytes\n", name); close(fd); free(p); return 0; } processor(p, nbytes, name, arg); free(p); close(fd); return 1; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._readme000644 000765 000024 00000000430 12161600406 021473 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/readme000644 000765 000024 00000011716 12161600406 021267 0ustar00neumannstaff000000 000000 A Tcl interface to expat. Steve Ball, Zveno Pty Ltd. This package provides a Tcl interface to James Clark's expat library. It creates a Tcl package, called "expat", which defines a single new Tcl command "expat". See for more information on XML support for Tcl. INSTALLATION ============ Unix/Linux ---------- You must have Tcl/Tk version 8.0p2 or 8.1a2 installed on your system. TclExpat has been setup to use Tcl's configuration to make compilation easy. Simply point TclExpat's Makefile at the Tcl configuration file: /bin/sh '. /usr/local/tcl/lib/tclConfig.sh ; make -e' where "/usr/local/tcl" is the installation path for Tcl. To install the package in the first available directory in the Tcl package path use the command below. You may need to be root to do this. /bin/sh '. /usr/local/tcl/lib/tclConfig.sh ; make -e install' Macintosh --------- The source must be compiled against the Tcl/Tk version 8.0p2 release. A pre-compiled shareware distribution is available from Zveno, see below. Windows ------- The source must be compiled against the Tcl/Tk version 8.0p2 release. A pre-compiled shareware distribution is available from Zveno, see below. SHAREWARE ========= Binary distributions for the Macintosh and Windows platforms are available from Zveno. See USAGE ===== The package is loaded using: package require expat 1.0 This package defines the "expat" command which is used to create a parser. It accepts the following arguments: expat parserName ?option value...? If no "parserName" argument is given then a unique name is chosen. The name of the newly created parser is returned and a new Tcl command of the same name is created to manipulate the parser. The parser command accepts the following methods: $parser cget -option Returns the current value of an option. $parser configure -option value ?-option value...? Sets configuration options. $parser parse xml Parses the XML data given by "xml". This will cause Tcl callback scripts to be invoked, if they have been configured. If the document is not well-formed then the command returns an error. $parser reset Resets the parser. Call this method before parsing a new document. The following options are accepted: -elementstartcommand command Defines a callback script which is invoked when the start of an element is found in the document. The following arguments are appended to the string before it is evaluated: command name attributelist "name" is the name of the element. "attributelist" is the attribute list for the element. -elementendcommand command Defines a callback script which is invoked whenever an element is closed in the document. The following arguments are appended to the string before it is evaluated: command name "name" is the name of the element. -characterdatacommand command Defines a callback script which is invoked whenever character data is encountered in the document. The following arguments are appended to the string before it is evaluated: command data "data" is the character data found in the document. -processinginstructioncommand command Defines a callback script which is invoked whenever a processing instruction is encountered in the document. The following arguments are appended to the string before it is evaluated: command target data "target" is the target of the PI. "data" is additional data found in the PI. -externalentitycommand command Defines a callback script which is invoked whenever an externally parsed general entity is encountered in the document. The following arguments are appended to the string before it is evaluated: command names base systemid publicid "names" is a list of the open entity names. "base" is a URL to be used for resolving relative URLs. "systemid" is the system identifier specified in the entity declaration "publicid" is the public identifier specified in the entity declaration -defaultcommand command Invoked when no other callback has been defined for a document feature which has been encountered. -unparsedentitydeclcommand command Invoked when an unparsed entity declaration is encountered. -notationdeclcommand command Invoked when a notation declaration is encountered. -unknownencodingcommand command Invoked when a character is encountered which has an unknown encoding. -baseurl URL Specifies a base URL to use for resolving relative URLs. -final boolean Specifies whether more data is to be parsed. Callback scripts Tcl callback scripts may use the "break", "continue" and "error" commands to alter the flow of control. break Suppresses invocation of further callback scripts. continue Suppresses invocation of further callback scripts until the current element has finished. error Suppresses invocation of further callback scripts. The parser also returns an error condition../xotcl-1.6.8/library/xml/TclExpat-1.1/._tcl.m4000644 000765 000024 00000000521 12326520414 021343 0ustar00neumannstaff000000 000000 Mac OS X  2QATTRQ¸™¸€com.apple.acl.text8com.apple.quarantine!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity q/0001;5341449d;Firefox;./xotcl-1.6.8/library/xml/TclExpat-1.1/tcl.m4000644 000765 000024 00000405647 12326520414 021150 0ustar00neumannstaff000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef _WIN32 #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) INSTALL_DATA="\${INSTALL} -m 644" AC_SUBST(INSTALL_DATA) INSTALL_PROGRAM="\${INSTALL}" AC_SUBST(INSTALL_PROGRAM) INSTALL_SCRIPT="\${INSTALL}" AC_SUBST(INSTALL_SCRIPT) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ./xotcl-1.6.8/library/xml/TclExpat-1.1/tclconfig/._install-sh000755 000765 000024 00000000430 12327660022 024273 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/tclconfig/install-sh000755 000765 000024 00000033054 12327660022 024066 0ustar00neumannstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -S $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ./xotcl-1.6.8/library/xml/TclExpat-1.1/._tclexpat.c000644 000765 000024 00000000430 12161600406 022303 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/tclexpat.c000644 000765 000024 00000107175 12161600406 022104 0ustar00neumannstaff000000 000000 /* * tclexpat.c -- * * A Tcl interface to James Clark's expat XML parser * * Copyright (c) 1998 Steve Ball, Zveno Pty Ltd * * Zveno Pty Ltd makes this software and associated documentation * available free of charge for any purpose. You may make copies * of the software but you must include all of this notice on any copy. * * Zveno Pty Ltd does not warrant that this software is error free * or fit for any purpose. Zveno Pty Ltd disclaims any liability for * all claims, expenses, losses, damages and costs any user may incur * as a result of using, copying or modifying the software. * */ #include #include #include #include "xmlparse.h" /* * The structure below is used to refer to an expat parser object. */ typedef struct TclExpatInfo { XML_Parser parser; /* The expat parser structure */ Tcl_Interp *interp; /* Interpreter for this instance */ Tcl_Obj *name; /* name of this instance */ int final; /* input data complete? */ int status; /* application status */ Tcl_Obj *result; /* application return result */ int continueCount; /* reference count for continue */ Tcl_Obj *elementstartcommand; /* Script for element start */ Tcl_Obj *elementendcommand; /* Script for element end */ Tcl_Obj *datacommand; /* Script for character data */ Tcl_Obj *picommand; /* Script for processing instruction */ Tcl_Obj *defaultcommand; /* Script for default data */ Tcl_Obj *unparsedcommand; /* Script for unparsed entity declaration */ Tcl_Obj *notationcommand; /* Script for notation declaration */ Tcl_Obj *externalentitycommand; /* Script for external entity */ Tcl_Obj *unknownencodingcommand; /* Script for unknown character encoding */ } TclExpatInfo; /* * Prototypes for procedures defined later in this file: */ static Tcl_ObjCmdProc TclExpatObjCmd; static Tcl_ObjCmdProc TclExpatInstanceCmd; static Tcl_CmdDeleteProc TclExpatDeleteCmd; static int (TclExpatCreateParser) _ANSI_ARGS_((Tcl_Interp *interp, TclExpatInfo *expat)); static void (TclExpatFreeParser) _ANSI_ARGS_((TclExpatInfo *expat)); static int (TclExpatParse) _ANSI_ARGS_((Tcl_Interp *interp, TclExpatInfo *expat, char *data, size_t len)); static int (TclExpatConfigure) _ANSI_ARGS_((Tcl_Interp *interp, TclExpatInfo *expat, int objc, Tcl_Obj *CONST objv[])); static int (TclExpatCget) _ANSI_ARGS_((Tcl_Interp *interp, TclExpatInfo *expat, int objc, Tcl_Obj *CONST objv[])); static void * (TclExpatElementStartHandler) _ANSI_ARGS_((void *userdata, const XML_Char *name, const XML_Char **atts)); static void * (TclExpatElementEndHandler) _ANSI_ARGS_((void *userData, const XML_Char *name)); static void * (TclExpatCharacterDataHandler) _ANSI_ARGS_((void *userData, const XML_Char *s, int len)); static void * (TclExpatProcessingInstructionHandler) _ANSI_ARGS_((void *userData, const XML_Char *target, const XML_Char *data)); static void * (TclExpatExternalEntityRefHandler) _ANSI_ARGS_((XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId)); static void * (TclExpatDefaultHandler) _ANSI_ARGS_ ((void *userData, const XML_Char *s, int len)); static void * (TclExpatUnparsedDeclHandler) _ANSI_ARGS_ ((void *userData, const XML_Char *entityname, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName)); static void * (TclExpatNotationDeclHandler) _ANSI_ARGS_ ((void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId)); static int (TclExpatUnknownEncodingHandler) _ANSI_ARGS_ ((void *encodingHandlerData, const XML_Char *name, XML_Encoding *info)); #if defined(PRE81) /* *---------------------------------------------------------------------------- * * Tcl_GetString -- * * Compatibility routine for Tcl 8.0 * * Results: * String representation of object.. * * Side effects: * None. * *---------------------------------------------------------------------------- */ char * Tcl_GetString (obj) Tcl_Obj *obj; /* Object to retrieve string from. */ { char *s; int i; s = Tcl_GetStringFromObj(obj, &i); return s; } #endif /* *---------------------------------------------------------------------------- * * TclExpat_Init -- * * Initialisation routine for loadable module * * Results: * None. * * Side effects: * Defines "expat" command in the interpreter. * *---------------------------------------------------------------------------- */ /* this should be done via the stubs ... for the time being simply export */ #ifdef VISUAL_CC DLLEXPORT extern int Xotclexpat_Init(Tcl_Interp * interp); # define CONST_XOTCL_EXPAT #else # if defined(PRE84) # define CONST_XOTCL_EXPAT # else # define CONST_XOTCL_EXPAT CONST84 # endif #endif extern int Xotclexpat_Init (interp) Tcl_Interp *interp; /* Interpreter to initialise. */ { #ifdef USE_TCL_STUBS if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { return TCL_ERROR; } #ifdef USE_XOTCL_STUBS if (Xotcl_InitStubs(interp, "1.1", 0) == NULL) { return TCL_ERROR; } #endif #else if (Tcl_PkgRequire(interp, "Tcl", TCL_VERSION, 0) == NULL) { return TCL_ERROR; } #endif Tcl_PkgProvide(interp, "xotcl::xml::expat", PACKAGE_VERSION); Tcl_CreateObjCommand(interp, "expat", TclExpatObjCmd, NULL, NULL); return TCL_OK; } /* *---------------------------------------------------------------------------- * * TclExpatObjCmd -- * * Creation command for expat class. * * Results: * The name of the newly created parser instance. * * Side effects: * This creates an expat parser. * *---------------------------------------------------------------------------- */ int TclExpatObjCmd(dummy, interp, objc, objv) ClientData dummy; Tcl_Interp *interp; int objc; Tcl_Obj *CONST objv[]; { TclExpatInfo *expat; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "name ?args?"); return TCL_ERROR; } /* * Create the data structures for this parser. */ if (!(expat = (TclExpatInfo *) ckalloc(sizeof(TclExpatInfo)))) { ckfree((char*)expat); Tcl_SetResult(interp, "unable to create parser", NULL); return TCL_ERROR; } expat->interp = interp; Tcl_IncrRefCount(objv[1]); expat->name = objv[1]; expat->elementstartcommand = NULL; expat->elementendcommand = NULL; expat->datacommand = NULL; expat->picommand = NULL; expat->defaultcommand = NULL; expat->unparsedcommand = NULL; expat->notationcommand = NULL; expat->externalentitycommand = NULL; expat->unknownencodingcommand = NULL; if (TclExpatCreateParser(interp, expat) != TCL_OK) { ckfree((char*)expat); return TCL_ERROR; } /* * Register a Tcl command for this parser instance. */ Tcl_CreateObjCommand(interp, Tcl_GetString(expat->name), TclExpatInstanceCmd, (ClientData) expat, TclExpatDeleteCmd); /* * Handle configuration options */ if (objc > 2) { TclExpatConfigure(interp, expat, objc - 2, objv + 2); } Tcl_SetObjResult(interp, expat->name); return TCL_OK; } /* *---------------------------------------------------------------------------- * * TclExpatCreateParser -- * * Create the expat parser and initialise (some of) the TclExpatInfo * structure. * * Note that callback commands are not affected by this routine, * to allow a reset to leave these intact. * * Results: * New parser instance created and initialised. * * Side effects: * Creates an expat parser. * Modifies TclExpatInfo fields. * *---------------------------------------------------------------------------- */ int TclExpatCreateParser(interp, expat) Tcl_Interp *interp; TclExpatInfo *expat; { if (!(expat->parser = XML_ParserCreate(NULL))) { Tcl_SetResult(interp, "unable to create expat parser", NULL); return TCL_ERROR; } expat->final = 1; expat->status = TCL_OK; expat->result = NULL; expat->continueCount = 0; /* * Set handlers for the parser to routines in this module. */ XML_SetElementHandler(expat->parser, (XML_StartElementHandler) TclExpatElementStartHandler, (XML_EndElementHandler) TclExpatElementEndHandler); XML_SetCharacterDataHandler(expat->parser, (XML_CharacterDataHandler) TclExpatCharacterDataHandler); XML_SetProcessingInstructionHandler(expat->parser, (XML_ProcessingInstructionHandler) TclExpatProcessingInstructionHandler); XML_SetDefaultHandler(expat->parser, (XML_DefaultHandler) TclExpatDefaultHandler); XML_SetUnparsedEntityDeclHandler(expat->parser, (XML_UnparsedEntityDeclHandler) TclExpatUnparsedDeclHandler); XML_SetNotationDeclHandler(expat->parser, (XML_NotationDeclHandler) TclExpatNotationDeclHandler); XML_SetExternalEntityRefHandler(expat->parser, (XML_ExternalEntityRefHandler) TclExpatExternalEntityRefHandler); XML_SetUnknownEncodingHandler(expat->parser, (XML_UnknownEncodingHandler) TclExpatUnknownEncodingHandler, (void *) expat); XML_SetUserData(expat->parser, (void *) expat); return TCL_OK; } /* *---------------------------------------------------------------------------- * * TclExpatFreeParser -- * * Destroy the expat parser structure. * * Results: * None. * * Side effects: * Frees any memory allocated for the XML parser. * *---------------------------------------------------------------------------- */ void TclExpatFreeParser(expat) TclExpatInfo *expat; { XML_ParserFree(expat->parser); expat->parser = NULL; } /* *---------------------------------------------------------------------------- * * TclExpatInstanceCmd -- * * Implements instance command for expat class objects. * * Results: * Depends on the method. * * Side effects: * Depends on the method. * *---------------------------------------------------------------------------- */ int TclExpatInstanceCmd (clientData, interp, objc, objv) ClientData clientData; Tcl_Interp *interp; int objc; Tcl_Obj *CONST objv[]; { TclExpatInfo *expat = (TclExpatInfo *) clientData; char *data; int len; int index, result = TCL_OK; static char CONST_XOTCL_EXPAT *options[] = { "configure", "cget", "parse", "reset", NULL }; enum options { EXPAT_CONFIGURE, EXPAT_CGET, EXPAT_PARSE, EXPAT_RESET }; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "method ?args?"); return TCL_ERROR; } if (Tcl_GetIndexFromObj(interp, objv[1], options, "option", 0, &index) != TCL_OK) { return TCL_ERROR; } switch ((enum options) index) { case EXPAT_CONFIGURE: result = TclExpatConfigure(interp, (TclExpatInfo *) clientData, objc - 2, objv + 2); break; case EXPAT_CGET: result = TclExpatCget(interp, (TclExpatInfo *) clientData, objc - 2, objv + 2); break; case EXPAT_PARSE: if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "data"); return TCL_ERROR; } data = Tcl_GetStringFromObj(objv[2], &len); result = TclExpatParse(interp, expat, data, (size_t)len); break; case EXPAT_RESET: if (objc > 2) { Tcl_WrongNumArgs(interp, 1, objv, ""); return TCL_ERROR; } /* * Destroy the parser and create a fresh one. */ TclExpatFreeParser(expat); TclExpatCreateParser(interp, expat); break; default: Tcl_SetResult(interp, "unknown method", NULL); return TCL_ERROR; } return result; } /* *---------------------------------------------------------------------------- * * TclExpatParse -- * * Wrapper to invoke expat parser and check return result. * * Results: * TCL_OK if no errors, TCL_ERROR otherwise. * * Side effects: * Sets interpreter result as appropriate. * *---------------------------------------------------------------------------- */ int TclExpatParse (interp, expat, data, len) Tcl_Interp *interp; TclExpatInfo *expat; char *data; size_t len; { int result; char s[255]; expat->status = TCL_OK; if (expat->result != NULL) { Tcl_DecrRefCount(expat->result); } expat->result = NULL; result = XML_Parse(expat->parser, data, len, expat->final); if (!result) { Tcl_ResetResult(interp); sprintf(s, "%d", XML_GetCurrentLineNumber(expat->parser)); Tcl_AppendResult(interp, "error \"", XML_ErrorString(XML_GetErrorCode(expat->parser)), "\" at line ", s, " character ", NULL); sprintf(s, "%d", XML_GetCurrentColumnNumber(expat->parser)); Tcl_AppendResult(interp, s, NULL); return TCL_ERROR; } switch (expat->status) { case TCL_OK: case TCL_BREAK: case TCL_CONTINUE: Tcl_ResetResult(interp); return TCL_OK; case TCL_ERROR: Tcl_SetObjResult(interp, expat->result); return TCL_ERROR; default: Tcl_SetResult(interp, "unknown parsing status", NULL); return TCL_ERROR; } } /* *---------------------------------------------------------------------------- * * TclExpatConfigure -- * * Implements instance command for expat class objects. * * Results: * Depends on the method. * * Side effects: * Depends on the method. * *---------------------------------------------------------------------------- */ int TclExpatConfigure (interp, expat, objc, objv) Tcl_Interp *interp; TclExpatInfo *expat; int objc; Tcl_Obj *CONST objv[]; { static CONST_XOTCL_EXPAT char *switchTable[] = { "-final", "-baseurl", "-elementstartcommand", "-elementendcommand", "-characterdatacommand", "-processinginstructioncommand", "-defaultcommand", "-unparsedentitydeclcommand", "-notationdeclcommand", "-externalentitycommand", "-unknownencodingcommand", (char *) NULL }; enum switches { EXPAT_FINAL, EXPAT_BASE, EXPAT_ELEMENTSTARTCMD, EXPAT_ELEMENTENDCMD, EXPAT_DATACMD, EXPAT_PICMD, EXPAT_DEFAULTCMD, EXPAT_UNPARSEDENTITYCMD, EXPAT_NOTATIONCMD, EXPAT_EXTERNALENTITYCMD, EXPAT_UNKNOWNENCODINGCMD }; int index, bool, doParse = 0; Tcl_Obj *CONST *objPtr = objv; while (objc > 1) { if (Tcl_GetIndexFromObj(interp, objPtr[0], switchTable, "switch", 0, &index) != TCL_OK) { return TCL_ERROR; } switch ((enum switches) index) { case EXPAT_FINAL: /* -final */ if (Tcl_GetBooleanFromObj(interp, objPtr[1], &bool) != TCL_OK) { return TCL_ERROR; } if (bool && !expat->final) { expat->final = bool; doParse = 1; } else if (!bool && expat->final) { /* * Reset the parser for new input */ TclExpatFreeParser(expat); TclExpatCreateParser(interp, expat); doParse = 0; } break; case EXPAT_BASE: /* -base */ if (XML_SetBase(expat->parser, Tcl_GetString(objPtr[1])) == 0) { Tcl_SetResult(interp, "unable to set base URL", NULL); return TCL_ERROR; } break; case EXPAT_ELEMENTSTARTCMD: /* -elementstartcommand */ if (expat->elementstartcommand != NULL) { Tcl_DecrRefCount(expat->elementstartcommand); } expat->elementstartcommand = objPtr[1]; Tcl_IncrRefCount(expat->elementstartcommand); break; case EXPAT_ELEMENTENDCMD: /* -elementendcommand */ if (expat->elementendcommand != NULL) { Tcl_DecrRefCount(expat->elementendcommand); } expat->elementendcommand = objPtr[1]; Tcl_IncrRefCount(expat->elementendcommand); break; case EXPAT_DATACMD: /* -characterdatacommand */ if (expat->datacommand != NULL) { Tcl_DecrRefCount(expat->datacommand); } expat->datacommand = objPtr[1]; Tcl_IncrRefCount(expat->datacommand); break; case EXPAT_PICMD: /* -processinginstructioncommand */ if (expat->picommand != NULL) { Tcl_DecrRefCount(expat->picommand); } expat->picommand = objPtr[1]; Tcl_IncrRefCount(expat->picommand); break; case EXPAT_DEFAULTCMD: /* -defaultcommand */ if (expat->defaultcommand != NULL) { Tcl_DecrRefCount(expat->defaultcommand); } expat->defaultcommand = objPtr[1]; Tcl_IncrRefCount(expat->defaultcommand); break; case EXPAT_UNPARSEDENTITYCMD: /* -unparsedentitydeclcommand */ if (expat->unparsedcommand != NULL) { Tcl_DecrRefCount(expat->unparsedcommand); } expat->unparsedcommand = objPtr[1]; Tcl_IncrRefCount(expat->unparsedcommand); break; case EXPAT_NOTATIONCMD: /* -notationdeclcommand */ if (expat->notationcommand != NULL) { Tcl_DecrRefCount(expat->notationcommand); } expat->notationcommand = objPtr[1]; Tcl_IncrRefCount(expat->notationcommand); break; case EXPAT_EXTERNALENTITYCMD: /* -externalentitycommand */ if (expat->externalentitycommand != NULL) { Tcl_DecrRefCount(expat->externalentitycommand); } expat->externalentitycommand = objPtr[1]; Tcl_IncrRefCount(expat->externalentitycommand); break; case EXPAT_UNKNOWNENCODINGCMD: /* -unknownencodingcommand */ /* Not implemented */ break; if (expat->unknownencodingcommand != NULL) { Tcl_DecrRefCount(expat->unknownencodingcommand); } expat->unknownencodingcommand = objPtr[1]; Tcl_IncrRefCount(expat->unknownencodingcommand); break; } objPtr += 2; objc -= 2; } if (doParse) { return TclExpatParse(interp, expat->parser, "", 0); } else { return TCL_OK; } } /* *---------------------------------------------------------------------------- * * TclExpatCget -- * * Returns setting of configuration option. * Not yet implemented. * * Results: * Option value. * * Side effects: * None. * *---------------------------------------------------------------------------- */ int TclExpatCget (interp, expat, objc, objv) Tcl_Interp *interp; TclExpatInfo *expat; int objc; Tcl_Obj *CONST objv[]; { Tcl_SetResult(interp, "method not implemented", NULL); return TCL_ERROR; } /* *---------------------------------------------------------------------------- * * TclExpatHandlerResult -- * * Manage the result of the application callback. * * Results: * None. * * Side Effects: * Further invocation of callback scripts may be inhibited. * *---------------------------------------------------------------------------- */ void TclExpatHandlerResult(expat, result) TclExpatInfo *expat; int result; { switch (result) { case TCL_OK: expat->status = TCL_OK; break; case TCL_CONTINUE: /* * Skip callbacks until the matching end element event * occurs for the currently open element. * Keep a reference count to handle nested * elements. */ expat->status = TCL_CONTINUE; expat->continueCount = 1; break; case TCL_BREAK: /* * Skip all further callbacks, but return OK. */ expat->status = TCL_BREAK; break; case TCL_ERROR: /* * Skip all further callbacks, and return error. */ default: expat->status = TCL_ERROR; expat->result = Tcl_GetObjResult(expat->interp); Tcl_IncrRefCount(expat->result); break; } } /* *---------------------------------------------------------------------------- * * TclExpatElementStartHandler -- * * Called by expat for each start tag. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatElementStartHandler(userData, name, atts) void *userData; const char *name; const char **atts; { TclExpatInfo *expat = (TclExpatInfo *) userData; Tcl_Obj *atList, *cmdPtr; const char **atPtr; int result; if (expat->status == TCL_CONTINUE) { /* * We're currently skipping elements looking for the * close of the continued element. */ expat->continueCount++; return NULL; } if (expat->elementstartcommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Convert the attribute list into a Tcl key-value paired list. */ atList = Tcl_NewListObj(0, NULL); for (atPtr = atts; atPtr[0] && atPtr[1]; atPtr += 2) { Tcl_ListObjAppendElement(expat->interp, atList, Tcl_NewStringObj((char *)atPtr[0], strlen(atPtr[0]))); Tcl_ListObjAppendElement(expat->interp, atList, Tcl_NewStringObj((char *)atPtr[1], strlen(atPtr[1]))); } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->elementstartcommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)name, strlen(name))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, atList); /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatElementEndHandler -- * * Called by expat for each end tag. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatElementEndHandler(userData, name) void *userData; CONST char *name; { TclExpatInfo *expat = (TclExpatInfo *) userData; Tcl_Obj *cmdPtr; int result; if (expat->status == TCL_CONTINUE) { /* * We're currently skipping elements looking for the * end of the currently open element. */ if (!--(expat->continueCount)) { expat->status = TCL_OK; return NULL; } } if (expat->elementendcommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->elementendcommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)name, strlen(name))); /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatCharacterDataHandler -- * * Called by expat for character data. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatCharacterDataHandler(userData, s, len) void *userData; CONST char *s; int len; { TclExpatInfo *expat = (TclExpatInfo *) userData; Tcl_Obj *cmdPtr; int result; if (expat->datacommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->datacommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)s, len)); /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatProcessingInstructionHandler -- * * Called by expat for processing instructions. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatProcessingInstructionHandler(userData, target, data) void *userData; CONST char *target; CONST char *data; { TclExpatInfo *expat = (TclExpatInfo *) userData; Tcl_Obj *cmdPtr; int result; if (expat->picommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->picommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)target, strlen(target))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)data, strlen(data))); /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatDefaultHandler -- * * Called by expat for processing data which has no other handler. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatDefaultHandler(userData, s, len) void *userData; CONST char *s; int len; { TclExpatInfo *expat = (TclExpatInfo *) userData; Tcl_Obj *cmdPtr; int result; if (expat->defaultcommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->defaultcommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)s, len)); /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatUnparsedDeclHandler -- * * Called by expat for processing an unparsed entity references. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatUnparsedDeclHandler(userData, entityname, base, systemId, publicId, notationName) void *userData; CONST char *entityname; CONST char *base; CONST char *systemId; CONST char *publicId; CONST char *notationName; { TclExpatInfo *expat = (TclExpatInfo *) userData; Tcl_Obj *cmdPtr; int result; if (expat->unparsedcommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->unparsedcommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)entityname, strlen(entityname))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)base, strlen(base))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)systemId, strlen(systemId))); if (publicId == NULL) { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL)); } else { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)publicId, strlen(publicId))); } if (notationName == NULL) { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL)); } else { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)notationName, strlen(notationName))); } /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatNotationDeclHandler -- * * Called by expat for processing a notation declaration. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatNotationDeclHandler(userData, notationName, base, systemId, publicId) void *userData; CONST char *notationName; CONST char *base; CONST char *systemId; CONST char *publicId; { TclExpatInfo *expat = (TclExpatInfo *) userData; Tcl_Obj *cmdPtr; int result; if (expat->notationcommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->notationcommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)notationName, strlen(notationName))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)base, strlen(base))); if (systemId == NULL) { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL)); } else { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)systemId, strlen(systemId))); } if (publicId == NULL) { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL)); } else { Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)publicId, strlen(publicId))); } /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatUnknownEncodingHandler -- * * Called by expat for processing a reference to a character in an * unknown encoding. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static int TclExpatUnknownEncodingHandler(encodingHandlerData, name, info) void *encodingHandlerData; CONST char *name; XML_Encoding *info; { TclExpatInfo *expat = (TclExpatInfo *) encodingHandlerData; Tcl_Obj *cmdPtr; int result; Tcl_SetResult(expat->interp, "not implemented", NULL); return 0; if (expat->unknownencodingcommand == NULL || expat->status != TCL_OK) { return 0; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->unknownencodingcommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); /* * Setup the arguments */ /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); /* * NOTE: have to decide whether to return 0 or 1 here, * since Expat is waiting for an answer. */ return 0; } /* *---------------------------------------------------------------------------- * * TclExpatExternalEntityRefHandler -- * * Called by expat for processing external entity references. * * Results: * None. * * Side Effects: * Callback script is invoked. * *---------------------------------------------------------------------------- */ static void * TclExpatExternalEntityRefHandler(parser, openEntityNames, base, systemId, publicId) XML_Parser parser; CONST char *openEntityNames; CONST char *base; CONST char *systemId; CONST char *publicId; { TclExpatInfo *expat = (TclExpatInfo *) XML_GetUserData(parser); Tcl_Obj *cmdPtr; int result; if (expat->externalentitycommand == NULL || expat->status != TCL_OK) { return NULL; } /* * Take a copy of the callback script so that arguments may be appended. */ cmdPtr = Tcl_DuplicateObj(expat->externalentitycommand); Tcl_IncrRefCount(cmdPtr); Tcl_Preserve((ClientData) expat->interp); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)openEntityNames, strlen(openEntityNames))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)base, strlen(base))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)systemId, strlen(systemId))); Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)publicId, strlen(publicId))); /* * It would be desirable to be able to terminate parsing * if the return result is TCL_ERROR or TCL_BREAK. */ #if defined(PRE81) result = Tcl_GlobalEvalObj(expat->interp, cmdPtr); #elif defined(PRE82) result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #else result = Tcl_EvalObjEx(expat->interp, cmdPtr, TCL_EVAL_GLOBAL); #endif Tcl_DecrRefCount(cmdPtr); Tcl_Release((ClientData) expat->interp); TclExpatHandlerResult(expat, result); return NULL; } /* *---------------------------------------------------------------------------- * * TclExpatDeleteCmd -- * * Called when a expat parser is deleted. * * Results: * None. * * Side Effects: * Memory structures are freed. * *---------------------------------------------------------------------------- */ static void TclExpatDeleteCmd(clientData) ClientData clientData; { TclExpatInfo *expat = (TclExpatInfo *) clientData; TclExpatFreeParser(expat); Tcl_DecrRefCount(expat->name); if (expat->elementstartcommand) { Tcl_DecrRefCount(expat->elementstartcommand); } if (expat->elementendcommand) { Tcl_DecrRefCount(expat->elementendcommand); } if (expat->datacommand) { Tcl_DecrRefCount(expat->datacommand); } if (expat->picommand) { Tcl_DecrRefCount(expat->picommand); } if (expat->externalentitycommand) { Tcl_DecrRefCount(expat->externalentitycommand); } } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._test-break.tcl000755 000765 000024 00000000430 12161600406 023063 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/test-break.tcl000755 000765 000024 00000003410 12161600406 022647 0ustar00neumannstaff000000 000000 #!/bin/sh #\ exec tclsh8.1 "$0" "$@" # This tests the function of the break facility lappend auto_path [file dirname [info script]] package require expat proc element {tag name {attrs {}}} { array set at $attrs if {[info exists at(class)]} { switch $at(class) { continue { return -code continue } break { return -code break } error { return -code error "error condition in XML" } } } } proc pi {name args} { if {$name eq "break"} { return -code break } } proc pcdata pcdata { if {[string length [string trim $pcdata]]} { puts $pcdata } } set data(test1) { Should see this data Should not see this data Should not see this data } set data(test2) { Should see this data Should see this data Should not see this data Should not see this data } set data(test3) { Should see this data Should see this data Should not see this data } set parser [expat xmlparser \ -elementstartcommand {element start} \ -elementendcommand {element end} \ -characterdatacommand pcdata \ -processinginstructioncommand pi \ -final yes \ ] foreach {testName testData} [array get data] { puts "*** $testName" $parser reset if {[catch {$parser parse $testData} err]} { puts [list test failed due to $err] } else { puts [list test passed] } } exit 0./xotcl-1.6.8/library/xml/TclExpat-1.1/._test-continue.tcl000755 000765 000024 00000000430 12161600406 023623 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/test-continue.tcl000755 000765 000024 00000003675 12161600406 023424 0ustar00neumannstaff000000 000000 #!/bin/sh #\ exec tclsh8.1 "$0" "$@" # This tests the function of the continue facility lappend auto_path [file dirname [info script]] package require expat proc element {tag name {attrs {}}} { array set at $attrs if {[info exists at(class)]} { switch $at(class) { continue { return -code continue } break { return -code break } error { return -code error "error condition in XML" } } } } proc pi {name args} { if {[regexp {continue|break|error} $name]} { return -code $name } } proc pcdata pcdata { if {[string length [string trim $pcdata]]} { puts $pcdata } } set data(test1) { Should see this data Should not see this data Should see this data } set data(test2) { Should see this data Should see this data Should not see this data Should see this data Should see this data } set data(test3) { Should see this data Should not see this data Should not see this data Should not see this data Should not see this data Should see this data } set parser [expat xmlparser \ -elementstartcommand {element start} \ -elementendcommand {element end} \ -characterdatacommand pcdata \ -final yes \ ] foreach {testName testData} [array get data] { puts "*** $testName" $parser reset if {[catch {$parser parse $testData} err]} { puts [list test failed due to $err] } else { puts [list test passed] } } exit 0./xotcl-1.6.8/library/xml/TclExpat-1.1/._test-error.tcl000755 000765 000024 00000000430 12161600406 023130 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/test-error.tcl000755 000765 000024 00000002326 12161600406 022721 0ustar00neumannstaff000000 000000 #!/bin/sh #\ exec tclsh8.1 "$0" "$@" # This tests the function of the error facility lappend auto_path [file dirname [info script]] package require expat proc element {tag name {attrs {}}} { array set at $attrs if {[info exists at(class)]} { switch $at(class) { continue { return -code continue } break { return -code break } error { return -code error "error condition in XML" } } } } proc pcdata pcdata { if {[string length [string trim $pcdata]]} { puts $pcdata } } set data(error) { Should see this data Should not see this data Should not see this data } set parser [expat xmlparser \ -elementstartcommand {element start} \ -elementendcommand {element end} \ -characterdatacommand pcdata \ -final yes \ ] puts {*** Test error} if {[catch {$parser parse $data(error)} err]} { if {$err ne "error condition in XML" } { puts [list test failed, incorrect error message: $err] } else { puts [list test passed] } } else { puts [list test failed, no error returned] } exit 0./xotcl-1.6.8/library/xml/TclExpat-1.1/._tester000755 000765 000024 00000000430 12161600406 021547 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/tester000755 000765 000024 00000001170 12161600406 021334 0ustar00neumannstaff000000 000000 #!/bin/sh #\ exec tclsh8.1 "$0" "$@" #load ./tclexpat.sl Tclexpat #load ./tclexpat.so Tclexpat lappend auto_path [file dirname [info script]] package require expat proc element {tag name {attrs {}}} { puts [list Element $tag $name $attrs] } proc pcdata pcdata { puts [list Character data: $pcdata] } set ch [open [lindex $argv 0]] set data [read $ch] close $ch puts stderr [list creating parser] set parser [expat xmlparser \ -elementstartcommand {element start} \ -elementendcommand {element end} \ -characterdatacommand pcdata \ -final yes \ ] puts stderr [list parsing document] $parser parse $data exit 0./xotcl-1.6.8/library/xml/TclExpat-1.1/._unixfilemap.c000644 000765 000024 00000000430 12161600406 023000 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/unixfilemap.c000644 000765 000024 00000003122 12161600406 022564 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include #include #include #include #include #include #include #ifndef MAP_FILE #define MAP_FILE 0 #endif #include "filemap.h" int filemap(const char *name, void (*processor)(const void *, size_t, const char *, void *arg), void *arg) { int fd; size_t nbytes; struct stat sb; void *p; fd = open(name, O_RDONLY); if (fd < 0) { perror(name); return 0; } if (fstat(fd, &sb) < 0) { perror(name); close(fd); return 0; } if (!S_ISREG(sb.st_mode)) { close(fd); fprintf(stderr, "%s: not a regular file\n", name); return 0; } nbytes = sb.st_size; p = (void *)mmap((caddr_t)0, (size_t)nbytes, PROT_READ, MAP_FILE|MAP_PRIVATE, fd, (off_t)0); if (p == (void *)-1) { perror(name); close(fd); return 0; } processor(p, nbytes, name, arg); munmap((caddr_t)p, nbytes); close(fd); return 1; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._utf8tab.h000644 000765 000024 00000000430 12161600406 022041 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/utf8tab.h000644 000765 000024 00000004401 12161600406 021626 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ /* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, /* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, /* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, ./xotcl-1.6.8/library/xml/TclExpat-1.1/._win32filemap.c000644 000765 000024 00000000430 12161600406 022757 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/win32filemap.c000644 000765 000024 00000004611 12161600406 022547 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #define STRICT 1 #ifdef XML_UNICODE #define UNICODE #define _UNICODE #endif /* XML_UNICODE */ #include #include #include #include "filemap.h" static void win32perror(const TCHAR *); int filemap(const TCHAR *name, void (*processor)(const void *, size_t, const TCHAR *, void *arg), void *arg) { HANDLE f; HANDLE m; DWORD size; DWORD sizeHi; void *p; f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (f == INVALID_HANDLE_VALUE) { win32perror(name); return 0; } size = GetFileSize(f, &sizeHi); if (size == (DWORD)-1) { win32perror(name); return 0; } if (sizeHi) { _ftprintf(stderr, _T("%s: bigger than 2Gb\n"), name); return 0; } /* CreateFileMapping barfs on zero length files */ if (size == 0) { static const char c = '\0'; processor(&c, 0, name, arg); CloseHandle(f); return 1; } m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL); if (m == NULL) { win32perror(name); CloseHandle(f); return 0; } p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0); if (p == NULL) { win32perror(name); CloseHandle(m); CloseHandle(f); return 0; } processor(p, size, name, arg); UnmapViewOfFile(p); CloseHandle(m); CloseHandle(f); return 1; } static void win32perror(const TCHAR *s) { LPVOID buf; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buf, 0, NULL)) { _ftprintf(stderr, _T("%s: %s"), s, buf); fflush(stderr); LocalFree(buf); } else _ftprintf(stderr, _T("%s: unknown Windows error\n"), s); } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmldef.h000644 000765 000024 00000000430 12161600406 021743 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmldef.h000644 000765 000024 00000001627 12161600406 021537 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ /* This file can be used for any definitions needed in particular environments. */ #ifdef MOZILLA #include "nspr.h" #define malloc(x) PR_Calloc(1,(x)) #define calloc(x, y) PR_Calloc((x),(y)) #define free(x) PR_Free(x) #define int int32 #endif /* MOZILLA */ ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmlparse.c000644 000765 000024 00000000430 12161600406 022312 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmlparse.c000644 000765 000024 00000210230 12161600406 022076 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include #include #include #include "xmldef.h" #ifdef XML_UNICODE #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX #define XmlConvert XmlUtf16Convert #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding #define XmlEncode XmlUtf16Encode #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) typedef unsigned short ICHAR; #else #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX #define XmlConvert XmlUtf8Convert #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding #define XmlEncode XmlUtf8Encode #define MUST_CONVERT(enc, s) (!(enc)->isUtf8) typedef char ICHAR; #endif #ifdef XML_UNICODE_WCHAR_T #define XML_T(x) L ## x #else #define XML_T(x) x #endif /* Round up n to be a multiple of sz, where sz is a power of 2. */ #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) #include "xmlparse.h" #include "xmltok.h" #include "xmlrole.h" #include "hashtable.h" #define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ #define INIT_DATA_BUF_SIZE 1024 #define INIT_ATTS_SIZE 16 #define INIT_BLOCK_SIZE 1024 #define INIT_BUFFER_SIZE 1024 typedef struct tag { struct tag *parent; const char *rawName; size_t rawNameLength; const XML_Char *name; char *buf; char *bufEnd; } TAG; typedef struct { const XML_Char *name; const XML_Char *textPtr; int textLen; const XML_Char *systemId; const XML_Char *base; const XML_Char *publicId; const XML_Char *notation; char open; } ENTITY; typedef struct block { struct block *next; int size; XML_Char s[1]; } BLOCK; typedef struct { BLOCK *blocks; BLOCK *freeBlocks; const XML_Char *end; XML_Char *ptr; XML_Char *start; } STRING_POOL; /* The XML_Char before the name is used to determine whether an attribute has been specified. */ typedef struct { XML_Char *name; char maybeTokenized; } ATTRIBUTE_ID; typedef struct { const ATTRIBUTE_ID *id; char isCdata; const XML_Char *value; } DEFAULT_ATTRIBUTE; typedef struct { const XML_Char *name; int nDefaultAtts; int allocDefaultAtts; DEFAULT_ATTRIBUTE *defaultAtts; } ELEMENT_TYPE; typedef struct { HASH_TABLE generalEntities; HASH_TABLE elementTypes; HASH_TABLE attributeIds; STRING_POOL pool; int complete; int standalone; const XML_Char *base; } DTD; typedef enum XML_Error Processor(XML_Parser parser, const char *start, const char *end, const char **endPtr); static Processor prologProcessor; static Processor prologInitProcessor; static Processor contentProcessor; static Processor cdataSectionProcessor; static Processor epilogProcessor; static Processor errorProcessor; static Processor externalEntityInitProcessor; static Processor externalEntityInitProcessor2; static Processor externalEntityInitProcessor3; static Processor externalEntityContentProcessor; static enum XML_Error handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *, const char *); static enum XML_Error initializeEncoding(XML_Parser parser); static enum XML_Error doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, const char *start, const char *end, const char **endPtr); static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr); static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, const XML_Char *tagName, const char *s); static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, int isCdata, const XML_Char *dfltValue); static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *); static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *); static ATTRIBUTE_ID * getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static enum XML_Error storeEntityValue(XML_Parser parser, const char *start, const char *end); static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static void reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static const XML_Char *getOpenEntityNames(XML_Parser parser); static int setOpenEntityNames(XML_Parser parser, const XML_Char *openEntityNames); static void normalizePublicId(XML_Char *s); static int dtdInit(DTD *); static void dtdDestroy(DTD *); static int dtdCopy(DTD *newDtd, const DTD *oldDtd); static void poolInit(STRING_POOL *); static void poolClear(STRING_POOL *); static void poolDestroy(STRING_POOL *); static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); static int poolGrow(STRING_POOL *pool); static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s); static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); #define poolStart(pool) ((pool)->start) #define poolEnd(pool) ((pool)->ptr) #define poolLength(pool) ((pool)->ptr - (pool)->start) #define poolChop(pool) ((void)--(pool->ptr)) #define poolLastChar(pool) (((pool)->ptr)[-1]) #define poolDiscard(pool) ((pool)->ptr = (pool)->start) #define poolFinish(pool) ((pool)->start = (pool)->ptr) #define poolAppendChar(pool, c) \ (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ ? 0 \ : ((*((pool)->ptr)++ = c), 1)) typedef struct { /* The first member must be userData so that the XML_GetUserData macro works. */ void *userData; void *handlerArg; char *buffer; /* first character to be parsed */ const char *bufferPtr; /* past last character to be parsed */ char *bufferEnd; /* allocated end of buffer */ const char *bufferLim; long parseEndByteIndex; const char *parseEndPtr; XML_Char *dataBuf; XML_Char *dataBufEnd; XML_StartElementHandler startElementHandler; XML_EndElementHandler endElementHandler; XML_CharacterDataHandler characterDataHandler; XML_ProcessingInstructionHandler processingInstructionHandler; XML_DefaultHandler defaultHandler; XML_UnparsedEntityDeclHandler unparsedEntityDeclHandler; XML_NotationDeclHandler notationDeclHandler; XML_ExternalEntityRefHandler externalEntityRefHandler; XML_UnknownEncodingHandler unknownEncodingHandler; const ENCODING *encoding; INIT_ENCODING initEncoding; const XML_Char *protocolEncodingName; void *unknownEncodingMem; void *unknownEncodingData; void *unknownEncodingHandlerData; void (*unknownEncodingRelease)(void *); PROLOG_STATE prologState; Processor *processor; enum XML_Error errorCode; const char *eventPtr; const char *eventEndPtr; const char *positionPtr; int tagLevel; ENTITY *declEntity; const XML_Char *declNotationName; const XML_Char *declNotationPublicId; ELEMENT_TYPE *declElementType; ATTRIBUTE_ID *declAttributeId; char declAttributeIsCdata; DTD dtd; TAG *tagStack; TAG *freeTagList; int attsSize; ATTRIBUTE *atts; POSITION position; STRING_POOL tempPool; STRING_POOL temp2Pool; char *groupConnector; unsigned groupSize; int hadExternalDoctype; } Parser; #define userData (((Parser *)parser)->userData) #define handlerArg (((Parser *)parser)->handlerArg) #define startElementHandler (((Parser *)parser)->startElementHandler) #define endElementHandler (((Parser *)parser)->endElementHandler) #define characterDataHandler (((Parser *)parser)->characterDataHandler) #define processingInstructionHandler (((Parser *)parser)->processingInstructionHandler) #define defaultHandler (((Parser *)parser)->defaultHandler) #define unparsedEntityDeclHandler (((Parser *)parser)->unparsedEntityDeclHandler) #define notationDeclHandler (((Parser *)parser)->notationDeclHandler) #define externalEntityRefHandler (((Parser *)parser)->externalEntityRefHandler) #define unknownEncodingHandler (((Parser *)parser)->unknownEncodingHandler) #define encoding (((Parser *)parser)->encoding) #define initEncoding (((Parser *)parser)->initEncoding) #define unknownEncodingMem (((Parser *)parser)->unknownEncodingMem) #define unknownEncodingData (((Parser *)parser)->unknownEncodingData) #define unknownEncodingHandlerData \ (((Parser *)parser)->unknownEncodingHandlerData) #define unknownEncodingRelease (((Parser *)parser)->unknownEncodingRelease) #define protocolEncodingName (((Parser *)parser)->protocolEncodingName) #define prologState (((Parser *)parser)->prologState) #define processor (((Parser *)parser)->processor) #define errorCode (((Parser *)parser)->errorCode) #define eventPtr (((Parser *)parser)->eventPtr) #define eventEndPtr (((Parser *)parser)->eventEndPtr) #define positionPtr (((Parser *)parser)->positionPtr) #define position (((Parser *)parser)->position) #define tagLevel (((Parser *)parser)->tagLevel) #define buffer (((Parser *)parser)->buffer) #define bufferPtr (((Parser *)parser)->bufferPtr) #define bufferEnd (((Parser *)parser)->bufferEnd) #define parseEndByteIndex (((Parser *)parser)->parseEndByteIndex) #define parseEndPtr (((Parser *)parser)->parseEndPtr) #define bufferLim (((Parser *)parser)->bufferLim) #define dataBuf (((Parser *)parser)->dataBuf) #define dataBufEnd (((Parser *)parser)->dataBufEnd) #define dtd (((Parser *)parser)->dtd) #define declEntity (((Parser *)parser)->declEntity) #define declNotationName (((Parser *)parser)->declNotationName) #define declNotationPublicId (((Parser *)parser)->declNotationPublicId) #define declElementType (((Parser *)parser)->declElementType) #define declAttributeId (((Parser *)parser)->declAttributeId) #define declAttributeIsCdata (((Parser *)parser)->declAttributeIsCdata) #define freeTagList (((Parser *)parser)->freeTagList) #define tagStack (((Parser *)parser)->tagStack) #define atts (((Parser *)parser)->atts) #define attsSize (((Parser *)parser)->attsSize) #define tempPool (((Parser *)parser)->tempPool) #define temp2Pool (((Parser *)parser)->temp2Pool) #define groupConnector (((Parser *)parser)->groupConnector) #define groupSize (((Parser *)parser)->groupSize) #define hadExternalDoctype (((Parser *)parser)->hadExternalDoctype) XML_Parser XML_ParserCreate(const XML_Char *encodingName) { XML_Parser parser = malloc(sizeof(Parser)); if (!parser) return parser; processor = prologInitProcessor; XmlPrologStateInit(&prologState); userData = 0; handlerArg = 0; startElementHandler = 0; endElementHandler = 0; characterDataHandler = 0; processingInstructionHandler = 0; defaultHandler = 0; unparsedEntityDeclHandler = 0; notationDeclHandler = 0; externalEntityRefHandler = 0; unknownEncodingHandler = 0; buffer = 0; bufferPtr = 0; bufferEnd = 0; parseEndByteIndex = 0; parseEndPtr = 0; bufferLim = 0; declElementType = 0; declAttributeId = 0; declEntity = 0; declNotationName = 0; declNotationPublicId = 0; memset(&position, 0, sizeof(POSITION)); errorCode = XML_ERROR_NONE; eventPtr = 0; eventEndPtr = 0; positionPtr = 0; tagLevel = 0; tagStack = 0; freeTagList = 0; attsSize = INIT_ATTS_SIZE; atts = malloc(attsSize * sizeof(ATTRIBUTE)); dataBuf = malloc(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); groupSize = 0; groupConnector = 0; hadExternalDoctype = 0; unknownEncodingMem = 0; unknownEncodingRelease = 0; unknownEncodingData = 0; unknownEncodingHandlerData = 0; poolInit(&tempPool); poolInit(&temp2Pool); protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0; if (!dtdInit(&dtd) || !atts || !dataBuf || (encodingName && !protocolEncodingName)) { XML_ParserFree(parser); return 0; } dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; XmlInitEncoding(&initEncoding, &encoding, 0); return parser; } XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *openEntityNames, const XML_Char *encodingName) { XML_Parser parser = oldParser; DTD *oldDtd = &dtd; XML_StartElementHandler oldStartElementHandler = startElementHandler; XML_EndElementHandler oldEndElementHandler = endElementHandler; XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; XML_ProcessingInstructionHandler oldProcessingInstructionHandler = processingInstructionHandler; XML_DefaultHandler oldDefaultHandler = defaultHandler; XML_ExternalEntityRefHandler oldExternalEntityRefHandler = externalEntityRefHandler; XML_UnknownEncodingHandler oldUnknownEncodingHandler = unknownEncodingHandler; void *oldUserData = userData; void *oldHandlerArg = handlerArg; parser = XML_ParserCreate(encodingName); if (!parser) return 0; startElementHandler = oldStartElementHandler; endElementHandler = oldEndElementHandler; characterDataHandler = oldCharacterDataHandler; processingInstructionHandler = oldProcessingInstructionHandler; defaultHandler = oldDefaultHandler; externalEntityRefHandler = oldExternalEntityRefHandler; unknownEncodingHandler = oldUnknownEncodingHandler; userData = oldUserData; if (oldUserData == oldHandlerArg) handlerArg = userData; else handlerArg = parser; if (!dtdCopy(&dtd, oldDtd) || !setOpenEntityNames(parser, openEntityNames)) { XML_ParserFree(parser); return 0; } processor = externalEntityInitProcessor; return parser; } void XML_ParserFree(XML_Parser parser) { for (;;) { TAG *p; if (tagStack == 0) { if (freeTagList == 0) break; tagStack = freeTagList; freeTagList = 0; } p = tagStack; tagStack = tagStack->parent; free(p->buf); free(p); } poolDestroy(&tempPool); poolDestroy(&temp2Pool); dtdDestroy(&dtd); free((void *)atts); free(groupConnector); free(buffer); free(dataBuf); free(unknownEncodingMem); if (unknownEncodingRelease) unknownEncodingRelease(unknownEncodingData); free(parser); } void XML_UseParserAsHandlerArg(XML_Parser parser) { handlerArg = parser; } void XML_SetUserData(XML_Parser parser, void *p) { if (handlerArg == userData) handlerArg = userData = p; else userData = p; } int XML_SetBase(XML_Parser parser, const XML_Char *p) { if (p) { p = poolCopyString(&dtd.pool, p); if (!p) return 0; dtd.base = p; } else dtd.base = 0; return 1; } const XML_Char *XML_GetBase(XML_Parser parser) { return dtd.base; } void XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end) { startElementHandler = start; endElementHandler = end; } void XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler) { characterDataHandler = handler; } void XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler) { processingInstructionHandler = handler; } void XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler) { defaultHandler = handler; } void XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler) { unparsedEntityDeclHandler = handler; } void XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler) { notationDeclHandler = handler; } void XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler) { externalEntityRefHandler = handler; } void XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *data) { unknownEncodingHandler = handler; unknownEncodingHandlerData = data; } int XML_Parse(XML_Parser parser, const char *s, size_t len, int isFinal) { if (len == 0) { if (!isFinal) return 1; errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0); if (errorCode == XML_ERROR_NONE) return 1; eventEndPtr = eventPtr; return 0; } else if (bufferPtr == bufferEnd) { const char *end; size_t nLeftOver; parseEndByteIndex += len; positionPtr = s; if (isFinal) { errorCode = processor(parser, s, parseEndPtr = s + len, 0); if (errorCode == XML_ERROR_NONE) return 1; eventEndPtr = eventPtr; return 0; } errorCode = processor(parser, s, parseEndPtr = s + len, &end); if (errorCode != XML_ERROR_NONE) { eventEndPtr = eventPtr; return 0; } XmlUpdatePosition(encoding, positionPtr, end, &position); nLeftOver = s + len - end; if (nLeftOver) { if (buffer == 0 || nLeftOver > bufferLim - buffer) { /* FIXME avoid integer overflow */ buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2); if (!buffer) { errorCode = XML_ERROR_NO_MEMORY; eventPtr = eventEndPtr = 0; return 0; } bufferLim = buffer + len * 2; } memcpy(buffer, end, nLeftOver); bufferPtr = buffer; bufferEnd = buffer + nLeftOver; } return 1; } else { memcpy(XML_GetBuffer(parser, len), s, len); return XML_ParseBuffer(parser, len, isFinal); } } int XML_ParseBuffer(XML_Parser parser, size_t len, int isFinal) { const char *start = bufferPtr; positionPtr = start; bufferEnd += len; parseEndByteIndex += len; errorCode = processor(parser, start, parseEndPtr = bufferEnd, isFinal ? (const char **)0 : &bufferPtr); if (errorCode == XML_ERROR_NONE) { if (!isFinal) XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); return 1; } else { eventEndPtr = eventPtr; return 0; } } void *XML_GetBuffer(XML_Parser parser, size_t len) { if (len > bufferLim - bufferEnd) { /* FIXME avoid integer overflow */ size_t neededSize = len + (bufferEnd - bufferPtr); if (neededSize <= bufferLim - buffer) { memmove(buffer, bufferPtr, (size_t)(bufferEnd - bufferPtr)); bufferEnd = buffer + (bufferEnd - bufferPtr); bufferPtr = buffer; } else { char *newBuf; size_t bufferSize = bufferLim - bufferPtr; if (bufferSize == 0) bufferSize = INIT_BUFFER_SIZE; do { bufferSize *= 2; } while (bufferSize < neededSize); newBuf = malloc(bufferSize); if (newBuf == 0) { errorCode = XML_ERROR_NO_MEMORY; return 0; } bufferLim = newBuf + bufferSize; if (bufferPtr) { memcpy(newBuf, bufferPtr, (size_t)(bufferEnd - bufferPtr)); free(buffer); } bufferEnd = newBuf + (bufferEnd - bufferPtr); bufferPtr = buffer = newBuf; } } return bufferEnd; } enum XML_Error XML_GetErrorCode(XML_Parser parser) { return errorCode; } long XML_GetCurrentByteIndex(XML_Parser parser) { if (eventPtr) return parseEndByteIndex - (parseEndPtr - eventPtr); return -1; } int XML_GetCurrentLineNumber(XML_Parser parser) { if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.lineNumber + 1; } int XML_GetCurrentColumnNumber(XML_Parser parser) { if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.columnNumber; } void XML_DefaultCurrent(XML_Parser parser) { if (defaultHandler) reportDefault(parser, encoding, eventPtr, eventEndPtr); } const XML_LChar *XML_ErrorString(enum XML_Error code) { static const XML_LChar *message[] = { 0, XML_T("out of memory"), XML_T("syntax error"), XML_T("no element found"), XML_T("not well-formed"), XML_T("unclosed token"), XML_T("unclosed token"), XML_T("mismatched tag"), XML_T("duplicate attribute"), XML_T("junk after document element"), XML_T("illegal parameter entity reference"), XML_T("undefined entity"), XML_T("recursive entity reference"), XML_T("asynchronous entity"), XML_T("reference to invalid character number"), XML_T("reference to binary entity"), XML_T("reference to external entity in attribute"), XML_T("xml processing instruction not at start of external entity"), XML_T("unknown encoding"), XML_T("encoding specified in XML declaration is incorrect"), XML_T("unclosed CDATA section"), XML_T("error in processing external entity reference") }; if (code > 0 && code < sizeof(message)/sizeof(message[0])) return message[code]; return 0; } static enum XML_Error contentProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { return doContent(parser, 0, encoding, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; processor = externalEntityInitProcessor2; return externalEntityInitProcessor2(parser, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor2(XML_Parser parser, const char *start, const char *end, const char **endPtr) { const char *next; int tok = XmlContentTok(encoding, start, end, &next); switch (tok) { case XML_TOK_BOM: start = next; break; case XML_TOK_PARTIAL: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_PARTIAL_CHAR; } processor = externalEntityInitProcessor3; return externalEntityInitProcessor3(parser, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor3(XML_Parser parser, const char *start, const char *end, const char **endPtr) { const char *next; int tok = XmlContentTok(encoding, start, end, &next); switch (tok) { case XML_TOK_XML_DECL: { enum XML_Error result = processXmlDecl(parser, 1, start, next); if (result != XML_ERROR_NONE) return result; start = next; } break; case XML_TOK_PARTIAL: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_PARTIAL_CHAR; } processor = externalEntityContentProcessor; tagLevel = 1; return doContent(parser, 1, encoding, start, end, endPtr); } static enum XML_Error externalEntityContentProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { return doContent(parser, 1, encoding, start, end, endPtr); } static enum XML_Error doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, const char *s, const char *end, const char **nextPtr) { const ENCODING *internalEnc = XmlGetInternalEncoding(); const char *dummy = NULL; /* make cppcheck happy */ const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; *eventPP = s; eventEndPP = &eventEndPtr; } else eventPP = eventEndPP = &dummy; for (;;) { const char *next; int tok = XmlContentTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { case XML_TOK_TRAILING_CR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } *eventEndPP = end; if (characterDataHandler) { XML_Char c = XML_T('\n'); characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, end); if (startTagLevel == 0) return XML_ERROR_NO_ELEMENTS; if (tagLevel != startTagLevel) return XML_ERROR_ASYNC_ENTITY; return XML_ERROR_NONE; case XML_TOK_NONE: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } if (startTagLevel > 0) { if (tagLevel != startTagLevel) return XML_ERROR_ASYNC_ENTITY; return XML_ERROR_NONE; } return XML_ERROR_NO_ELEMENTS; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; case XML_TOK_ENTITY_REF: { const XML_Char *name; ENTITY *entity; XML_Char ch = XmlPredefinedEntityName(enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (ch) { if (characterDataHandler) characterDataHandler(handlerArg, &ch, 1); else if (defaultHandler) reportDefault(parser, enc, s, next); break; } name = poolStoreString(&dtd.pool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0); poolDiscard(&dtd.pool); if (!entity) { if (dtd.complete || dtd.standalone) return XML_ERROR_UNDEFINED_ENTITY; if (defaultHandler) reportDefault(parser, enc, s, next); break; } if (entity->open) return XML_ERROR_RECURSIVE_ENTITY_REF; if (entity->notation) return XML_ERROR_BINARY_ENTITY_REF; if (entity) { if (entity->textPtr) { enum XML_Error result; if (defaultHandler) { reportDefault(parser, enc, s, next); break; } /* Protect against the possibility that somebody sets the defaultHandler from inside another handler. */ *eventEndPP = *eventPP; entity->open = 1; result = doContent(parser, tagLevel, internalEnc, (char *)entity->textPtr, (char *)(entity->textPtr + entity->textLen), 0); entity->open = 0; if (result) return result; } else if (externalEntityRefHandler) { const XML_Char *openEntityNames; entity->open = 1; openEntityNames = getOpenEntityNames(parser); entity->open = 0; if (!openEntityNames) return XML_ERROR_NO_MEMORY; if (!externalEntityRefHandler(parser, openEntityNames, dtd.base, entity->systemId, entity->publicId)) return XML_ERROR_EXTERNAL_ENTITY_HANDLING; } else if (defaultHandler) reportDefault(parser, enc, s, next); } break; } case XML_TOK_START_TAG_WITH_ATTS: if (!startElementHandler) { enum XML_Error result = storeAtts(parser, enc, 0, s); if (result) return result; } /* fall through */ case XML_TOK_START_TAG_NO_ATTS: { TAG *tag; if (freeTagList) { tag = freeTagList; freeTagList = freeTagList->parent; } else { tag = malloc(sizeof(TAG)); if (!tag) return XML_ERROR_NO_MEMORY; tag->buf = malloc(INIT_TAG_BUF_SIZE); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; } tag->parent = tagStack; tagStack = tag; tag->rawName = s + enc->minBytesPerChar; tag->rawNameLength = XmlNameLength(enc, tag->rawName); if (nextPtr) { if (tag->rawNameLength > tag->bufEnd - tag->buf) { size_t bufSize = tag->rawNameLength * 4; bufSize = ROUND_UP(bufSize, sizeof(XML_Char)); tag->buf = realloc(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; } memcpy(tag->buf, tag->rawName, tag->rawNameLength); tag->rawName = tag->buf; } ++tagLevel; if (startElementHandler) { enum XML_Error result; XML_Char *toPtr; for (;;) { const char *rawNameEnd = tag->rawName + tag->rawNameLength; const char *fromPtr = tag->rawName; size_t bufSize; if (nextPtr) toPtr = (XML_Char *)(tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char))); else toPtr = (XML_Char *)tag->buf; tag->name = toPtr; XmlConvert(enc, &fromPtr, rawNameEnd, (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); if (fromPtr == rawNameEnd) break; bufSize = (tag->bufEnd - tag->buf) << 1; tag->buf = realloc(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; if (nextPtr) tag->rawName = tag->buf; } *toPtr = XML_T('\0'); result = storeAtts(parser, enc, tag->name, s); if (result) return result; startElementHandler(handlerArg, tag->name, (const XML_Char **)atts); poolClear(&tempPool); } else { tag->name = 0; if (defaultHandler) reportDefault(parser, enc, s, next); } break; } case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: if (!startElementHandler) { enum XML_Error result = storeAtts(parser, enc, 0, s); if (result) return result; } /* fall through */ case XML_TOK_EMPTY_ELEMENT_NO_ATTS: if (startElementHandler || endElementHandler) { const char *rawName = s + enc->minBytesPerChar; const XML_Char *name = poolStoreString(&tempPool, enc, rawName, rawName + XmlNameLength(enc, rawName)); if (!name) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); if (startElementHandler) { enum XML_Error result = storeAtts(parser, enc, name, s); if (result) return result; startElementHandler(handlerArg, name, (const XML_Char **)atts); } if (endElementHandler) { if (startElementHandler) *eventEndPP = *eventPP; endElementHandler(handlerArg, name); } poolClear(&tempPool); } else if (defaultHandler) reportDefault(parser, enc, s, next); if (tagLevel == 0) return epilogProcessor(parser, next, end, nextPtr); break; case XML_TOK_END_TAG: if (tagLevel == startTagLevel) return XML_ERROR_ASYNC_ENTITY; else { size_t len; const char *rawName; TAG *tag = tagStack; tagStack = tag->parent; tag->parent = freeTagList; freeTagList = tag; rawName = s + enc->minBytesPerChar*2; len = XmlNameLength(enc, rawName); if (len != tag->rawNameLength || memcmp(tag->rawName, rawName, len) != 0) { *eventPP = rawName; return XML_ERROR_TAG_MISMATCH; } --tagLevel; if (endElementHandler) { if (tag->name) endElementHandler(handlerArg, tag->name); else { const XML_Char *name = poolStoreString(&tempPool, enc, rawName, rawName + len); if (!name) return XML_ERROR_NO_MEMORY; endElementHandler(handlerArg, name); poolClear(&tempPool); } } else if (defaultHandler) reportDefault(parser, enc, s, next); if (tagLevel == 0) return epilogProcessor(parser, next, end, nextPtr); } break; case XML_TOK_CHAR_REF: { int n = XmlCharRefNumber(enc, s); if (n < 0) return XML_ERROR_BAD_CHAR_REF; if (characterDataHandler) { XML_Char buf[XML_ENCODE_MAX]; buf[0] = '\0'; characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); } else if (defaultHandler) reportDefault(parser, enc, s, next); } break; case XML_TOK_XML_DECL: return XML_ERROR_MISPLACED_XML_PI; case XML_TOK_DATA_NEWLINE: if (characterDataHandler) { XML_Char c = XML_T('\n'); characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_CDATA_SECT_OPEN: { enum XML_Error result; if (characterDataHandler) characterDataHandler(handlerArg, dataBuf, 0); else if (defaultHandler) reportDefault(parser, enc, s, next); result = doCdataSection(parser, enc, &next, end, nextPtr); if (!next) { processor = cdataSectionProcessor; return result; } } break; case XML_TOK_TRAILING_RSQB: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); characterDataHandler(handlerArg, dataBuf, (size_t)(dataPtr - (ICHAR *)dataBuf)); } else characterDataHandler(handlerArg, (XML_Char *)s, (size_t)((XML_Char *)end - (XML_Char *)s)); } else if (defaultHandler) reportDefault(parser, enc, s, end); if (startTagLevel == 0) { *eventPP = end; return XML_ERROR_NO_ELEMENTS; } if (tagLevel != startTagLevel) { *eventPP = end; return XML_ERROR_ASYNC_ENTITY; } return XML_ERROR_NONE; case XML_TOK_DATA_CHARS: if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { for (;;) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = s; characterDataHandler(handlerArg, dataBuf, (size_t)(dataPtr - (ICHAR *)dataBuf)); if (s == next) break; *eventPP = s; } } else characterDataHandler(handlerArg, (XML_Char *)s, (size_t)((XML_Char *)next - (XML_Char *)s)); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_PI: if (!reportProcessingInstruction(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; default: if (defaultHandler) reportDefault(parser, enc, s, next); break; } *eventPP = s = next; } /* not reached */ } /* If tagName is non-null, build a real list of attributes, otherwise just check the attributes for well-formedness. */ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, const XML_Char *tagName, const char *s) { ELEMENT_TYPE *elementType = 0; int nDefaultAtts = 0; const XML_Char **appAtts; int i; int n; if (tagName) { elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagName, 0); if (elementType) nDefaultAtts = elementType->nDefaultAtts; } n = XmlGetAttributes(enc, s, attsSize, atts); if (n + nDefaultAtts > attsSize) { int oldAttsSize = attsSize; attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; atts = realloc((void *)atts, attsSize * sizeof(ATTRIBUTE)); if (!atts) return XML_ERROR_NO_MEMORY; if (n > oldAttsSize) XmlGetAttributes(enc, s, n, atts); } appAtts = (const XML_Char **)atts; for (i = 0; i < n; i++) { ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, atts[i].name + XmlNameLength(enc, atts[i].name)); if (!attId) return XML_ERROR_NO_MEMORY; if ((attId->name)[-1]) { if (enc == encoding) eventPtr = atts[i].name; return XML_ERROR_DUPLICATE_ATTRIBUTE; } (attId->name)[-1] = 1; appAtts[i << 1] = attId->name; if (!atts[i].normalized) { enum XML_Error result; int isCdata = 1; if (attId->maybeTokenized) { int j; for (j = 0; j < nDefaultAtts; j++) { if (attId == elementType->defaultAtts[j].id) { isCdata = elementType->defaultAtts[j].isCdata; break; } } } result = storeAttributeValue(parser, enc, isCdata, atts[i].valuePtr, atts[i].valueEnd, &tempPool); if (result) return result; if (tagName) { appAtts[(i << 1) + 1] = poolStart(&tempPool); poolFinish(&tempPool); } else poolDiscard(&tempPool); } else if (tagName) { appAtts[(i << 1) + 1] = poolStoreString(&tempPool, enc, atts[i].valuePtr, atts[i].valueEnd); if (appAtts[(i << 1) + 1] == 0) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); } } if (tagName) { int j; for (j = 0; j < nDefaultAtts; j++) { const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + j; if (!(da->id->name)[-1] && da->value) { (da->id->name)[-1] = 1; appAtts[i << 1] = da->id->name; appAtts[(i << 1) + 1] = da->value; i++; } } appAtts[i << 1] = 0; } while (i-- > 0) ((XML_Char *)appAtts[i << 1])[-1] = 0; return XML_ERROR_NONE; } /* The idea here is to avoid using stack for each CDATA section when the whole file is parsed with one call. */ static enum XML_Error cdataSectionProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { enum XML_Error result = doCdataSection(parser, encoding, &start, end, endPtr); if (start) { processor = contentProcessor; return contentProcessor(parser, start, end, endPtr); } return result; } /* startPtr gets set to non-null is the section is closed, and to null if the section is not yet closed. */ static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, const char *end, const char **nextPtr) { const char *s = *startPtr; const char *dummy = NULL; /* make cppcheck happy */ const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; *eventPP = s; eventEndPP = &eventEndPtr; } else eventPP = eventEndPP = &dummy; *startPtr = 0; for (;;) { const char *next; int tok = XmlCdataSectionTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { case XML_TOK_CDATA_SECT_CLOSE: if (characterDataHandler) characterDataHandler(handlerArg, dataBuf, 0); else if (defaultHandler) reportDefault(parser, enc, s, next); *startPtr = next; return XML_ERROR_NONE; case XML_TOK_DATA_NEWLINE: if (characterDataHandler) { XML_Char c = XML_T('\n'); characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_DATA_CHARS: if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { for (;;) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = next; characterDataHandler(handlerArg, dataBuf, (size_t)(dataPtr - (ICHAR *)dataBuf)); if (s == next) break; *eventPP = s; } } else characterDataHandler(handlerArg, (XML_Char *)s, (size_t)((XML_Char *)next - (XML_Char *)s)); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; case XML_TOK_PARTIAL: case XML_TOK_NONE: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_CDATA_SECTION; default: abort(); } *eventPP = s = next; } /* not reached */ } static enum XML_Error initializeEncoding(XML_Parser parser) { const char *s; #ifdef XML_UNICODE char encodingBuf[128]; if (!protocolEncodingName) s = 0; else { int i; for (i = 0; protocolEncodingName[i]; i++) { if (i == sizeof(encodingBuf) - 1 || protocolEncodingName[i] >= 0x80 || protocolEncodingName[i] < 0) { encodingBuf[0] = '\0'; break; } encodingBuf[i] = (char)protocolEncodingName[i]; } encodingBuf[i] = '\0'; s = encodingBuf; } #else s = protocolEncodingName; #endif if (XmlInitEncoding(&initEncoding, &encoding, s)) return XML_ERROR_NONE; return handleUnknownEncoding(parser, protocolEncodingName); } static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, const char *next) { const char *encodingName = 0; const ENCODING *newEncoding = 0; const char *version; int standalone = -1; if (!XmlParseXmlDecl(isGeneralTextEntity, encoding, s, next, &eventPtr, &version, &encodingName, &newEncoding, &standalone)) return XML_ERROR_SYNTAX; if (defaultHandler) reportDefault(parser, encoding, s, next); if (!protocolEncodingName) { if (newEncoding) { if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { eventPtr = encodingName; return XML_ERROR_INCORRECT_ENCODING; } encoding = newEncoding; } else if (encodingName) { enum XML_Error result; const XML_Char *s = poolStoreString(&tempPool, encoding, encodingName, encodingName + XmlNameLength(encoding, encodingName)); if (!s) return XML_ERROR_NO_MEMORY; result = handleUnknownEncoding(parser, s); poolDiscard(&tempPool); if (result == XML_ERROR_UNKNOWN_ENCODING) eventPtr = encodingName; return result; } } if (!isGeneralTextEntity && standalone == 1) dtd.standalone = 1; return XML_ERROR_NONE; } static enum XML_Error handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) { if (unknownEncodingHandler) { XML_Encoding info; int i; for (i = 0; i < 256; i++) info.map[i] = -1; info.convert = 0; info.data = 0; info.release = 0; if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, &info)) { ENCODING *enc; unknownEncodingMem = malloc((size_t)XmlSizeOfUnknownEncoding()); if (!unknownEncodingMem) { if (info.release) info.release(info.data); return XML_ERROR_NO_MEMORY; } enc = XmlInitUnknownEncoding(unknownEncodingMem, info.map, info.convert, info.data); if (enc) { unknownEncodingData = info.data; unknownEncodingRelease = info.release; encoding = enc; return XML_ERROR_NONE; } } if (info.release) info.release(info.data); } return XML_ERROR_UNKNOWN_ENCODING; } static enum XML_Error prologInitProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; processor = prologProcessor; return prologProcessor(parser, s, end, nextPtr); } static enum XML_Error prologProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { for (;;) { const char *next; int tok = XmlPrologTok(encoding, s, end, &next); if (tok <= 0) { if (nextPtr != 0 && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } switch (tok) { case XML_TOK_INVALID: eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_NONE: return XML_ERROR_NO_ELEMENTS; case XML_TOK_PARTIAL: return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: return XML_ERROR_PARTIAL_CHAR; case XML_TOK_TRAILING_CR: eventPtr = s + encoding->minBytesPerChar; return XML_ERROR_NO_ELEMENTS; default: abort(); } } switch (XmlTokenRole(&prologState, tok, s, next, encoding)) { case XML_ROLE_XML_DECL: { enum XML_Error result = processXmlDecl(parser, 0, s, next); if (result != XML_ERROR_NONE) return result; } break; case XML_ROLE_DOCTYPE_SYSTEM_ID: hadExternalDoctype = 1; break; case XML_ROLE_DOCTYPE_PUBLIC_ID: case XML_ROLE_ENTITY_PUBLIC_ID: if (!XmlIsPublicId(encoding, s, next, &eventPtr)) return XML_ERROR_SYNTAX; if (declEntity) { XML_Char *tem = poolStoreString(&dtd.pool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); declEntity->publicId = tem; poolFinish(&dtd.pool); } break; case XML_ROLE_INSTANCE_START: processor = contentProcessor; if (hadExternalDoctype) dtd.complete = 0; return contentProcessor(parser, s, end, nextPtr); case XML_ROLE_ATTLIST_ELEMENT_NAME: { const XML_Char *name = poolStoreString(&dtd.pool, encoding, s, next); if (!name) return XML_ERROR_NO_MEMORY; declElementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE)); if (!declElementType) return XML_ERROR_NO_MEMORY; if (declElementType->name != name) poolDiscard(&dtd.pool); else poolFinish(&dtd.pool); break; } case XML_ROLE_ATTRIBUTE_NAME: declAttributeId = getAttributeId(parser, encoding, s, next); if (!declAttributeId) return XML_ERROR_NO_MEMORY; declAttributeIsCdata = 0; break; case XML_ROLE_ATTRIBUTE_TYPE_CDATA: declAttributeIsCdata = 1; break; case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: if (dtd.complete && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, 0)) return XML_ERROR_NO_MEMORY; break; case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: case XML_ROLE_FIXED_ATTRIBUTE_VALUE: { const XML_Char *attVal; enum XML_Error result = storeAttributeValue(parser, encoding, declAttributeIsCdata, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar, &dtd.pool); if (result) return result; attVal = poolStart(&dtd.pool); poolFinish(&dtd.pool); if (dtd.complete && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, attVal)) return XML_ERROR_NO_MEMORY; break; } case XML_ROLE_ENTITY_VALUE: { enum XML_Error result = storeEntityValue(parser, s, next); if (result != XML_ERROR_NONE) return result; } break; case XML_ROLE_ENTITY_SYSTEM_ID: if (declEntity) { declEntity->systemId = poolStoreString(&dtd.pool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!declEntity->systemId) return XML_ERROR_NO_MEMORY; declEntity->base = dtd.base; poolFinish(&dtd.pool); } break; case XML_ROLE_ENTITY_NOTATION_NAME: if (declEntity) { declEntity->notation = poolStoreString(&dtd.pool, encoding, s, next); if (!declEntity->notation) return XML_ERROR_NO_MEMORY; poolFinish(&dtd.pool); if (unparsedEntityDeclHandler) { eventPtr = eventEndPtr = s; unparsedEntityDeclHandler(handlerArg, declEntity->name, declEntity->base, declEntity->systemId, declEntity->publicId, declEntity->notation); } } break; case XML_ROLE_GENERAL_ENTITY_NAME: { const XML_Char *name; if (XmlPredefinedEntityName(encoding, s, next)) { declEntity = 0; break; } name = poolStoreString(&dtd.pool, encoding, s, next); if (!name) return XML_ERROR_NO_MEMORY; if (dtd.complete) { declEntity = (ENTITY *)lookup(&dtd.generalEntities, name, sizeof(ENTITY)); if (!declEntity) return XML_ERROR_NO_MEMORY; if (declEntity->name != name) { poolDiscard(&dtd.pool); declEntity = 0; } else poolFinish(&dtd.pool); } else { poolDiscard(&dtd.pool); declEntity = 0; } } break; case XML_ROLE_PARAM_ENTITY_NAME: declEntity = 0; break; case XML_ROLE_NOTATION_NAME: declNotationPublicId = 0; declNotationName = 0; if (notationDeclHandler) { declNotationName = poolStoreString(&tempPool, encoding, s, next); if (!declNotationName) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); } break; case XML_ROLE_NOTATION_PUBLIC_ID: if (!XmlIsPublicId(encoding, s, next, &eventPtr)) return XML_ERROR_SYNTAX; if (declNotationName) { XML_Char *tem = poolStoreString(&tempPool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); declNotationPublicId = tem; poolFinish(&tempPool); } break; case XML_ROLE_NOTATION_SYSTEM_ID: if (declNotationName && notationDeclHandler) { const XML_Char *systemId = poolStoreString(&tempPool, encoding, s + encoding->minBytesPerChar, next - encoding->minBytesPerChar); if (!systemId) return XML_ERROR_NO_MEMORY; eventPtr = eventEndPtr = s; notationDeclHandler(handlerArg, declNotationName, dtd.base, systemId, declNotationPublicId); } poolClear(&tempPool); break; case XML_ROLE_NOTATION_NO_SYSTEM_ID: if (declNotationPublicId && notationDeclHandler) { eventPtr = eventEndPtr = s; notationDeclHandler(handlerArg, declNotationName, dtd.base, 0, declNotationPublicId); } poolClear(&tempPool); break; case XML_ROLE_ERROR: eventPtr = s; switch (tok) { case XML_TOK_PARAM_ENTITY_REF: return XML_ERROR_PARAM_ENTITY_REF; case XML_TOK_XML_DECL: return XML_ERROR_MISPLACED_XML_PI; default: return XML_ERROR_SYNTAX; } case XML_ROLE_GROUP_OPEN: if (prologState.level >= groupSize) { if (groupSize) groupConnector = realloc(groupConnector, groupSize *= 2); else groupConnector = malloc(groupSize = 32); if (!groupConnector) return XML_ERROR_NO_MEMORY; } groupConnector[prologState.level] = 0; break; case XML_ROLE_GROUP_SEQUENCE: if (groupConnector[prologState.level] == '|') { eventPtr = s; return XML_ERROR_SYNTAX; } groupConnector[prologState.level] = ','; break; case XML_ROLE_GROUP_CHOICE: if (groupConnector[prologState.level] == ',') { eventPtr = s; return XML_ERROR_SYNTAX; } groupConnector[prologState.level] = '|'; break; case XML_ROLE_PARAM_ENTITY_REF: dtd.complete = 0; break; case XML_ROLE_NONE: switch (tok) { case XML_TOK_PI: eventPtr = s; eventEndPtr = next; if (!reportProcessingInstruction(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; } break; } if (defaultHandler) { switch (tok) { case XML_TOK_PI: case XML_TOK_BOM: case XML_TOK_XML_DECL: break; default: eventPtr = s; eventEndPtr = next; reportDefault(parser, encoding, s, next); } } s = next; } /* not reached */ } static enum XML_Error epilogProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { processor = epilogProcessor; eventPtr = s; for (;;) { const char *next; int tok = XmlPrologTok(encoding, s, end, &next); eventEndPtr = next; switch (tok) { case XML_TOK_TRAILING_CR: if (defaultHandler) { eventEndPtr = end; reportDefault(parser, encoding, s, end); } /* fall through */ case XML_TOK_NONE: if (nextPtr) *nextPtr = end; return XML_ERROR_NONE; case XML_TOK_PROLOG_S: case XML_TOK_COMMENT: if (defaultHandler) reportDefault(parser, encoding, s, next); break; case XML_TOK_PI: if (!reportProcessingInstruction(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_INVALID: eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; default: return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; } eventPtr = s = next; } } static enum XML_Error errorProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { return errorCode; } static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata, const char *ptr, const char *end, STRING_POOL *pool) { enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, end, pool); if (result) return result; if (!isCdata && poolLength(pool) && poolLastChar(pool) == XML_T(' ')) poolChop(pool); if (!poolAppendChar(pool, XML_T('\0'))) return XML_ERROR_NO_MEMORY; return XML_ERROR_NONE; } static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata, const char *ptr, const char *end, STRING_POOL *pool) { const ENCODING *internalEnc = XmlGetInternalEncoding(); for (;;) { const char *next; int tok = XmlAttributeValueTok(enc, ptr, end, &next); switch (tok) { case XML_TOK_NONE: return XML_ERROR_NONE; case XML_TOK_INVALID: if (enc == encoding) eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (enc == encoding) eventPtr = ptr; return XML_ERROR_INVALID_TOKEN; case XML_TOK_CHAR_REF: { XML_Char buf[XML_ENCODE_MAX]; int i; int n = XmlCharRefNumber(enc, ptr); if (n < 0) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BAD_CHAR_REF; } if (!isCdata && n == 0x20 /* space */ && (poolLength(pool) == 0 || poolLastChar(pool) == XML_T(' '))) break; n = XmlEncode(n, (ICHAR *)buf); if (!n) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BAD_CHAR_REF; } for (i = 0; i < n; i++) { if (!poolAppendChar(pool, buf[i])) return XML_ERROR_NO_MEMORY; } } break; case XML_TOK_DATA_CHARS: if (!poolAppend(pool, enc, ptr, next)) return XML_ERROR_NO_MEMORY; break; break; case XML_TOK_TRAILING_CR: next = ptr + enc->minBytesPerChar; /* fall through */ case XML_TOK_ATTRIBUTE_VALUE_S: case XML_TOK_DATA_NEWLINE: if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == XML_T(' '))) break; if (!poolAppendChar(pool, XML_T(' '))) return XML_ERROR_NO_MEMORY; break; case XML_TOK_ENTITY_REF: { const XML_Char *name; ENTITY *entity; XML_Char ch = XmlPredefinedEntityName(enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); if (ch) { if (!poolAppendChar(pool, ch)) return XML_ERROR_NO_MEMORY; break; } name = poolStoreString(&temp2Pool, enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0); poolDiscard(&temp2Pool); if (!entity) { if (dtd.complete) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_UNDEFINED_ENTITY; } } else if (entity->open) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_RECURSIVE_ENTITY_REF; } else if (entity->notation) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BINARY_ENTITY_REF; } else if (!entity->textPtr) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; } else { enum XML_Error result; const XML_Char *textEnd = entity->textPtr + entity->textLen; entity->open = 1; result = appendAttributeValue(parser, internalEnc, isCdata, (char *)entity->textPtr, (char *)textEnd, pool); entity->open = 0; if (result) return result; } } break; default: abort(); } ptr = next; } /* not reached */ } static enum XML_Error storeEntityValue(XML_Parser parser, const char *entityTextPtr, const char *entityTextEnd) { /*const ENCODING *internalEnc = XmlGetInternalEncoding();*/ STRING_POOL *pool = &(dtd.pool); entityTextPtr += encoding->minBytesPerChar; entityTextEnd -= encoding->minBytesPerChar; for (;;) { const char *next; int tok = XmlEntityValueTok(encoding, entityTextPtr, entityTextEnd, &next); switch (tok) { case XML_TOK_PARAM_ENTITY_REF: eventPtr = entityTextPtr; return XML_ERROR_SYNTAX; case XML_TOK_NONE: if (declEntity) { declEntity->textPtr = pool->start; declEntity->textLen = pool->ptr - pool->start; poolFinish(pool); } else poolDiscard(pool); return XML_ERROR_NONE; case XML_TOK_ENTITY_REF: case XML_TOK_DATA_CHARS: if (!poolAppend(pool, encoding, entityTextPtr, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_TRAILING_CR: next = entityTextPtr + encoding->minBytesPerChar; /* fall through */ case XML_TOK_DATA_NEWLINE: if (pool->end == pool->ptr && !poolGrow(pool)) return XML_ERROR_NO_MEMORY; *(pool->ptr)++ = XML_T('\n'); break; case XML_TOK_CHAR_REF: { XML_Char buf[XML_ENCODE_MAX]; int i; int n = XmlCharRefNumber(encoding, entityTextPtr); if (n < 0) { eventPtr = entityTextPtr; return XML_ERROR_BAD_CHAR_REF; } n = XmlEncode(n, (ICHAR *)buf); if (!n) { eventPtr = entityTextPtr; return XML_ERROR_BAD_CHAR_REF; } for (i = 0; i < n; i++) { if (pool->end == pool->ptr && !poolGrow(pool)) return XML_ERROR_NO_MEMORY; *(pool->ptr)++ = buf[i]; } } break; case XML_TOK_PARTIAL: eventPtr = entityTextPtr; return XML_ERROR_INVALID_TOKEN; case XML_TOK_INVALID: eventPtr = next; return XML_ERROR_INVALID_TOKEN; default: abort(); } entityTextPtr = next; } /* not reached */ } static void normalizeLines(XML_Char *s) { XML_Char *p; for (;; s++) { if (*s == XML_T('\0')) return; if (*s == XML_T('\r')) break; } p = s; do { if (*s == XML_T('\r')) { *p++ = XML_T('\n'); if (*++s == XML_T('\n')) s++; } else *p++ = *s++; } while (*s); *p = XML_T('\0'); } static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { const XML_Char *target; XML_Char *data; const char *tem; if (!processingInstructionHandler) { if (defaultHandler) reportDefault(parser, enc, start, end); return 1; } start += enc->minBytesPerChar * 2; tem = start + XmlNameLength(enc, start); target = poolStoreString(&tempPool, enc, start, tem); if (!target) return 0; poolFinish(&tempPool); data = poolStoreString(&tempPool, enc, XmlSkipS(enc, tem), end - enc->minBytesPerChar*2); if (!data) return 0; normalizeLines(data); processingInstructionHandler(handlerArg, target, data); poolClear(&tempPool); return 1; } static void reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, const char *end) { if (MUST_CONVERT(enc, s)) { for (;;) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); if (s == end) { defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); break; } if (enc == encoding) { eventEndPtr = s; defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); eventPtr = s; } else defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); } } else defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); } static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, int isCdata, const XML_Char *value) { DEFAULT_ATTRIBUTE *att; if (type->nDefaultAtts == type->allocDefaultAtts) { if (type->allocDefaultAtts == 0) { type->allocDefaultAtts = 8; type->defaultAtts = malloc(type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } else { type->allocDefaultAtts *= 2; type->defaultAtts = realloc(type->defaultAtts, type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } if (!type->defaultAtts) return 0; } att = type->defaultAtts + type->nDefaultAtts; att->id = attId; att->value = value; att->isCdata = isCdata; if (!isCdata) attId->maybeTokenized = 1; type->nDefaultAtts += 1; return 1; } static ATTRIBUTE_ID * getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { ATTRIBUTE_ID *id; const XML_Char *name; if (!poolAppendChar(&dtd.pool, XML_T('\0'))) return 0; name = poolStoreString(&dtd.pool, enc, start, end); if (!name) return 0; ++name; id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, name, sizeof(ATTRIBUTE_ID)); if (!id) return 0; if (id->name != name) poolDiscard(&dtd.pool); else poolFinish(&dtd.pool); return id; } static const XML_Char *getOpenEntityNames(XML_Parser parser) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(dtd.generalEntities)); for (;;) { const XML_Char *s; ENTITY *e = (ENTITY *)hashTableIterNext(&iter); if (!e) break; if (!e->open) continue; if (poolLength(&tempPool) > 0 && !poolAppendChar(&tempPool, XML_T(' '))) return 0; for (s = e->name; *s; s++) if (!poolAppendChar(&tempPool, *s)) return 0; } if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; return tempPool.start; } static int setOpenEntityNames(XML_Parser parser, const XML_Char *openEntityNames) { const XML_Char *s = openEntityNames; while (*openEntityNames != XML_T('\0')) { if (*s == XML_T(' ') || *s == XML_T('\0')) { ENTITY *e; if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; e = (ENTITY *)lookup(&dtd.generalEntities, poolStart(&tempPool), 0); if (e) e->open = 1; if (*s == XML_T(' ')) s++; openEntityNames = s; poolDiscard(&tempPool); } else { if (!poolAppendChar(&tempPool, *s)) return 0; s++; } } return 1; } static void normalizePublicId(XML_Char *publicId) { XML_Char *p = publicId; XML_Char *s; for (s = publicId; *s; s++) { switch (*s) { case XML_T(' '): case XML_T('\r'): case XML_T('\n'): if (p != publicId && p[-1] != XML_T(' ')) *p++ = XML_T(' '); break; default: *p++ = *s; } } if (p != publicId && p[-1] == XML_T(' ')) --p; *p = XML_T('\0'); } static int dtdInit(DTD *p) { poolInit(&(p->pool)); hashTableInit(&(p->generalEntities)); hashTableInit(&(p->elementTypes)); hashTableInit(&(p->attributeIds)); p->complete = 1; p->base = 0; return 1; } static void dtdDestroy(DTD *p) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); for (;;) { ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); if (!e) break; if (e->allocDefaultAtts != 0) free(e->defaultAtts); } hashTableDestroy(&(p->generalEntities)); hashTableDestroy(&(p->elementTypes)); hashTableDestroy(&(p->attributeIds)); poolDestroy(&(p->pool)); } /* Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise. The new DTD has already been initialized. */ static int dtdCopy(DTD *newDtd, const DTD *oldDtd) { HASH_TABLE_ITER iter; if (oldDtd->base) { const XML_Char *tem = poolCopyString(&(newDtd->pool), oldDtd->base); if (!tem) return 0; newDtd->base = tem; } hashTableIterInit(&iter, &(oldDtd->attributeIds)); /* Copy the attribute id table. */ for (;;) { ATTRIBUTE_ID *newA; const XML_Char *name; const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); if (!oldA) break; /* Remember to allocate the scratch byte before the name. */ if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) return 0; name = poolCopyString(&(newDtd->pool), oldA->name); if (!name) return 0; ++name; newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID)); if (!newA) return 0; newA->maybeTokenized = oldA->maybeTokenized; } /* Copy the element type table. */ hashTableIterInit(&iter, &(oldDtd->elementTypes)); for (;;) { int i; ELEMENT_TYPE *newE; const XML_Char *name; const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); if (!oldE) break; name = poolCopyString(&(newDtd->pool), oldE->name); if (!name) return 0; newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE)); if (!newE) return 0; newE->defaultAtts = (DEFAULT_ATTRIBUTE *)malloc(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); if (!newE->defaultAtts) return 0; newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; for (i = 0; i < newE->nDefaultAtts; i++) { newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; newE->defaultAtts[i].value = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); if (!newE->defaultAtts[i].value) return 0; } } /* Copy the entity table. */ hashTableIterInit(&iter, &(oldDtd->generalEntities)); for (;;) { ENTITY *newE; const XML_Char *name; const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); if (!oldE) break; name = poolCopyString(&(newDtd->pool), oldE->name); if (!name) return 0; newE = (ENTITY *)lookup(&(newDtd->generalEntities), name, sizeof(ENTITY)); if (!newE) return 0; if (oldE->systemId) { const XML_Char *tem = poolCopyString(&(newDtd->pool), oldE->systemId); if (!tem) return 0; newE->systemId = tem; if (oldE->base) { if (oldE->base == oldDtd->base) newE->base = newDtd->base; tem = poolCopyString(&(newDtd->pool), oldE->base); if (!tem) return 0; newE->base = tem; } } else { const XML_Char *tem = poolCopyStringN(&(newDtd->pool), oldE->textPtr, oldE->textLen); if (!tem) return 0; newE->textPtr = tem; newE->textLen = oldE->textLen; } if (oldE->notation) { const XML_Char *tem = poolCopyString(&(newDtd->pool), oldE->notation); if (!tem) return 0; newE->notation = tem; } } newDtd->complete = oldDtd->complete; newDtd->standalone = oldDtd->standalone; return 1; } static void poolInit(STRING_POOL *pool) { pool->blocks = 0; pool->freeBlocks = 0; pool->start = 0; pool->ptr = 0; pool->end = 0; } static void poolClear(STRING_POOL *pool) { if (!pool->freeBlocks) pool->freeBlocks = pool->blocks; else { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; p->next = pool->freeBlocks; pool->freeBlocks = p; p = tem; } } pool->blocks = 0; pool->start = 0; pool->ptr = 0; pool->end = 0; } static void poolDestroy(STRING_POOL *pool) { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; free(p); p = tem; } pool->blocks = 0; p = pool->freeBlocks; while (p) { BLOCK *tem = p->next; free(p); p = tem; } pool->freeBlocks = 0; pool->ptr = 0; pool->start = 0; pool->end = 0; } static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end) { if (!pool->ptr && !poolGrow(pool)) return 0; for (;;) { XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); if (ptr == end) break; if (!poolGrow(pool)) return 0; } return pool->start; } static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s) { do { if (!poolAppendChar(pool, *s)) return 0; } while (*s++); s = pool->start; poolFinish(pool); return s; } static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) { if (!pool->ptr && !poolGrow(pool)) return 0; for (; n > 0; --n, s++) { if (!poolAppendChar(pool, *s)) return 0; } s = pool->start; poolFinish(pool); return s; } static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end) { if (!poolAppend(pool, enc, ptr, end)) return 0; if (pool->ptr == pool->end && !poolGrow(pool)) return 0; *(pool->ptr)++ = 0; return pool->start; } static int poolGrow(STRING_POOL *pool) { if (pool->freeBlocks) { if (pool->start == 0) { pool->blocks = pool->freeBlocks; pool->freeBlocks = pool->freeBlocks->next; pool->blocks->next = 0; pool->start = pool->blocks->s; pool->end = pool->start + pool->blocks->size; pool->ptr = pool->start; return 1; } if (pool->end - pool->start < pool->freeBlocks->size) { BLOCK *tem = pool->freeBlocks->next; pool->freeBlocks->next = pool->blocks; pool->blocks = pool->freeBlocks; pool->freeBlocks = tem; memcpy(pool->blocks->s, pool->start, (pool->end - pool->start) * sizeof(XML_Char)); pool->ptr = pool->blocks->s + (pool->ptr - pool->start); pool->start = pool->blocks->s; pool->end = pool->start + pool->blocks->size; return 1; } } if (pool->blocks && pool->start == pool->blocks->s) { int blockSize = (pool->end - pool->start)*2; pool->blocks = realloc(pool->blocks, offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!pool->blocks) return 0; pool->blocks->size = blockSize; pool->ptr = pool->blocks->s + (pool->ptr - pool->start); pool->start = pool->blocks->s; pool->end = pool->start + blockSize; } else { BLOCK *tem; int blockSize = pool->end - pool->start; if (blockSize < INIT_BLOCK_SIZE) blockSize = INIT_BLOCK_SIZE; else blockSize *= 2; tem = malloc(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!tem) return 0; tem->size = blockSize; tem->next = pool->blocks; pool->blocks = tem; memcpy(tem->s, pool->start, (pool->ptr - pool->start) * sizeof(XML_Char)); pool->ptr = tem->s + (pool->ptr - pool->start); pool->start = tem->s; pool->end = tem->s + blockSize; } return 1; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmlparse.h000644 000765 000024 00000000430 12161600406 022317 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmlparse.h000644 000765 000024 00000033264 12161600406 022115 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #ifndef XmlParse_INCLUDED #define XmlParse_INCLUDED 1 #ifdef __cplusplus extern "C" { #endif #ifndef XMLPARSEAPI #define XMLPARSEAPI /* as nothing */ #endif typedef void *XML_Parser; #ifdef XML_UNICODE_WCHAR_T /* XML_UNICODE_WCHAR_T will work only if sizeof(wchar_t) == 2 and wchar_t uses Unicode. */ /* Information is UTF-16 encoded as wchar_ts */ #ifndef XML_UNICODE #define XML_UNICODE #endif #include typedef wchar_t XML_Char; typedef wchar_t XML_LChar; #else /* not XML_UNICODE_WCHAR_T */ #ifdef XML_UNICODE /* Information is UTF-16 encoded as unsigned shorts */ typedef unsigned short XML_Char; typedef char XML_LChar; #else /* not XML_UNICODE */ /* Information is UTF-8 encoded. */ typedef char XML_Char; typedef char XML_LChar; #endif /* not XML_UNICODE */ #endif /* not XML_UNICODE_WCHAR_T */ /* Constructs a new parser; encoding is the encoding specified by the external protocol or null if there is none specified. */ XML_Parser XMLPARSEAPI XML_ParserCreate(const XML_Char *encoding); /* atts is array of name/value pairs, terminated by 0; names and values are 0 terminated. */ typedef void (*XML_StartElementHandler)(void *userData, const XML_Char *name, const XML_Char **atts); typedef void (*XML_EndElementHandler)(void *userData, const XML_Char *name); /* s is not 0 terminated. */ typedef void (*XML_CharacterDataHandler)(void *userData, const XML_Char *s, size_t len); /* target and data are 0 terminated */ typedef void (*XML_ProcessingInstructionHandler)(void *userData, const XML_Char *target, const XML_Char *data); /* This is called for any characters in the XML document for which there is no applicable handler. This includes both characters that are part of markup which is of a kind that is not reported (comments, markup declarations), or characters that are part of a construct which could be reported but for which no handler has been supplied. The characters are passed exactly as they were in the XML document except that they will be encoded in UTF-8. Line boundaries are not normalized. Note that a byte order mark character is not passed to the default handler. If a default handler is set, internal entity references are not expanded. There are no guarantees about how characters are divided between calls to the default handler: for example, a comment might be split between multiple calls. */ typedef void (*XML_DefaultHandler)(void *userData, const XML_Char *s, int len); /* This is called for a declaration of an unparsed (NDATA) entity. The base argument is whatever was set by XML_SetBase. The entityName, systemId and notationName arguments will never be null. The other arguments may be. */ typedef void (*XML_UnparsedEntityDeclHandler)(void *userData, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName); /* This is called for a declaration of notation. The base argument is whatever was set by XML_SetBase. The notationName will never be null. The other arguments can be. */ typedef void (*XML_NotationDeclHandler)(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); /* This is called for a reference to an external parsed general entity. The referenced entity is not automatically parsed. The application can parse it immediately or later using XML_ExternalEntityParserCreate. The parser argument is the parser parsing the entity containing the reference; it can be passed as the parser argument to XML_ExternalEntityParserCreate. The systemId argument is the system identifier as specified in the entity declaration; it will not be null. The base argument is the system identifier that should be used as the base for resolving systemId if systemId was relative; this is set by XML_SetBase; it may be null. The publicId argument is the public identifier as specified in the entity declaration, or null if none was specified; the whitespace in the public identifier will have been normalized as required by the XML spec. The openEntityNames argument is a space-separated list of the names of the entities that are open for the parse of this entity (including the name of the referenced entity); this can be passed as the openEntityNames argument to XML_ExternalEntityParserCreate; openEntityNames is valid only until the handler returns, so if the referenced entity is to be parsed later, it must be copied. The handler should return 0 if processing should not continue because of a fatal error in the handling of the external entity. In this case the calling parser will return an XML_ERROR_EXTERNAL_ENTITY_HANDLING error. Note that unlike other handlers the first argument is the parser, not userData. */ typedef int (*XML_ExternalEntityRefHandler)(XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); /* This structure is filled in by the XML_UnknownEncodingHandler to provide information to the parser about encodings that are unknown to the parser. The map[b] member gives information about byte sequences whose first byte is b. If map[b] is c where c is >= 0, then b by itself encodes the Unicode scalar value c. If map[b] is -1, then the byte sequence is malformed. If map[b] is -n, where n >= 2, then b is the first byte of an n-byte sequence that encodes a single Unicode scalar value. The data member will be passed as the first argument to the convert function. The convert function is used to convert multibyte sequences; s will point to a n-byte sequence where map[(unsigned char)*s] == -n. The convert function must return the Unicode scalar value represented by this byte sequence or -1 if the byte sequence is malformed. The convert function may be null if the encoding is a single-byte encoding, that is if map[b] >= -1 for all bytes b. When the parser is finished with the encoding, then if release is not null, it will call release passing it the data member; once release has been called, the convert function will not be called again. Expat places certain restrictions on the encodings that are supported using this mechanism. 1. Every ASCII character that can appear in a well-formed XML document, other than the characters $@\^`{}~ must be represented by a single byte, and that byte must be the same byte that represents that character in ASCII. 2. No character may require more than 4 bytes to encode. 3. All characters encoded must have Unicode scalar values <= 0xFFFF, (ie characters that would be encoded by surrogates in UTF-16 are not allowed). Note that this restriction doesn't apply to the built-in support for UTF-8 and UTF-16. 4. No Unicode character may be encoded by more than one distinct sequence of bytes. */ typedef struct { int map[256]; void *data; int (*convert)(void *data, const char *s); void (*release)(void *data); } XML_Encoding; /* This is called for an encoding that is unknown to the parser. The encodingHandlerData argument is that which was passed as the second argument to XML_SetUnknownEncodingHandler. The name argument gives the name of the encoding as specified in the encoding declaration. If the callback can provide information about the encoding, it must fill in the XML_Encoding structure, and return 1. Otherwise it must return 0. If info does not describe a suitable encoding, then the parser will return an XML_UNKNOWN_ENCODING error. */ typedef int (*XML_UnknownEncodingHandler)(void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); void XMLPARSEAPI XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end); void XMLPARSEAPI XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler); void XMLPARSEAPI XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler); void XMLPARSEAPI XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler); void XMLPARSEAPI XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler); void XMLPARSEAPI XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler); void XMLPARSEAPI XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler); void XMLPARSEAPI XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData); /* This can be called within a handler for a start element, end element, processing instruction or character data. It causes the corresponding markup to be passed to the default handler. Within the expansion of an internal entity, nothing will be passed to the default handler, although this usually will not happen since setting a default handler inhibits expansion of internal entities. */ void XMLPARSEAPI XML_DefaultCurrent(XML_Parser parser); /* This value is passed as the userData argument to callbacks. */ void XMLPARSEAPI XML_SetUserData(XML_Parser parser, void *userData); /* Returns the last value set by XML_SetUserData or null. */ #define XML_GetUserData(parser) (*(void **)(parser)) /* If this function is called, then the parser will be passed as the first argument to callbacks instead of userData. The userData will still be accessible using XML_GetUserData. */ void XMLPARSEAPI XML_UseParserAsHandlerArg(XML_Parser parser); /* Sets the base to be used for resolving relative URIs in system identifiers in declarations. Resolving relative identifiers is left to the application: this value will be passed through as the base argument to the XML_ExternalEntityRefHandler, XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base argument will be copied. Returns zero if out of memory, non-zero otherwise. */ int XMLPARSEAPI XML_SetBase(XML_Parser parser, const XML_Char *base); const XML_Char XMLPARSEAPI * XML_GetBase(XML_Parser parser); /* Parses some input. Returns 0 if a fatal error is detected. The last call to XML_Parse must have isFinal true; len may be zero for this call (or any other). */ int XMLPARSEAPI XML_Parse(XML_Parser parser, const char *s, size_t len, int isFinal); void XMLPARSEAPI * XML_GetBuffer(XML_Parser parser, size_t len); int XMLPARSEAPI XML_ParseBuffer(XML_Parser parser, size_t len, int isFinal); /* Creates an XML_Parser object that can parse an external general entity; openEntityNames is a space-separated list of the names of the entities that are open for the parse of this entity (including the name of this one); encoding is the externally specified encoding, or null if there is no externally specified encoding. This can be called at any point after the first call to an ExternalEntityRefHandler so longer as the parser has not yet been freed. The new parser is completely independent and may safely be used in a separate thread. The handlers and userData are initialized from the parser argument. Returns 0 if out of memory. Otherwise returns a new XML_Parser object. */ XML_Parser XMLPARSEAPI XML_ExternalEntityParserCreate(XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *encoding); enum XML_Error { XML_ERROR_NONE, XML_ERROR_NO_MEMORY, XML_ERROR_SYNTAX, XML_ERROR_NO_ELEMENTS, XML_ERROR_INVALID_TOKEN, XML_ERROR_UNCLOSED_TOKEN, XML_ERROR_PARTIAL_CHAR, XML_ERROR_TAG_MISMATCH, XML_ERROR_DUPLICATE_ATTRIBUTE, XML_ERROR_JUNK_AFTER_DOC_ELEMENT, XML_ERROR_PARAM_ENTITY_REF, XML_ERROR_UNDEFINED_ENTITY, XML_ERROR_RECURSIVE_ENTITY_REF, XML_ERROR_ASYNC_ENTITY, XML_ERROR_BAD_CHAR_REF, XML_ERROR_BINARY_ENTITY_REF, XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, XML_ERROR_MISPLACED_XML_PI, XML_ERROR_UNKNOWN_ENCODING, XML_ERROR_INCORRECT_ENCODING, XML_ERROR_UNCLOSED_CDATA_SECTION, XML_ERROR_EXTERNAL_ENTITY_HANDLING }; /* If XML_Parse or XML_ParseBuffer have returned 0, then XML_GetErrorCode returns information about the error. */ enum XML_Error XMLPARSEAPI XML_GetErrorCode(XML_Parser parser); /* These functions return information about the current parse location. They may be called when XML_Parse or XML_ParseBuffer return 0; in this case the location is the location of the character at which the error was detected. They may also be called from any other callback called to report some parse event; in this the location is the location of the first of the sequence of characters that generated the event. */ int XMLPARSEAPI XML_GetCurrentLineNumber(XML_Parser parser); int XMLPARSEAPI XML_GetCurrentColumnNumber(XML_Parser parser); long XMLPARSEAPI XML_GetCurrentByteIndex(XML_Parser parser); /* For backwards compatibility with previous versions. */ #define XML_GetErrorLineNumber XML_GetCurrentLineNumber #define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber #define XML_GetErrorByteIndex XML_GetCurrentByteIndex /* Frees memory used by the parser. */ void XMLPARSEAPI XML_ParserFree(XML_Parser parser); /* Returns a string describing the error. */ const XML_LChar XMLPARSEAPI *XML_ErrorString(enum XML_Error code); #ifdef __cplusplus } #endif #endif /* not XmlParse_INCLUDED */ ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmlrole.c000644 000765 000024 00000000430 12161600406 022141 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmlrole.c000644 000765 000024 00000055426 12161600406 021743 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include /* for time_t */ #include "xmldef.h" #include "xmlrole.h" /* Doesn't check: that ,| are not mixed in a model group content of literals */ #ifndef MIN_BYTES_PER_CHAR #define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) #endif typedef int PROLOG_HANDLER(struct prolog_state *state, int tok, const char *ptr, const char *end, const ENCODING *enc); static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2, entity3, entity4, entity5, entity6, entity7, entity8, entity9, notation0, notation1, notation2, notation3, notation4, attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8, attlist9, element0, element1, element2, element3, element4, element5, element6, element7, declClose, error; static int syntaxError(PROLOG_STATE *); static int prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: state->handler = prolog1; return XML_ROLE_NONE; case XML_TOK_XML_DECL: state->handler = prolog1; return XML_ROLE_XML_DECL; case XML_TOK_PI: state->handler = prolog1; return XML_ROLE_NONE; case XML_TOK_COMMENT: state->handler = prolog1; case XML_TOK_BOM: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (!XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "DOCTYPE")) break; state->handler = doctype0; return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return syntaxError(state); } static int prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PI: case XML_TOK_COMMENT: case XML_TOK_BOM: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (!XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "DOCTYPE")) break; state->handler = doctype0; return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return syntaxError(state); } static int prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PI: case XML_TOK_COMMENT: return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return syntaxError(state); } static int doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = doctype1; return XML_ROLE_DOCTYPE_NAME; } return syntaxError(state); } static int doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = doctype3; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = doctype2; return XML_ROLE_NONE; } break; } return syntaxError(state); } static int doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = doctype3; return XML_ROLE_DOCTYPE_PUBLIC_ID; } return syntaxError(state); } static int doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = doctype4; return XML_ROLE_DOCTYPE_SYSTEM_ID; } return syntaxError(state); } static int doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; } return syntaxError(state); } static int doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; } return syntaxError(state); } static int internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "ENTITY")) { state->handler = entity0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "ATTLIST")) { state->handler = attlist0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "ELEMENT")) { state->handler = element0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), "NOTATION")) { state->handler = notation0; return XML_ROLE_NONE; } break; case XML_TOK_PI: case XML_TOK_COMMENT: return XML_ROLE_NONE; case XML_TOK_PARAM_ENTITY_REF: return XML_ROLE_PARAM_ENTITY_REF; case XML_TOK_CLOSE_BRACKET: state->handler = doctype5; return XML_ROLE_NONE; } return syntaxError(state); } static int entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PERCENT: state->handler = entity1; return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = entity2; return XML_ROLE_GENERAL_ENTITY_NAME; } return syntaxError(state); } static int entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = entity7; return XML_ROLE_PARAM_ENTITY_NAME; } return syntaxError(state); } static int entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = entity4; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = entity3; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_VALUE; } return syntaxError(state); } static int entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity4; return XML_ROLE_ENTITY_PUBLIC_ID; } return syntaxError(state); } static int entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity5; return XML_ROLE_ENTITY_SYSTEM_ID; } return syntaxError(state); } static int entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "NDATA")) { state->handler = entity6; return XML_ROLE_NONE; } break; } return syntaxError(state); } static int entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = declClose; return XML_ROLE_ENTITY_NOTATION_NAME; } return syntaxError(state); } static int entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = entity9; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = entity8; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_VALUE; } return syntaxError(state); } static int entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity9; return XML_ROLE_ENTITY_PUBLIC_ID; } return syntaxError(state); } static int entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_SYSTEM_ID; } return syntaxError(state); } static int notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = notation1; return XML_ROLE_NOTATION_NAME; } return syntaxError(state); } static int notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "SYSTEM")) { state->handler = notation3; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, "PUBLIC")) { state->handler = notation2; return XML_ROLE_NONE; } break; } return syntaxError(state); } static int notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = notation4; return XML_ROLE_NOTATION_PUBLIC_ID; } return syntaxError(state); } static int notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_NOTATION_SYSTEM_ID; } return syntaxError(state); } static int notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_NOTATION_SYSTEM_ID; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NOTATION_NO_SYSTEM_ID; } return syntaxError(state); } static int attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = attlist1; return XML_ROLE_ATTLIST_ELEMENT_NAME; } return syntaxError(state); } static int attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = attlist2; return XML_ROLE_ATTRIBUTE_NAME; } return syntaxError(state); } static int attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: { static const char *types[] = { "CDATA", "ID", "IDREF", "IDREFS", "ENTITY", "ENTITIES", "NMTOKEN", "NMTOKENS", }; int i; for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) if (XmlNameMatchesAscii(enc, ptr, types[i])) { state->handler = attlist8; return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; } } if (XmlNameMatchesAscii(enc, ptr, "NOTATION")) { state->handler = attlist5; return XML_ROLE_NONE; } break; case XML_TOK_OPEN_PAREN: state->handler = attlist3; return XML_ROLE_NONE; } return syntaxError(state); } static int attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NMTOKEN: case XML_TOK_NAME: state->handler = attlist4; return XML_ROLE_ATTRIBUTE_ENUM_VALUE; } return syntaxError(state); } static int attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->handler = attlist8; return XML_ROLE_NONE; case XML_TOK_OR: state->handler = attlist3; return XML_ROLE_NONE; } return syntaxError(state); } static int attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_PAREN: state->handler = attlist6; return XML_ROLE_NONE; } return syntaxError(state); } static int attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = attlist7; return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; } return syntaxError(state); } static int attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->handler = attlist8; return XML_ROLE_NONE; case XML_TOK_OR: state->handler = attlist6; return XML_ROLE_NONE; } return syntaxError(state); } /* default value */ static int attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_POUND_NAME: if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "IMPLIED")) { state->handler = attlist1; return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; } if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "REQUIRED")) { state->handler = attlist1; return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; } if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "FIXED")) { state->handler = attlist9; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = attlist1; return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; } return syntaxError(state); } static int attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = attlist1; return XML_ROLE_FIXED_ATTRIBUTE_VALUE; } return syntaxError(state); } static int element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = element1; return XML_ROLE_ELEMENT_NAME; } return syntaxError(state); } static int element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, "EMPTY")) { state->handler = declClose; return XML_ROLE_CONTENT_EMPTY; } if (XmlNameMatchesAscii(enc, ptr, "ANY")) { state->handler = declClose; return XML_ROLE_CONTENT_ANY; } break; case XML_TOK_OPEN_PAREN: state->handler = element2; state->level = 1; return XML_ROLE_GROUP_OPEN; } return syntaxError(state); } static int element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_POUND_NAME: if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), "PCDATA")) { state->handler = element3; return XML_ROLE_CONTENT_PCDATA; } break; case XML_TOK_OPEN_PAREN: state->level = 2; state->handler = element6; return XML_ROLE_GROUP_OPEN; case XML_TOK_NAME: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT; case XML_TOK_NAME_QUESTION: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_OPT; case XML_TOK_NAME_ASTERISK: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_REP; case XML_TOK_NAME_PLUS: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_PLUS; } return syntaxError(state); } static int element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: case XML_TOK_CLOSE_PAREN_ASTERISK: state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_OR: state->handler = element4; return XML_ROLE_NONE; } return syntaxError(state); } static int element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = element5; return XML_ROLE_CONTENT_ELEMENT; } return syntaxError(state); } static int element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN_ASTERISK: state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_OR: state->handler = element4; return XML_ROLE_NONE; } return syntaxError(state); } static int element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_PAREN: state->level += 1; return XML_ROLE_GROUP_OPEN; case XML_TOK_NAME: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT; case XML_TOK_NAME_QUESTION: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_OPT; case XML_TOK_NAME_ASTERISK: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_REP; case XML_TOK_NAME_PLUS: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_PLUS; } return syntaxError(state); } static int element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE; case XML_TOK_CLOSE_PAREN_ASTERISK: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_CLOSE_PAREN_QUESTION: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_OPT; case XML_TOK_CLOSE_PAREN_PLUS: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_PLUS; case XML_TOK_COMMA: state->handler = element6; return XML_ROLE_GROUP_SEQUENCE; case XML_TOK_OR: state->handler = element6; return XML_ROLE_GROUP_CHOICE; } return syntaxError(state); } static int declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return XML_ROLE_NONE; } return syntaxError(state); } #if 0 static int ignore(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return 0; default: return XML_ROLE_NONE; } return syntaxError(state); } #endif static int error(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { return XML_ROLE_NONE; } static int syntaxError(PROLOG_STATE *state) { state->handler = error; return XML_ROLE_ERROR; } void XmlPrologStateInit(PROLOG_STATE *state) { state->handler = prolog0; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmlrole.h000644 000765 000024 00000000430 12161600406 022146 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmlrole.h000644 000765 000024 00000005167 12161600406 021745 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #ifndef XmlRole_INCLUDED #define XmlRole_INCLUDED 1 #include "xmltok.h" #ifdef __cplusplus extern "C" { #endif enum { XML_ROLE_ERROR = -1, XML_ROLE_NONE = 0, XML_ROLE_XML_DECL, XML_ROLE_INSTANCE_START, XML_ROLE_DOCTYPE_NAME, XML_ROLE_DOCTYPE_SYSTEM_ID, XML_ROLE_DOCTYPE_PUBLIC_ID, XML_ROLE_DOCTYPE_CLOSE, XML_ROLE_GENERAL_ENTITY_NAME, XML_ROLE_PARAM_ENTITY_NAME, XML_ROLE_ENTITY_VALUE, XML_ROLE_ENTITY_SYSTEM_ID, XML_ROLE_ENTITY_PUBLIC_ID, XML_ROLE_ENTITY_NOTATION_NAME, XML_ROLE_NOTATION_NAME, XML_ROLE_NOTATION_SYSTEM_ID, XML_ROLE_NOTATION_NO_SYSTEM_ID, XML_ROLE_NOTATION_PUBLIC_ID, XML_ROLE_ATTRIBUTE_NAME, XML_ROLE_ATTRIBUTE_TYPE_CDATA, XML_ROLE_ATTRIBUTE_TYPE_ID, XML_ROLE_ATTRIBUTE_TYPE_IDREF, XML_ROLE_ATTRIBUTE_TYPE_IDREFS, XML_ROLE_ATTRIBUTE_TYPE_ENTITY, XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, XML_ROLE_ATTRIBUTE_ENUM_VALUE, XML_ROLE_ATTRIBUTE_NOTATION_VALUE, XML_ROLE_ATTLIST_ELEMENT_NAME, XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, XML_ROLE_FIXED_ATTRIBUTE_VALUE, XML_ROLE_ELEMENT_NAME, XML_ROLE_CONTENT_ANY, XML_ROLE_CONTENT_EMPTY, XML_ROLE_CONTENT_PCDATA, XML_ROLE_GROUP_OPEN, XML_ROLE_GROUP_CLOSE, XML_ROLE_GROUP_CLOSE_REP, XML_ROLE_GROUP_CLOSE_OPT, XML_ROLE_GROUP_CLOSE_PLUS, XML_ROLE_GROUP_CHOICE, XML_ROLE_GROUP_SEQUENCE, XML_ROLE_CONTENT_ELEMENT, XML_ROLE_CONTENT_ELEMENT_REP, XML_ROLE_CONTENT_ELEMENT_OPT, XML_ROLE_CONTENT_ELEMENT_PLUS, XML_ROLE_PARAM_ENTITY_REF }; typedef struct prolog_state { int (*handler)(struct prolog_state *state, int tok, const char *ptr, const char *end, const ENCODING *enc); unsigned level; } PROLOG_STATE; void XMLTOKAPI XmlPrologStateInit(PROLOG_STATE *); #define XmlTokenRole(state, tok, ptr, end, enc) \ (((state)->handler)(state, tok, ptr, end, enc)) #ifdef __cplusplus } #endif #endif /* not XmlRole_INCLUDED */ ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmltok.c000644 000765 000024 00000000430 12161600406 021775 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmltok.c000644 000765 000024 00000066403 12161600406 021574 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include /*for size_t */ #include "xmldef.h" #include "xmltok.h" #include "nametab.h" #define VTABLE1 \ { PREFIX(prologTok), PREFIX(contentTok), PREFIX(cdataSectionTok) }, \ { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ PREFIX(sameName), \ PREFIX(nameMatchesAscii), \ PREFIX(nameLength), \ PREFIX(skipS), \ PREFIX(getAtts), \ PREFIX(charRefNumber), \ PREFIX(predefinedEntityName), \ PREFIX(updatePosition), \ PREFIX(isPublicId) #define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) #define UCS2_GET_NAMING(pages, hi, lo) \ (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) /* A 2 byte UTF-8 representation splits the characters 11 bits between the bottom 5 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ #define UTF8_GET_NAMING2(pages, byte) \ (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + ((((byte)[0]) & 3) << 1) \ + ((((byte)[1]) >> 5) & 1)] \ & (1 << (((byte)[1]) & 0x1F))) /* A 3 byte UTF-8 representation splits the characters 16 bits between the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ #define UTF8_GET_NAMING3(pages, byte) \ (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ + ((((byte)[1]) >> 2) & 0xF)] \ << 3) \ + ((((byte)[1]) & 3) << 1) \ + ((((byte)[2]) >> 5) & 1)] \ & (1 << (((byte)[2]) & 0x1F))) #define UTF8_GET_NAMING(pages, p, n) \ ((n) == 2 \ ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ : ((n) == 3 \ ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ : 0)) #define UTF8_INVALID3(p) \ ((*p) == 0xED \ ? (((p)[1] & 0x20) != 0) \ : ((*p) == 0xEF \ ? ((p)[1] == 0xBF && ((p)[2] == 0xBF || (p)[2] == 0xBE)) \ : 0)) #define UTF8_INVALID4(p) ((*p) == 0xF4 && ((p)[1] & 0x30) != 0) static int isNever(const ENCODING *enc, const char *p) { return 0; } static int utf8_isName2(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); } static int utf8_isName3(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); } #define utf8_isName4 isNever static int utf8_isNmstrt2(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); } static int utf8_isNmstrt3(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); } #define utf8_isNmstrt4 isNever #define utf8_isInvalid2 isNever static int utf8_isInvalid3(const ENCODING *enc, const char *p) { return UTF8_INVALID3((const unsigned char *)p); } static int utf8_isInvalid4(const ENCODING *enc, const char *p) { return UTF8_INVALID4((const unsigned char *)p); } struct normal_encoding { ENCODING enc; unsigned char type[256]; int (*isName2)(const ENCODING *, const char *); int (*isName3)(const ENCODING *, const char *); int (*isName4)(const ENCODING *, const char *); int (*isNmstrt2)(const ENCODING *, const char *); int (*isNmstrt3)(const ENCODING *, const char *); int (*isNmstrt4)(const ENCODING *, const char *); int (*isInvalid2)(const ENCODING *, const char *); int (*isInvalid3)(const ENCODING *, const char *); int (*isInvalid4)(const ENCODING *, const char *); }; #define NORMAL_VTABLE(E) \ E ## isName2, \ E ## isName3, \ E ## isName4, \ E ## isNmstrt2, \ E ## isNmstrt3, \ E ## isNmstrt4, \ E ## isInvalid2, \ E ## isInvalid3, \ E ## isInvalid4 static int checkCharRefNumber(int); #include "xmltok_impl.h" /* minimum bytes per character */ #define MINBPC 1 #define BYTE_TYPE(enc, p) \ (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) #define BYTE_TO_ASCII(enc, p) (*p) #define IS_NAME_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isName ## n(enc, p)) #define IS_NMSTRT_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isNmstrt ## n(enc, p)) #define IS_INVALID_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isInvalid ## n(enc, p)) #define IS_NAME_CHAR_MINBPC(enc, p) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) /* c is an ASCII character */ #define CHAR_MATCHES(enc, p, c) (*(p) == c) #define PREFIX(ident) normal_ ## ident #include "xmltok_impl.c" #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ UTF8_cval1 = 0x00, UTF8_cval2 = 0xc0, UTF8_cval3 = 0xe0, UTF8_cval4 = 0xf0 }; static void utf8_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { char *to; const char *from; if (fromLim - *fromP > toLim - *toP) { /* Avoid copying partial characters. */ for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) break; } for (to = *toP, from = *fromP; from != fromLim; from++, to++) *to = *from; *fromP = from; *toP = to; } static void utf8_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { unsigned short *to = *toP; const char *from = *fromP; while (from != fromLim && to != toLim) { switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { case BT_LEAD2: *to++ = ((from[0] & 0x1f) << 6) | (from[1] & 0x3f); from += 2; break; case BT_LEAD3: *to++ = ((from[0] & 0xf) << 12) | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f); from += 3; break; case BT_LEAD4: { unsigned long n; if (to + 1 == toLim) break; n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); n -= 0x10000; to[0] = (unsigned short)((n >> 10) | 0xD800); to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); to += 2; from += 4; } break; default: *to++ = *from++; break; } } *fromP = from; *toP = to; } static const struct normal_encoding utf8_encoding = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #include "asciitab.h" #include "utf8tab.h" }, NORMAL_VTABLE(utf8_) }; static const struct normal_encoding internal_utf8_encoding = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #include "iasciitab.h" #include "utf8tab.h" }, NORMAL_VTABLE(utf8_) }; static void latin1_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { for (;;) { unsigned char c; if (*fromP == fromLim) break; c = (unsigned char)**fromP; if (c & 0x80) { if (toLim - *toP < 2) break; *(*toP)++ = ((c >> 6) | UTF8_cval2); *(*toP)++ = ((c & 0x3f) | 0x80); (*fromP)++; } else { if (*toP == toLim) break; *(*toP)++ = *(*fromP)++; } } } static void latin1_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { while (*fromP != fromLim && *toP != toLim) *(*toP)++ = (unsigned char)*(*fromP)++; } static const struct normal_encoding latin1_encoding = { { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, { #include "asciitab.h" #include "latin1tab.h" } }; static void ascii_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { while (*fromP != fromLim && *toP != toLim) *(*toP)++ = *(*fromP)++; } static const struct normal_encoding ascii_encoding = { { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, { #include "asciitab.h" /* BT_NONXML == 0 */ } }; #undef PREFIX static int unicode_byte_type(char hi, char lo) { switch ((unsigned char)hi) { case 0xD8: case 0xD9: case 0xDA: case 0xDB: return BT_LEAD4; case 0xDC: case 0xDD: case 0xDE: case 0xDF: return BT_TRAIL; case 0xFF: switch ((unsigned char)lo) { case 0xFF: case 0xFE: return BT_NONXML; } break; } return BT_NONASCII; } #define DEFINE_UTF16_TO_UTF8 \ static \ void PREFIX(toUtf8)(const ENCODING *enc, \ const char **fromP, const char *fromLim, \ char **toP, const char *toLim) \ { \ const char *from; \ for (from = *fromP; from != fromLim; from += 2) { \ int plane; \ unsigned char lo2; \ unsigned char lo = GET_LO(from); \ unsigned char hi = GET_HI(from); \ switch (hi) { \ case 0: \ if (lo < 0x80) { \ if (*toP == toLim) { \ *fromP = from; \ return; \ } \ *(*toP)++ = lo; \ break; \ } \ /* fall through */ \ case 0x1: case 0x2: case 0x3: \ case 0x4: case 0x5: case 0x6: case 0x7: \ if (toLim - *toP < 2) { \ *fromP = from; \ return; \ } \ *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ *(*toP)++ = ((lo & 0x3f) | 0x80); \ break; \ default: \ if (toLim - *toP < 3) { \ *fromP = from; \ return; \ } \ /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ *(*toP)++ = ((lo & 0x3f) | 0x80); \ break; \ case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ if (toLim - *toP < 4) { \ *fromP = from; \ return; \ } \ plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ from += 2; \ lo2 = GET_LO(from); \ *(*toP)++ = (((lo & 0x3) << 4) \ | ((GET_HI(from) & 0x3) << 2) \ | (lo2 >> 6) \ | 0x80); \ *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ break; \ } \ } \ *fromP = from; \ } #define DEFINE_UTF16_TO_UTF16 \ static \ void PREFIX(toUtf16)(const ENCODING *enc, \ const char **fromP, const char *fromLim, \ unsigned short **toP, const unsigned short *toLim) \ { \ /* Avoid copying first half only of surrogate */ \ if (fromLim - *fromP > ((toLim - *toP) << 1) \ && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ fromLim -= 2; \ for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ } #define PREFIX(ident) little2_ ## ident #define MINBPC 2 #define BYTE_TYPE(enc, p) \ ((p)[1] == 0 \ ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ : unicode_byte_type((p)[1], (p)[0])) #define BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) #define CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) #define IS_NAME_CHAR(enc, p, n) (0) #define IS_NAME_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) #define IS_NMSTRT_CHAR(enc, p, n) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) #include "xmltok_impl.c" #define SET2(ptr, ch) \ (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) #define GET_LO(ptr) ((unsigned char)(ptr)[0]) #define GET_HI(ptr) ((unsigned char)(ptr)[1]) DEFINE_UTF16_TO_UTF8 DEFINE_UTF16_TO_UTF16 #undef SET2 #undef GET_LO #undef GET_HI #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR static const struct normal_encoding little2_encoding = { { VTABLE, 2, 0, #if BYTE_ORDER == 12 1 #else 0 #endif }, #include "asciitab.h" #include "latin1tab.h" }; #if BYTE_ORDER != 21 static const struct normal_encoding internal_little2_encoding = { { VTABLE, 2, 0, 1 }, #include "iasciitab.h" #include "latin1tab.h" }; #endif #undef PREFIX #define PREFIX(ident) big2_ ## ident #define MINBPC 2 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ #define BYTE_TYPE(enc, p) \ ((p)[0] == 0 \ ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ : unicode_byte_type((p)[0], (p)[1])) #define BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) #define CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) #define IS_NAME_CHAR(enc, p, n) 0 #define IS_NAME_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) #define IS_NMSTRT_CHAR(enc, p, n) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) #include "xmltok_impl.c" #define SET2(ptr, ch) \ (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) #define GET_LO(ptr) ((unsigned char)(ptr)[1]) #define GET_HI(ptr) ((unsigned char)(ptr)[0]) DEFINE_UTF16_TO_UTF8 DEFINE_UTF16_TO_UTF16 #undef SET2 #undef GET_LO #undef GET_HI #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR static const struct normal_encoding big2_encoding = { { VTABLE, 2, 0, #if BYTE_ORDER == 21 1 #else 0 #endif }, #include "asciitab.h" #include "latin1tab.h" }; #if BYTE_ORDER != 12 static const struct normal_encoding internal_big2_encoding = { { VTABLE, 2, 0, 1 }, #include "iasciitab.h" #include "latin1tab.h" }; #endif #undef PREFIX static int streqci(const char *s1, const char *s2) { for (;;) { char c1 = *s1++; char c2 = *s2++; if ('a' <= c1 && c1 <= 'z') c1 += 'A' - 'a'; if ('a' <= c2 && c2 <= 'z') c2 += 'A' - 'a'; if (c1 != c2) return 0; if (!c1) break; } return 1; } static int initScan(const ENCODING *enc, int state, const char *ptr, const char *end, const char **nextTokPtr) { const ENCODING **encPtr; if (ptr == end) return XML_TOK_NONE; encPtr = ((const INIT_ENCODING *)enc)->encPtr; if (ptr + 1 == end) { switch ((unsigned char)*ptr) { case 0xFE: case 0xFF: case 0x00: case 0x3C: return XML_TOK_PARTIAL; } } else { switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { case 0x003C: *encPtr = &big2_encoding.enc; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); case 0xFEFF: *nextTokPtr = ptr + 2; *encPtr = &big2_encoding.enc; return XML_TOK_BOM; case 0x3C00: *encPtr = &little2_encoding.enc; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); case 0xFFFE: *nextTokPtr = ptr + 2; *encPtr = &little2_encoding.enc; return XML_TOK_BOM; } } *encPtr = &utf8_encoding.enc; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } static int initScanProlog(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { return initScan(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr); } static int initScanContent(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { return initScan(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr); } static void initUpdatePosition(const ENCODING *enc, const char *ptr, const char *end, POSITION *pos) { normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); } const ENCODING *XmlGetUtf8InternalEncoding() { return &internal_utf8_encoding.enc; } const ENCODING *XmlGetUtf16InternalEncoding() { #if BYTE_ORDER == 12 return &internal_little2_encoding.enc; #elif BYTE_ORDER == 21 return &internal_big2_encoding.enc; #else const short n = 1; return *(const char *)&n ? &internal_little2_encoding.enc : &internal_big2_encoding.enc; #endif } int XmlInitEncoding(INIT_ENCODING *p, const ENCODING **encPtr, const char *name) { if (name) { if (streqci(name, "ISO-8859-1")) { *encPtr = &latin1_encoding.enc; return 1; } if (streqci(name, "UTF-8")) { *encPtr = &utf8_encoding.enc; return 1; } if (streqci(name, "US-ASCII")) { *encPtr = &ascii_encoding.enc; return 1; } if (!streqci(name, "UTF-16")) return 0; } p->initEnc.scanners[XML_PROLOG_STATE] = initScanProlog; p->initEnc.scanners[XML_CONTENT_STATE] = initScanContent; p->initEnc.updatePosition = initUpdatePosition; p->initEnc.minBytesPerChar = 1; p->encPtr = encPtr; *encPtr = &(p->initEnc); return 1; } static int toAscii(const ENCODING *enc, const char *ptr, const char *end) { char buf[1]; char *p = buf; XmlUtf8Convert(enc, &ptr, end, &p, p + 1); if (p == buf) return -1; else return buf[0]; } static int isSpace(int c) { switch (c) { case ' ': case '\r': case '\n': case '\t': return 1; } return 0; } /* Return 1 if there's just optional white space or there's an S followed by name=val. */ static int parsePseudoAttribute(const ENCODING *enc, const char *ptr, const char *end, const char **namePtr, const char **valPtr, const char **nextTokPtr) { int c; char open; if (ptr == end) { *namePtr = 0; return 1; } if (!isSpace(toAscii(enc, ptr, end))) { *nextTokPtr = ptr; return 0; } do { ptr += enc->minBytesPerChar; } while (isSpace(toAscii(enc, ptr, end))); if (ptr == end) { *namePtr = 0; return 1; } *namePtr = ptr; for (;;) { c = toAscii(enc, ptr, end); if (c == -1) { *nextTokPtr = ptr; return 0; } if (c == '=') break; if (isSpace(c)) { do { ptr += enc->minBytesPerChar; } while (isSpace(c = toAscii(enc, ptr, end))); if (c != '=') { *nextTokPtr = ptr; return 0; } break; } ptr += enc->minBytesPerChar; } if (ptr == *namePtr) { *nextTokPtr = ptr; return 0; } ptr += enc->minBytesPerChar; c = toAscii(enc, ptr, end); while (isSpace(c)) { ptr += enc->minBytesPerChar; c = toAscii(enc, ptr, end); } if (c != '"' && c != '\'') { *nextTokPtr = ptr; return 0; } open = c; ptr += enc->minBytesPerChar; *valPtr = ptr; for (;; ptr += enc->minBytesPerChar) { c = toAscii(enc, ptr, end); if (c == open) break; if (!('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z') && !('0' <= c && c <= '9') && c != '.' && c != '-' && c != '_') { *nextTokPtr = ptr; return 0; } } *nextTokPtr = ptr + enc->minBytesPerChar; return 1; } static const ENCODING *findEncoding(const ENCODING *enc, const char *ptr, const char *end) { #define ENCODING_MAX 128 char buf[ENCODING_MAX]; char *p = buf; int i; XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); if (ptr != end) return 0; *p = 0; for (i = 0; buf[i]; i++) { if ('a' <= buf[i] && buf[i] <= 'z') buf[i] += 'A' - 'a'; } if (streqci(buf, "UTF-8")) return &utf8_encoding.enc; if (streqci(buf, "ISO-8859-1")) return &latin1_encoding.enc; if (streqci(buf, "US-ASCII")) return &ascii_encoding.enc; if (streqci(buf, "UTF-16")) { if (enc->minBytesPerChar == 2) return enc; return &big2_encoding.enc; } return 0; } int XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingName, const ENCODING **encoding, int *standalone) { const char *val = 0; const char *name = 0; ptr += 5 * enc->minBytesPerChar; end -= 2 * enc->minBytesPerChar; if (!parsePseudoAttribute(enc, ptr, end, &name, &val, &ptr) || !name) { *badPtr = ptr; return 0; } if (!XmlNameMatchesAscii(enc, name, "version")) { if (!isGeneralTextEntity) { *badPtr = name; return 0; } } else { if (versionPtr) *versionPtr = val; if (!parsePseudoAttribute(enc, ptr, end, &name, &val, &ptr)) { *badPtr = ptr; return 0; } if (!name) return 1; } if (XmlNameMatchesAscii(enc, name, "encoding")) { int c = toAscii(enc, val, end); if (!('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z')) { *badPtr = val; return 0; } if (encodingName) *encodingName = val; if (encoding) *encoding = findEncoding(enc, val, ptr - enc->minBytesPerChar); if (!parsePseudoAttribute(enc, ptr, end, &name, &val, &ptr)) { *badPtr = ptr; return 0; } if (!name) return 1; } if (!XmlNameMatchesAscii(enc, name, "standalone") || isGeneralTextEntity) { *badPtr = name; return 0; } if (XmlNameMatchesAscii(enc, val, "yes")) { if (standalone) *standalone = 1; } else if (XmlNameMatchesAscii(enc, val, "no")) { if (standalone) *standalone = 0; } else { *badPtr = val; return 0; } while (isSpace(toAscii(enc, ptr, end))) ptr += enc->minBytesPerChar; if (ptr != end) { *badPtr = ptr; return 0; } return 1; } static int checkCharRefNumber(int result) { switch (result >> 8) { case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF: return -1; case 0: if (latin1_encoding.type[result] == BT_NONXML) return -1; break; case 0xFF: if (result == 0xFFFE || result == 0xFFFF) return -1; break; } return result; } size_t XmlUtf8Encode(int c, char *buf) { enum { /* minN is minimum legal resulting value for N byte sequence */ min2 = 0x80, min3 = 0x800, min4 = 0x10000 }; if (c < 0) return 0; if (c < min2) { buf[0] = (c | UTF8_cval1); return 1; } if (c < min3) { buf[0] = ((c >> 6) | UTF8_cval2); buf[1] = ((c & 0x3f) | 0x80); return 2; } if (c < min4) { buf[0] = ((c >> 12) | UTF8_cval3); buf[1] = (((c >> 6) & 0x3f) | 0x80); buf[2] = ((c & 0x3f) | 0x80); return 3; } if (c < 0x110000) { buf[0] = ((c >> 18) | UTF8_cval4); buf[1] = (((c >> 12) & 0x3f) | 0x80); buf[2] = (((c >> 6) & 0x3f) | 0x80); buf[3] = ((c & 0x3f) | 0x80); return 4; } return 0; } size_t XmlUtf16Encode(int charNum, unsigned short *buf) { if (charNum < 0) return 0; if (charNum < 0x10000) { buf[0] = charNum; return 1; } if (charNum < 0x110000) { charNum -= 0x10000; buf[0] = (charNum >> 10) + 0xD800; buf[1] = (charNum & 0x3FF) + 0xDC00; return 2; } return 0; } struct unknown_encoding { struct normal_encoding normal; int (*convert)(void *userData, const char *p); void *userData; unsigned short utf16[256]; char utf8[256][4]; }; int XmlSizeOfUnknownEncoding() { return sizeof(struct unknown_encoding); } static int unknown_isName(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); if (c & ~0xFFFF) return 0; return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); } static int unknown_isNmstrt(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); if (c & ~0xFFFF) return 0; return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); } static int unknown_isInvalid(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; } static void unknown_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { char buf[XML_UTF8_ENCODE_MAX]; for (;;) { const char *utf8; int n; if (*fromP == fromLim) break; utf8 = ((const struct unknown_encoding *)enc)->utf8[(unsigned char)**fromP]; n = *utf8++; if (n == 0) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, *fromP); n = XmlUtf8Encode(c, buf); if (n > toLim - *toP) break; utf8 = buf; *fromP += ((const struct normal_encoding *)enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2); } else { if (n > toLim - *toP) break; (*fromP)++; } do { *(*toP)++ = *utf8++; } while (--n != 0); } } static void unknown_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { while (*fromP != fromLim && *toP != toLim) { unsigned short c = ((const struct unknown_encoding *)enc)->utf16[(unsigned char)**fromP]; if (c == 0) { c = (unsigned short)((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, *fromP); *fromP += ((const struct normal_encoding *)enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2); } else (*fromP)++; *(*toP)++ = c; } } ENCODING * XmlInitUnknownEncoding(void *mem, int *table, int (*convert)(void *userData, const char *p), void *userData) { int i; struct unknown_encoding *e = mem; for (i = 0; i < sizeof(struct normal_encoding); i++) ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; for (i = 0; i < 128; i++) if (latin1_encoding.type[i] != BT_OTHER && latin1_encoding.type[i] != BT_NONXML && table[i] != i) return 0; for (i = 0; i < 256; i++) { int c = table[i]; if (c == -1) { e->normal.type[i] = BT_MALFORM; /* This shouldn't really get used. */ e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; } else if (c < 0) { if (c < -4) return 0; e->normal.type[i] = BT_LEAD2 - (c + 2); e->utf8[i][0] = 0; e->utf16[i] = 0; } else if (c < 0x80) { if (latin1_encoding.type[c] != BT_OTHER && latin1_encoding.type[c] != BT_NONXML && c != i) return 0; e->normal.type[i] = latin1_encoding.type[c]; e->utf8[i][0] = 1; e->utf8[i][1] = (char)c; e->utf16[i] = c == 0 ? 0xFFFF : c; } else if (checkCharRefNumber(c) < 0) { e->normal.type[i] = BT_NONXML; /* This shouldn't really get used. */ e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; } else { if (c > 0xFFFF) return 0; if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) e->normal.type[i] = BT_NMSTRT; else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) e->normal.type[i] = BT_NAME; else e->normal.type[i] = BT_OTHER; e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); e->utf16[i] = c; } } e->userData = userData; e->convert = convert; if (convert) { e->normal.isName2 = unknown_isName; e->normal.isName3 = unknown_isName; e->normal.isName4 = unknown_isName; e->normal.isNmstrt2 = unknown_isNmstrt; e->normal.isNmstrt3 = unknown_isNmstrt; e->normal.isNmstrt4 = unknown_isNmstrt; e->normal.isInvalid2 = unknown_isInvalid; e->normal.isInvalid3 = unknown_isInvalid; e->normal.isInvalid4 = unknown_isInvalid; } e->normal.enc.utf8Convert = unknown_toUtf8; e->normal.enc.utf16Convert = unknown_toUtf16; return &(e->normal.enc); } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmltok.h000644 000765 000024 00000000430 12161600406 022002 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmltok.h000644 000765 000024 00000022164 12161600406 021575 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #ifndef XmlTok_INCLUDED #define XmlTok_INCLUDED 1 #ifdef __cplusplus extern "C" { #endif #ifndef XMLTOKAPI #define XMLTOKAPI /* as nothing */ #endif /* The following token may be returned by XmlContentTok */ #define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be start of illegal ]]> sequence */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok */ #define XML_TOK_NONE -4 /* The string to be scanned is empty */ #define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; might be part of CRLF sequence */ #define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ #define XML_TOK_PARTIAL -1 /* only part of a token */ #define XML_TOK_INVALID 0 /* The following tokens are returned by XmlContentTok; some are also returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok */ #define XML_TOK_START_TAG_WITH_ATTS 1 #define XML_TOK_START_TAG_NO_ATTS 2 #define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ #define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 #define XML_TOK_END_TAG 5 #define XML_TOK_DATA_CHARS 6 #define XML_TOK_DATA_NEWLINE 7 #define XML_TOK_CDATA_SECT_OPEN 8 #define XML_TOK_ENTITY_REF 9 #define XML_TOK_CHAR_REF 10 /* numeric character reference */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok */ #define XML_TOK_PI 11 /* processing instruction */ #define XML_TOK_XML_DECL 12 /* XML decl or text decl */ #define XML_TOK_COMMENT 13 #define XML_TOK_BOM 14 /* Byte order mark */ /* The following tokens are returned only by XmlPrologTok */ #define XML_TOK_PROLOG_S 15 #define XML_TOK_DECL_OPEN 16 /* */ #define XML_TOK_NAME 18 #define XML_TOK_NMTOKEN 19 #define XML_TOK_POUND_NAME 20 /* #name */ #define XML_TOK_OR 21 /* | */ #define XML_TOK_PERCENT 22 #define XML_TOK_OPEN_PAREN 23 #define XML_TOK_CLOSE_PAREN 24 #define XML_TOK_OPEN_BRACKET 25 #define XML_TOK_CLOSE_BRACKET 26 #define XML_TOK_LITERAL 27 #define XML_TOK_PARAM_ENTITY_REF 28 #define XML_TOK_INSTANCE_START 29 /* The following occur only in element type declarations */ #define XML_TOK_NAME_QUESTION 30 /* name? */ #define XML_TOK_NAME_ASTERISK 31 /* name* */ #define XML_TOK_NAME_PLUS 32 /* name+ */ #define XML_TOK_COND_SECT_OPEN 33 /* */ #define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ #define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ #define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ #define XML_TOK_COMMA 38 /* The following token is returned only by XmlAttributeValueTok */ #define XML_TOK_ATTRIBUTE_VALUE_S 39 /* The following token is returned only by XmlCdataSectionTok */ #define XML_TOK_CDATA_SECT_CLOSE 40 #define XML_N_STATES 3 #define XML_PROLOG_STATE 0 #define XML_CONTENT_STATE 1 #define XML_CDATA_SECTION_STATE 2 #define XML_N_LITERAL_TYPES 2 #define XML_ATTRIBUTE_VALUE_LITERAL 0 #define XML_ENTITY_VALUE_LITERAL 1 /* The size of the buffer passed to XmlUtf8Encode must be at least this. */ #define XML_UTF8_ENCODE_MAX 4 /* The size of the buffer passed to XmlUtf16Encode must be at least this. */ #define XML_UTF16_ENCODE_MAX 2 typedef struct position { /* first line and first column are 0 not 1 */ unsigned long lineNumber; unsigned long columnNumber; } POSITION; typedef struct { const char *name; const char *valuePtr; const char *valueEnd; char normalized; } ATTRIBUTE; struct encoding; typedef struct encoding ENCODING; struct encoding { int (*scanners[XML_N_STATES])(const ENCODING *, const char *, const char *, const char **); int (*literalScanners[XML_N_LITERAL_TYPES])(const ENCODING *, const char *, const char *, const char **); int (*sameName)(const ENCODING *, const char *, const char *); int (*nameMatchesAscii)(const ENCODING *, const char *, const char *); int (*nameLength)(const ENCODING *, const char *); const char *(*skipS)(const ENCODING *, const char *); int (*getAtts)(const ENCODING *enc, const char *ptr, int attsMax, ATTRIBUTE *atts); int (*charRefNumber)(const ENCODING *enc, const char *ptr); int (*predefinedEntityName)(const ENCODING *, const char *, const char *); void (*updatePosition)(const ENCODING *, const char *ptr, const char *end, POSITION *); int (*isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr); void (*utf8Convert)(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim); void (*utf16Convert)(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim); int minBytesPerChar; char isUtf8; char isUtf16; }; /* Scan the string starting at ptr until the end of the next complete token, but do not scan past eptr. Return an integer giving the type of token. Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. Return XML_TOK_PARTIAL when the string does not contain a complete token; nextTokPtr will not be set. Return XML_TOK_INVALID when the string does not start a valid token; nextTokPtr will be set to point to the character which made the token invalid. Otherwise the string starts with a valid token; nextTokPtr will be set to point to the character following the end of that token. Each data character counts as a single token, but adjacent data characters may be returned together. Similarly for characters in the prolog outside literals, comments and processing instructions. */ #define XmlTok(enc, state, ptr, end, nextTokPtr) \ (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) #define XmlPrologTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) #define XmlContentTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) #define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) /* This is used for performing a 2nd-level tokenization on the content of a literal that has already been returned by XmlTok. */ #define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) #define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) #define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) #define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) #define XmlNameMatchesAscii(enc, ptr1, ptr2) \ (((enc)->nameMatchesAscii)(enc, ptr1, ptr2)) #define XmlNameLength(enc, ptr) \ (((enc)->nameLength)(enc, ptr)) #define XmlSkipS(enc, ptr) \ (((enc)->skipS)(enc, ptr)) #define XmlGetAttributes(enc, ptr, attsMax, atts) \ (((enc)->getAtts)(enc, ptr, attsMax, atts)) #define XmlCharRefNumber(enc, ptr) \ (((enc)->charRefNumber)(enc, ptr)) #define XmlPredefinedEntityName(enc, ptr, end) \ (((enc)->predefinedEntityName)(enc, ptr, end)) #define XmlUpdatePosition(enc, ptr, end, pos) \ (((enc)->updatePosition)(enc, ptr, end, pos)) #define XmlIsPublicId(enc, ptr, end, badPtr) \ (((enc)->isPublicId)(enc, ptr, end, badPtr)) #define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) #define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) typedef struct { ENCODING initEnc; const ENCODING **encPtr; } INIT_ENCODING; int XMLTOKAPI XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingNamePtr, const ENCODING **namedEncodingPtr, int *standalonePtr); int XMLTOKAPI XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); const ENCODING XMLTOKAPI *XmlGetUtf8InternalEncoding(); const ENCODING XMLTOKAPI *XmlGetUtf16InternalEncoding(); size_t XMLTOKAPI XmlUtf8Encode(int charNumber, char *buf); size_t XMLTOKAPI XmlUtf16Encode(int charNumber, unsigned short *buf); int XMLTOKAPI XmlSizeOfUnknownEncoding(); ENCODING XMLTOKAPI * XmlInitUnknownEncoding(void *mem, int *table, int (*convert)(void *userData, const char *p), void *userData); #ifdef __cplusplus } #endif #endif /* not XmlTok_INCLUDED */ ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmltok_impl.c000644 000765 000024 00000000430 12327644373 023035 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmltok_impl.c000644 000765 000024 00000110421 12327644373 022622 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #ifndef IS_INVALID_CHAR #define IS_INVALID_CHAR(enc, ptr, n) (0) #endif #define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (IS_INVALID_CHAR(enc, ptr, n)) { \ *(nextTokPtr) = (ptr); \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define INVALID_CASES(ptr, nextTokPtr) \ INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ case BT_NONXML: \ case BT_MALFORM: \ case BT_TRAIL: \ *(nextTokPtr) = (ptr); \ return XML_TOK_INVALID; #define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (!IS_NAME_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ case BT_NONASCII: \ if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ case BT_NMSTRT: \ case BT_HEX: \ case BT_DIGIT: \ case BT_NAME: \ case BT_MINUS: \ ptr += MINBPC; \ break; \ CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) #define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ case BT_NONASCII: \ if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ case BT_NMSTRT: \ case BT_HEX: \ ptr += MINBPC; \ break; \ CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) #ifndef PREFIX #define PREFIX(ident) ident #endif /* ptr points to character following "')) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC; return XML_TOK_COMMENT; } /* fall through */ default: ptr += MINBPC; break; } } } return XML_TOK_PARTIAL; } /* ptr points to character following " */ switch (BYTE_TYPE(enc, ptr + MINBPC)) { case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_INVALID; } /* fall through */ case BT_S: case BT_CR: case BT_LF: *nextTokPtr = ptr; return XML_TOK_DECL_OPEN; case BT_NMSTRT: case BT_HEX: ptr += MINBPC; break; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr) { int upper = 0; *tokPtr = XML_TOK_PI; if (end - ptr != MINBPC*3) return 1; switch (BYTE_TO_ASCII(enc, ptr)) { case 'x': break; case 'X': upper = 1; break; default: return 1; } ptr += MINBPC; switch (BYTE_TO_ASCII(enc, ptr)) { case 'm': break; case 'M': upper = 1; break; default: return 1; } ptr += MINBPC; switch (BYTE_TO_ASCII(enc, ptr)) { case 'l': break; case 'L': upper = 1; break; default: return 1; } if (upper) return 0; *tokPtr = XML_TOK_XML_DECL; return 1; } /* ptr points to character following "')) { *nextTokPtr = ptr + MINBPC; return tok; } break; default: ptr += MINBPC; break; } } return XML_TOK_PARTIAL; case BT_QUEST: if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { *nextTokPtr = ptr; return XML_TOK_INVALID; } ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, '>')) { *nextTokPtr = ptr + MINBPC; return tok; } /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { int i; /* CDATA[ */ if (end - ptr < 6 * MINBPC) return XML_TOK_PARTIAL; for (i = 0; i < 6; i++, ptr += MINBPC) { if (!CHAR_MATCHES(enc, ptr, "CDATA["[i])) { *nextTokPtr = ptr; return XML_TOK_INVALID; } } *nextTokPtr = ptr; return XML_TOK_CDATA_SECT_OPEN; } static int PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_NONE; #if MINBPC > 1 { size_t n = end - ptr; if (n & (MINBPC - 1)) { n &= ~(MINBPC - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } #endif switch (BYTE_TYPE(enc, ptr)) { case BT_RSQB: ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, ']')) break; ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, '>')) { ptr -= MINBPC; break; } *nextTokPtr = ptr + MINBPC; return XML_TOK_CDATA_SECT_CLOSE; case BT_CR: ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC; *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; case BT_LF: *nextTokPtr = ptr + MINBPC; return XML_TOK_DATA_NEWLINE; INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC; break; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_DATA_CHARS; \ } \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONXML: case BT_MALFORM: case BT_TRAIL: case BT_CR: case BT_LF: case BT_RSQB: *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC; break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } /* ptr points to character following "')) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC; return XML_TOK_EMPTY_ELEMENT_WITH_ATTS; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } break; } break; } default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } /* ptr points to character following "<" */ static int PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) case BT_EXCL: if ((ptr += MINBPC) == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { case BT_MINUS: return PREFIX(scanComment)(enc, ptr + MINBPC, end, nextTokPtr); case BT_LSQB: return PREFIX(scanCdataSection)(enc, ptr + MINBPC, end, nextTokPtr); } *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_QUEST: return PREFIX(scanPi)(enc, ptr + MINBPC, end, nextTokPtr); case BT_SOL: return PREFIX(scanEndTag)(enc, ptr + MINBPC, end, nextTokPtr); default: *nextTokPtr = ptr; return XML_TOK_INVALID; } /* we have a start-tag */ while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_S: case BT_CR: case BT_LF: { ptr += MINBPC; while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) case BT_GT: goto gt; case BT_SOL: goto sol; case BT_S: case BT_CR: case BT_LF: ptr += MINBPC; continue; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr); } return XML_TOK_PARTIAL; } case BT_GT: gt: *nextTokPtr = ptr + MINBPC; return XML_TOK_START_TAG_NO_ATTS; case BT_SOL: sol: ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, '>')) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC; return XML_TOK_EMPTY_ELEMENT_NO_ATTS; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_NONE; #if MINBPC > 1 { size_t n = end - ptr; if (n & (MINBPC - 1)) { n &= ~(MINBPC - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } #endif switch (BYTE_TYPE(enc, ptr)) { case BT_LT: return PREFIX(scanLt)(enc, ptr + MINBPC, end, nextTokPtr); case BT_AMP: return PREFIX(scanRef)(enc, ptr + MINBPC, end, nextTokPtr); case BT_CR: ptr += MINBPC; if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC; *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; case BT_LF: *nextTokPtr = ptr + MINBPC; return XML_TOK_DATA_NEWLINE; case BT_RSQB: ptr += MINBPC; if (ptr == end) return XML_TOK_TRAILING_RSQB; if (!CHAR_MATCHES(enc, ptr, ']')) break; ptr += MINBPC; if (ptr == end) return XML_TOK_TRAILING_RSQB; if (!CHAR_MATCHES(enc, ptr, '>')) { ptr -= MINBPC; break; } *nextTokPtr = ptr; return XML_TOK_INVALID; INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC; break; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_DATA_CHARS; \ } \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_RSQB: if (ptr + MINBPC != end) { if (!CHAR_MATCHES(enc, ptr + MINBPC, ']')) { ptr += MINBPC; break; } if (ptr + 2*MINBPC != end) { if (!CHAR_MATCHES(enc, ptr + 2*MINBPC, '>')) { ptr += MINBPC; break; } *nextTokPtr = ptr + 2*MINBPC; return XML_TOK_INVALID; } } /* fall through */ case BT_AMP: case BT_LT: case BT_NONXML: case BT_MALFORM: case BT_TRAIL: case BT_CR: case BT_LF: *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC; break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } /* ptr points to character following "%" */ static int PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_PERCENT; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_SEMI: *nextTokPtr = ptr + MINBPC; return XML_TOK_PARAM_ENTITY_REF; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_CR: case BT_LF: case BT_S: case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: *nextTokPtr = ptr; return XML_TOK_POUND_NAME; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { while (ptr != end) { int t = BYTE_TYPE(enc, ptr); switch (t) { INVALID_CASES(ptr, nextTokPtr) case BT_QUOT: case BT_APOS: ptr += MINBPC; if (t != open) break; if (ptr == end) return XML_TOK_PARTIAL; *nextTokPtr = ptr; switch (BYTE_TYPE(enc, ptr)) { case BT_S: case BT_CR: case BT_LF: case BT_GT: case BT_PERCNT: case BT_LSQB: return XML_TOK_LITERAL; default: return XML_TOK_INVALID; } default: ptr += MINBPC; break; } } return XML_TOK_PARTIAL; } static int PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { int tok; if (ptr == end) return XML_TOK_NONE; #if MINBPC > 1 { size_t n = end - ptr; if (n & (MINBPC - 1)) { n &= ~(MINBPC - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } #endif switch (BYTE_TYPE(enc, ptr)) { case BT_QUOT: return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC, end, nextTokPtr); case BT_APOS: return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC, end, nextTokPtr); case BT_LT: { ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { case BT_EXCL: return PREFIX(scanDecl)(enc, ptr + MINBPC, end, nextTokPtr); case BT_QUEST: return PREFIX(scanPi)(enc, ptr + MINBPC, end, nextTokPtr); case BT_NMSTRT: case BT_HEX: case BT_NONASCII: case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: *nextTokPtr = ptr - MINBPC; return XML_TOK_INSTANCE_START; } *nextTokPtr = ptr; return XML_TOK_INVALID; } case BT_CR: if (ptr + MINBPC == end) return XML_TOK_TRAILING_CR; /* fall through */ case BT_S: case BT_LF: for (;;) { ptr += MINBPC; if (ptr == end) break; switch (BYTE_TYPE(enc, ptr)) { case BT_S: case BT_LF: break; case BT_CR: /* don't split CR/LF pair */ if (ptr + MINBPC != end) break; /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_PROLOG_S; } } *nextTokPtr = ptr; return XML_TOK_PROLOG_S; case BT_PERCNT: return PREFIX(scanPercent)(enc, ptr + MINBPC, end, nextTokPtr); case BT_COMMA: *nextTokPtr = ptr + MINBPC; return XML_TOK_COMMA; case BT_LSQB: *nextTokPtr = ptr + MINBPC; return XML_TOK_OPEN_BRACKET; case BT_RSQB: ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, ']')) { if (ptr + MINBPC == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr + MINBPC, '>')) { *nextTokPtr = ptr + 2*MINBPC; return XML_TOK_COND_SECT_CLOSE; } } *nextTokPtr = ptr; return XML_TOK_CLOSE_BRACKET; case BT_LPAR: *nextTokPtr = ptr + MINBPC; return XML_TOK_OPEN_PAREN; case BT_RPAR: ptr += MINBPC; if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { case BT_AST: *nextTokPtr = ptr + MINBPC; return XML_TOK_CLOSE_PAREN_ASTERISK; case BT_QUEST: *nextTokPtr = ptr + MINBPC; return XML_TOK_CLOSE_PAREN_QUESTION; case BT_PLUS: *nextTokPtr = ptr + MINBPC; return XML_TOK_CLOSE_PAREN_PLUS; case BT_CR: case BT_LF: case BT_S: case BT_GT: case BT_COMMA: case BT_VERBAR: case BT_RPAR: *nextTokPtr = ptr; return XML_TOK_CLOSE_PAREN; } *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_VERBAR: *nextTokPtr = ptr + MINBPC; return XML_TOK_OR; case BT_GT: *nextTokPtr = ptr + MINBPC; return XML_TOK_DECL_CLOSE; case BT_NUM: return PREFIX(scanPoundName)(enc, ptr + MINBPC, end, nextTokPtr); #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ ptr += n; \ tok = XML_TOK_NAME; \ break; \ } \ if (IS_NAME_CHAR(enc, ptr, n)) { \ ptr += n; \ tok = XML_TOK_NMTOKEN; \ break; \ } \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NMSTRT: case BT_HEX: tok = XML_TOK_NAME; ptr += MINBPC; break; case BT_DIGIT: case BT_NAME: case BT_MINUS: tok = XML_TOK_NMTOKEN; ptr += MINBPC; break; case BT_NONASCII: if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { ptr += MINBPC; tok = XML_TOK_NAME; break; } if (IS_NAME_CHAR_MINBPC(enc, ptr)) { ptr += MINBPC; tok = XML_TOK_NMTOKEN; break; } /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_GT: case BT_RPAR: case BT_COMMA: case BT_VERBAR: case BT_LSQB: case BT_PERCNT: case BT_S: case BT_CR: case BT_LF: *nextTokPtr = ptr; return tok; case BT_PLUS: if (tok != XML_TOK_NAME) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC; return XML_TOK_NAME_PLUS; case BT_AST: if (tok != XML_TOK_NAME) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC; return XML_TOK_NAME_ASTERISK; case BT_QUEST: if (tok != XML_TOK_NAME) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC; return XML_TOK_NAME_QUESTION; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { const char *start; if (ptr == end) return XML_TOK_NONE; start = ptr; while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC, end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_LT: /* this is for inside entity references */ *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_LF: if (ptr == start) { *nextTokPtr = ptr + MINBPC; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_CR: if (ptr == start) { ptr += MINBPC; if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC; *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_S: if (ptr == start) { *nextTokPtr = ptr + MINBPC; return XML_TOK_ATTRIBUTE_VALUE_S; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC; break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } static int PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { const char *start; if (ptr == end) return XML_TOK_NONE; start = ptr; while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC, end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_PERCNT: if (ptr == start) return PREFIX(scanPercent)(enc, ptr + MINBPC, end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_LF: if (ptr == start) { *nextTokPtr = ptr + MINBPC; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_CR: if (ptr == start) { ptr += MINBPC; if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC; *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC; break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } static int PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr) { ptr += MINBPC; end -= MINBPC; for (; ptr != end; ptr += MINBPC) { switch (BYTE_TYPE(enc, ptr)) { case BT_DIGIT: case BT_HEX: case BT_MINUS: case BT_APOS: case BT_LPAR: case BT_RPAR: case BT_PLUS: case BT_COMMA: case BT_SOL: case BT_EQUALS: case BT_QUEST: case BT_CR: case BT_LF: case BT_SEMI: case BT_EXCL: case BT_AST: case BT_PERCNT: case BT_NUM: break; case BT_S: if (CHAR_MATCHES(enc, ptr, '\t')) { *badPtr = ptr; return 0; } break; case BT_NAME: case BT_NMSTRT: if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) break; default: switch (BYTE_TO_ASCII(enc, ptr)) { case 0x24: /* $ */ case 0x40: /* @ */ break; default: *badPtr = ptr; return 0; } break; } } return 1; } /* This must only be called for a well-formed start-tag or empty element tag. Returns the number of attributes. Pointers to the first attsMax attributes are stored in atts. */ static int PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax, ATTRIBUTE *atts) { enum { other, inName, inValue } state = inName; int nAtts = 0; int open = 0; for (ptr += MINBPC;; ptr += MINBPC) { switch (BYTE_TYPE(enc, ptr)) { #define START_NAME \ if (state == other) { \ if (nAtts < attsMax) { \ atts[nAtts].name = ptr; \ atts[nAtts].normalized = 1; \ } \ state = inName; \ } #define LEAD_CASE(n) \ case BT_LEAD ## n: START_NAME ptr += (n - MINBPC); break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: case BT_HEX: START_NAME break; #undef START_NAME case BT_QUOT: if (state != inValue) { atts[nAtts].valuePtr = ptr + MINBPC; state = inValue; open = BT_QUOT; } else if (open == BT_QUOT) { state = other; atts[nAtts++].valueEnd = ptr; } break; case BT_APOS: if (state != inValue) { atts[nAtts].valuePtr = ptr + MINBPC; state = inValue; open = BT_APOS; } else if (open == BT_APOS) { state = other; atts[nAtts++].valueEnd = ptr; } break; case BT_AMP: atts[nAtts].normalized = 0; break; case BT_S: if (state == inName) state = other; else if (state == inValue && atts[nAtts].normalized && (ptr == atts[nAtts].valuePtr || BYTE_TO_ASCII(enc, ptr) != ' ' || BYTE_TO_ASCII(enc, ptr + MINBPC) == ' ' || BYTE_TYPE(enc, ptr + MINBPC) == open)) atts[nAtts].normalized = 0; break; case BT_CR: case BT_LF: /* This case ensures that the first attribute name is counted Apart from that we could just change state on the quote. */ if (state == inName) state = other; else if (state == inValue) atts[nAtts].normalized = 0; break; case BT_GT: case BT_SOL: if (state != inValue) return nAtts; break; default: break; } } /* not reached */ } static int PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) { int result = 0; /* skip &# */ ptr += 2*MINBPC; if (CHAR_MATCHES(enc, ptr, 'x')) { for (ptr += MINBPC; !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC) { int c = BYTE_TO_ASCII(enc, ptr); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': result <<= 4; result |= (c - '0'); break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': result <<= 4; result += 10 + (c - 'A'); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': result <<= 4; result += 10 + (c - 'a'); break; } if (result >= 0x110000) return -1; } } else { for (; !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC) { int c = BYTE_TO_ASCII(enc, ptr); result *= 10; result += (c - '0'); if (result >= 0x110000) return -1; } } return checkCharRefNumber(result); } static int PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end) { switch (end - ptr) { case 2 * MINBPC: if (CHAR_MATCHES(enc, ptr + MINBPC, 't')) { switch (BYTE_TO_ASCII(enc, ptr)) { case 'l': return '<'; case 'g': return '>'; } } break; case 3 * MINBPC: if (CHAR_MATCHES(enc, ptr, 'a')) { ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'm')) { ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'p')) return '&'; } } break; case 4 * MINBPC: switch (BYTE_TO_ASCII(enc, ptr)) { case 'q': ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'u')) { ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'o')) { ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 't')) return '"'; } } break; case 'a': ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'p')) { ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'o')) { ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 's')) return '\''; } } break; } } return 0; } static int PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) { for (;;) { switch (BYTE_TYPE(enc, ptr1)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (*ptr1++ != *ptr2++) \ return 0; LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) #undef LEAD_CASE /* fall through */ if (*ptr1++ != *ptr2++) return 0; break; case BT_NONASCII: case BT_NMSTRT: case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: if (*ptr2++ != *ptr1++) return 0; #if MINBPC > 1 if (*ptr2++ != *ptr1++) return 0; #if MINBPC > 2 if (*ptr2++ != *ptr1++) return 0; #if MINBPC > 3 if (*ptr2++ != *ptr1++) return 0; #endif #endif #endif break; default: #if MINBPC == 1 if (*ptr1 == *ptr2) return 1; #endif switch (BYTE_TYPE(enc, ptr2)) { case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: case BT_NONASCII: case BT_NMSTRT: case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: return 0; default: return 1; } } } /* not reached */ } static int PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, const char *ptr2) { for (; *ptr2; ptr1 += MINBPC, ptr2++) { if (!CHAR_MATCHES(end, ptr1, *ptr2)) return 0; } switch (BYTE_TYPE(enc, ptr1)) { case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: case BT_NONASCII: case BT_NMSTRT: case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: return 0; default: return 1; } } static int PREFIX(nameLength)(const ENCODING *enc, const char *ptr) { const char *start = ptr; for (;;) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: ptr += MINBPC; break; default: return ptr - start; } } } static const char *PREFIX(skipS)(const ENCODING *enc, const char *ptr) { for (;;) { switch (BYTE_TYPE(enc, ptr)) { case BT_LF: case BT_CR: case BT_S: ptr += MINBPC; break; default: return ptr; } } } static void PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end, POSITION *pos) { while (ptr < end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_LF: pos->columnNumber = (unsigned)-1; pos->lineNumber++; ptr += MINBPC; break; case BT_CR: pos->lineNumber++; ptr += MINBPC; if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC; pos->columnNumber = (unsigned)-1; break; default: ptr += MINBPC; break; } pos->columnNumber++; } } #undef DO_LEAD_CASE #undef MULTIBYTE_CASES #undef INVALID_CASES #undef CHECK_NAME_CASE #undef CHECK_NAME_CASES #undef CHECK_NMSTRT_CASE #undef CHECK_NMSTRT_CASES ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmltok_impl.h000644 000765 000024 00000000430 12161600406 023023 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmltok_impl.h000644 000765 000024 00000002252 12161600406 022612 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ enum { BT_NONXML, BT_MALFORM, BT_LT, BT_AMP, BT_RSQB, BT_LEAD2, BT_LEAD3, BT_LEAD4, BT_TRAIL, BT_CR, BT_LF, BT_GT, BT_QUOT, BT_APOS, BT_EQUALS, BT_QUEST, BT_EXCL, BT_SOL, BT_SEMI, BT_NUM, BT_LSQB, BT_S, BT_NMSTRT, BT_HEX, BT_DIGIT, BT_NAME, BT_MINUS, BT_OTHER, /* known not to be a name or name start character */ BT_NONASCII, /* might be a name or name start character */ BT_PERCNT, BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, BT_COMMA, BT_VERBAR }; #include ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xmlwf.c000644 000765 000024 00000000430 12326521216 021620 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xmlwf.c000644 000765 000024 00000036543 12326521216 021421 0ustar00neumannstaff000000 000000 /* The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is expat. The Initial Developer of the Original Code is James Clark. Portions created by James Clark are Copyright (C) 1998 James Clark. All Rights Reserved. Contributor(s): */ #include #include "xmlparse.h" #include "filemap.h" #include "codepage.h" #include #include #include #include #include #include #ifdef _MSC_VER #include #endif #ifdef _POSIX_SOURCE #include #endif #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 #endif #endif #ifdef _MSC_VER #include #endif #ifdef _DEBUG #define READ_SIZE 16 #else #define READ_SIZE (1024*8) #endif #ifdef XML_UNICODE #ifndef XML_UNICODE_WCHAR_T #error xmlwf requires a 16-bit Unicode-compatible wchar_t #endif #define T(x) L ## x #define ftprintf fwprintf #define tfopen _wfopen #define fputts fputws #define puttc putwc #define tcscmp wcscmp #define tcscpy wcscpy #define tcscat wcscat #define tcschr wcschr #define tcsrchr wcsrchr #define tcslen wcslen #define tperror _wperror #define topen _wopen #define tmain wmain #define tremove _wremove #else /* not XML_UNICODE */ #define T(x) x #define ftprintf fprintf #define tfopen fopen #define fputts fputs #define puttc putc #define tcscmp strcmp #define tcscpy strcpy #define tcscat strcat #define tcschr strchr #define tcsrchr strrchr #define tcslen strlen #define tperror perror #define topen open #define tmain main #define tremove remove #endif /* not XML_UNICODE */ static void characterData(void *userData, const XML_Char *s, size_t len) { FILE *fp = userData; for (; len > 0; --len, ++s) { switch (*s) { case T('&'): fputts(T("&"), fp); break; case T('<'): fputts(T("<"), fp); break; case T('>'): fputts(T(">"), fp); break; case T('"'): fputts(T("""), fp); break; case 9: case 10: case 13: ftprintf(fp, T("&#%d;"), *s); break; default: puttc(*s, fp); break; } } } /* Lexicographically comparing UTF-8 encoded attribute values, is equivalent to lexicographically comparing based on the character number. */ static int attcmp(const void *att1, const void *att2) { return tcscmp(*(const XML_Char **)att1, *(const XML_Char **)att2); } static void startElement(void *userData, const XML_Char *name, const XML_Char **atts) { size_t nAtts; const XML_Char **p; FILE *fp = userData; puttc(T('<'), fp); fputts(name, fp); p = atts; while (*p) ++p; nAtts = (p - atts) >> 1; if (nAtts > 1) qsort((void *)atts, nAtts, sizeof(XML_Char *) * 2, attcmp); while (*atts) { puttc(T(' '), fp); fputts(*atts++, fp); puttc(T('='), fp); puttc(T('"'), fp); characterData(userData, *atts, tcslen(*atts)); puttc(T('"'), fp); atts++; } puttc(T('>'), fp); } static void endElement(void *userData, const XML_Char *name) { FILE *fp = userData; puttc(T('<'), fp); puttc(T('/'), fp); fputts(name, fp); puttc(T('>'), fp); } static void processingInstruction(void *userData, const XML_Char *target, const XML_Char *data) { FILE *fp = userData; puttc(T('<'), fp); puttc(T('?'), fp); fputts(target, fp); puttc(T(' '), fp); fputts(data, fp); puttc(T('?'), fp); puttc(T('>'), fp); } static void defaultCharacterData(XML_Parser parser, const XML_Char *s, size_t len) { XML_DefaultCurrent(parser); } static void defaultStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts) { XML_DefaultCurrent(parser); } static void defaultEndElement(XML_Parser parser, const XML_Char *name) { XML_DefaultCurrent(parser); } static void defaultProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data) { XML_DefaultCurrent(parser); } static void markup(XML_Parser parser, const XML_Char *s, int len) { FILE *fp = XML_GetUserData(parser); for (; len > 0; --len, ++s) puttc(*s, fp); } static void metaLocation(XML_Parser parser) { const XML_Char *uri = XML_GetBase(parser); if (uri) ftprintf(XML_GetUserData(parser), T(" uri=\"%s\""), uri); ftprintf(XML_GetUserData(parser), T(" byte=\"%ld\" line=\"%d\" col=\"%d\""), XML_GetCurrentByteIndex(parser), XML_GetCurrentLineNumber(parser), XML_GetCurrentColumnNumber(parser)); } static void metaStartElement(XML_Parser parser, const XML_Char *name, const XML_Char **atts) { FILE *fp = XML_GetUserData(parser); ftprintf(fp, T("\n"), fp); do { ftprintf(fp, T("\n"), fp); } while (*(atts += 2)); fputts(T("\n"), fp); } else fputts(T("/>\n"), fp); } static void metaEndElement(XML_Parser parser, const XML_Char *name) { FILE *fp = XML_GetUserData(parser); ftprintf(fp, T("\n"), fp); } static void metaProcessingInstruction(XML_Parser parser, const XML_Char *target, const XML_Char *data) { FILE *fp = XML_GetUserData(parser); ftprintf(fp, T("\n"), fp); } static void metaCharacterData(XML_Parser parser, const XML_Char *s, size_t len) { FILE *fp = XML_GetUserData(parser); fputts(T("\n"), fp); } static void metaUnparsedEntityDecl(XML_Parser parser, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName) { FILE *fp = XML_GetUserData(parser); ftprintf(fp, T("\n"), fp); } static void metaNotationDecl(XML_Parser parser, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { FILE *fp = XML_GetUserData(parser); ftprintf(fp, T("\n"), fp); } typedef struct { XML_Parser parser; int *retPtr; } PROCESS_ARGS; static void reportError(XML_Parser parser, const XML_Char *filename) { int code = XML_GetErrorCode(parser); const XML_Char *message = XML_ErrorString(code); if (message) ftprintf(stdout, T("%s:%d:%d: %s\n"), filename, XML_GetErrorLineNumber(parser), XML_GetErrorColumnNumber(parser), message); else ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code); } static void processFile(const void *data, size_t size, const XML_Char *filename, void *args) { XML_Parser parser = ((PROCESS_ARGS *)args)->parser; int *retPtr = ((PROCESS_ARGS *)args)->retPtr; if (!XML_Parse(parser, data, size, 1)) { reportError(parser, filename); *retPtr = 0; } else *retPtr = 1; } static int isAsciiLetter(XML_Char c) { return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z')); } static const XML_Char *resolveSystemId(const XML_Char *base, const XML_Char *systemId, XML_Char **toFree) { XML_Char *s; *toFree = 0; if (!base || *systemId == T('/') #ifdef WIN32 || *systemId == T('\\') || (isAsciiLetter(systemId[0]) && systemId[1] == T(':')) #endif ) return systemId; *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)*sizeof(XML_Char)); if (!*toFree) return systemId; tcscpy(*toFree, base); s = *toFree; if (tcsrchr(s, T('/'))) s = tcsrchr(s, T('/')) + 1; #ifdef WIN32 if (tcsrchr(s, T('\\'))) s = tcsrchr(s, T('\\')) + 1; #endif tcscpy(s, systemId); return *toFree; } static int externalEntityRefFilemap(XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { int result; XML_Char *s; const XML_Char *filename; XML_Parser entParser = XML_ExternalEntityParserCreate(parser, openEntityNames, 0); PROCESS_ARGS args; args.retPtr = &result; args.parser = entParser; filename = resolveSystemId(base, systemId, &s); XML_SetBase(entParser, filename); if (!filemap(filename, processFile, &args)) result = 0; free(s); XML_ParserFree(entParser); return result; } static int processStream(const XML_Char *filename, XML_Parser parser) { int fd = topen(filename, O_BINARY|O_RDONLY); if (fd < 0) { tperror(filename); return 0; } for (;;) { size_t nread; char *buf = XML_GetBuffer(parser, READ_SIZE); if (!buf) { close(fd); ftprintf(stderr, T("%s: out of memory\n"), filename); return 0; } nread = read(fd, buf, READ_SIZE); if (nread < 0) { tperror(filename); close(fd); return 0; } if (!XML_ParseBuffer(parser, nread, nread == 0)) { reportError(parser, filename); close(fd); return 0; } if (nread == 0) { close(fd); break;; } } return 1; } static int externalEntityRefStream(XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { XML_Char *s; const XML_Char *filename; int ret; XML_Parser entParser = XML_ExternalEntityParserCreate(parser, openEntityNames, 0); filename = resolveSystemId(base, systemId, &s); XML_SetBase(entParser, filename); ret = processStream(filename, entParser); free(s); XML_ParserFree(entParser); return ret; } static int unknownEncodingConvert(void *data, const char *p) { return codepageConvert(*(int *)data, p); } static int unknownEncoding(void *userData, const XML_Char *name, XML_Encoding *info) { int cp; static const XML_Char prefixL[] = T("windows-"); static const XML_Char prefixU[] = T("WINDOWS-"); int i; for (i = 0; prefixU[i]; i++) if (name[i] != prefixU[i] && name[i] != prefixL[i]) return 0; cp = 0; for (; name[i]; i++) { static const XML_Char digits[] = T("0123456789"); const XML_Char *s = tcschr(digits, name[i]); if (!s) return 0; cp *= 10; cp += s - digits; if (cp >= 0x10000) return 0; } if (!codepageMap(cp, info->map)) return 0; info->convert = unknownEncodingConvert; /* We could just cast the code page integer to a void *, and avoid the use of release. */ info->release = free; info->data = malloc(sizeof(int)); if (!info->data) return 0; *(int *)info->data = cp; return 1; } static void usage(const XML_Char *prog) { ftprintf(stderr, T("usage: %s [-r] [-w] [-x] [-d output-dir] [-e encoding] file ...\n"), prog); exit(1); } int tmain(int argc, XML_Char **argv) { int i; const XML_Char *outputDir = 0; const XML_Char *encoding = 0; int useFilemap = 1; int processExternalEntities = 0; int windowsCodePages = 0; int outputType = 0; #ifdef _MSC_VER _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); #endif i = 1; while (i < argc && argv[i][0] == T('-')) { int j; if (argv[i][1] == T('-') && argv[i][2] == T('\0')) { i++; break; } j = 1; if (argv[i][j] == T('r')) { useFilemap = 0; j++; } if (argv[i][j] == T('x')) { processExternalEntities = 1; j++; } if (argv[i][j] == T('w')) { windowsCodePages = 1; j++; } if (argv[i][j] == T('m')) { outputType = 'm'; j++; } if (argv[i][j] == T('c')) { outputType = 'c'; j++; } if (argv[i][j] == T('d')) { if (argv[i][j + 1] == T('\0')) { if (++i == argc) usage(argv[0]); outputDir = argv[i]; } else outputDir = argv[i] + j + 1; i++; } else if (argv[i][j] == T('e')) { if (argv[i][j + 1] == T('\0')) { if (++i == argc) usage(argv[0]); encoding = argv[i]; } else encoding = argv[i] + j + 1; i++; } else if (argv[i][j] == T('\0') && j > 1) i++; else usage(argv[0]); } if (i == argc) usage(argv[0]); for (; i < argc; i++) { FILE *fp = 0; XML_Char *outName = 0; int result; XML_Parser parser = XML_ParserCreate(encoding); if (outputDir) { const XML_Char *file = argv[i]; if (tcsrchr(file, T('/'))) file = tcsrchr(file, T('/')) + 1; #ifdef WIN32 if (tcsrchr(file, T('\\'))) file = tcsrchr(file, T('\\')) + 1; #endif outName = malloc((tcslen(outputDir) + tcslen(file) + 2) * sizeof(XML_Char)); tcscpy(outName, outputDir); tcscat(outName, T("/")); tcscat(outName, file); fp = tfopen(outName, T("wb")); if (!fp) { tperror(outName); exit(1); } #ifdef XML_UNICODE puttc(0xFEFF, fp); #endif XML_SetUserData(parser, fp); switch (outputType) { case 'm': XML_UseParserAsHandlerArg(parser); fputts(T("\n"), fp); XML_SetElementHandler(parser, metaStartElement, metaEndElement); XML_SetProcessingInstructionHandler(parser, metaProcessingInstruction); XML_SetCharacterDataHandler(parser, metaCharacterData); XML_SetUnparsedEntityDeclHandler(parser, metaUnparsedEntityDecl); XML_SetNotationDeclHandler(parser, metaNotationDecl); break; case 'c': XML_UseParserAsHandlerArg(parser); XML_SetDefaultHandler(parser, markup); XML_SetElementHandler(parser, defaultStartElement, defaultEndElement); XML_SetCharacterDataHandler(parser, defaultCharacterData); XML_SetProcessingInstructionHandler(parser, defaultProcessingInstruction); break; default: XML_SetElementHandler(parser, startElement, endElement); XML_SetCharacterDataHandler(parser, characterData); XML_SetProcessingInstructionHandler(parser, processingInstruction); break; } } if (windowsCodePages) XML_SetUnknownEncodingHandler(parser, unknownEncoding, 0); if (!XML_SetBase(parser, argv[i])) { ftprintf(stderr, T("%s: out of memory"), argv[0]); exit(1); } if (processExternalEntities) XML_SetExternalEntityRefHandler(parser, useFilemap ? externalEntityRefFilemap : externalEntityRefStream); if (useFilemap) { PROCESS_ARGS args; args.retPtr = &result; args.parser = parser; if (!filemap(argv[i], processFile, &args)) result = 0; } else result = processStream(argv[i], parser); if (outputDir) { if (outputType == 'm') fputts(T("\n"), fp); fclose(fp); if (!result) tremove(outName); free(outName); } XML_ParserFree(parser); } return 0; } ./xotcl-1.6.8/library/xml/TclExpat-1.1/._xotcl.m4000644 000765 000024 00000000430 12161600406 021706 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/TclExpat-1.1/xotcl.m4000644 000765 000024 00000007512 12161600406 021501 0ustar00neumannstaff000000 000000 # xotcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999 Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #------------------------------------------------------------------------ # SC_PATH_XOTCLCONFIG -- # # Locate the xotclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-xotcl=... # # Defines the following vars: # XOTCL_BIN_DIR Full path to the directory containing # the xotclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN(SC_PATH_XOTCLCONFIG, [ # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_xotcl}" = x ; then # we reset no_xotcl in case something fails here no_xotcl=true AC_ARG_WITH(xotcl, [ --with-xotcl directory containing xotcl configuration (xotclConfig.sh)], with_xotclconfig=${withval}) AC_MSG_CHECKING([for XOTcl configuration]) AC_CACHE_VAL(ac_cv_c_xotclconfig,[ # First check to see if --with-xotcl was specified. if test x"${with_xotclconfig}" != x ; then if test -f "${with_xotclconfig}/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd ${with_xotclconfig}; pwd)` else AC_MSG_ERROR([${with_xotclconfig} directory doesn't contain xotclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_xotclconfig}" = x ; then for i in \ ${srcdir}/../xotcl \ `ls -dr ${srcdir}/../xotcl-* 2>/dev/null` \ ${srcdir}/../../xotcl \ `ls -dr ${srcdir}/../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../xotcl \ `ls -dr ${srcdir}/../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../xotcl \ `ls -dr ${srcdir}/../../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../../xotcl \ `ls -dr ${srcdir}/../../../../../xotcl-* 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_xotclconfig}" = x ; then for i in `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_xotclconfig}" = x ; then XOTCL_BIN_DIR="# no XOTcl configs found" AC_MSG_WARN(Can't find XOTcl configuration definitions) exit 0 else no_xotcl= XOTCL_BIN_DIR=${ac_cv_c_xotclconfig} AC_MSG_RESULT(found $XOTCL_BIN_DIR/xotclConfig.sh) fi fi ]) #------------------------------------------------------------------------ # SC_LOAD_XOTCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # XOTCL_BIN_DIR # # Results: # # Subst the vars: # #------------------------------------------------------------------------ AC_DEFUN(SC_LOAD_XOTCLCONFIG, [ AC_MSG_CHECKING([for existence of $XOTCL_BIN_DIR/xotclConfig.sh]) if test -f "$XOTCL_BIN_DIR/xotclConfig.sh" ; then AC_MSG_RESULT([loading]) . $XOTCL_BIN_DIR/xotclConfig.sh else AC_MSG_RESULT([file not found]) fi # # The eval is required to do the TCL_DBGX substitution in the # TCL_LIB_FILE variable # AC_SUBST(XOTCL_VERSION) AC_SUBST(XOTCL_MAJOR_VERSION) AC_SUBST(XOTCL_MINOR_VERSION) AC_SUBST(XOTCL_RELEASE_LEVEL) AC_SUBST(XOTCL_LIB_FILE) AC_SUBST(XOTCL_BUILD_LIB_SPEC) AC_SUBST(XOTCL_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_FILE) AC_SUBST(XOTCL_BUILD_STUB_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_SPEC) AC_SUBST(XOTCL_SRC_DIR) ]) ./xotcl-1.6.8/library/xml/._xml.tcl000644 000765 000024 00000000430 12161600406 017576 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/xml.tcl000644 000765 000024 00000030425 12161600406 017370 0ustar00neumannstaff000000 000000 # xml.tcl -- # # This file provides XML services. # These services include a XML document instance and DTD parser, # as well as support for generating XML. # # Copyright (c) 1998,1999 Zveno Pty Ltd # http://www.zveno.com/ # # Zveno makes this software and all associated data and documentation # ('Software') available free of charge for non-commercial purposes only. You # may make copies of the Software but you must include all of this notice on # any copy. # # The Software was developed for research purposes and Zveno does not warrant # that it is error free or fit for any purpose. Zveno disclaims any # liability for all claims, expenses, losses, damages and costs any user may # incur as a result of using, copying or modifying the Software. # # Copyright (c) 1997 Australian National University (ANU). # # ANU makes this software and all associated data and documentation # ('Software') available free of charge for non-commercial purposes only. You # may make copies of the Software but you must include all of this notice on # any copy. # # The Software was developed for research purposes and ANU does not warrant # that it is error free or fit for any purpose. ANU disclaims any # liability for all claims, expenses, losses, damages and costs any user may # incur as a result of using, copying or modifying the Software. # # $Id: xml.tcl,v 1.4 2006/09/27 08:12:40 neumann Exp $ package provide xml 1.8 package require sgml 1.6 namespace eval xml { # Procedures for parsing XML documents namespace export parser # Procedures for parsing XML DTDs namespace export DTDparser # Counter for creating unique parser objects variable ParserCounter 0 # Convenience routine proc cl x { return "\[$x\]" } # Define various regular expressions # white space variable Wsp " \t\r\n" variable noWsp [cl ^$Wsp] # Various XML names and tokens # BUG: NameChar does not include CombiningChar or Extender variable NameChar [cl -a-zA-Z0-9._:] variable Name [cl a-zA-Z_:]$NameChar* variable Nmtoken $NameChar+ # Tokenising expressions variable tokExpr <(/?)([cl ^$Wsp>]+)([cl $Wsp]*[cl ^>]*)> variable substExpr "\}\n{\\2} {\\1} {} {\\3} \{" # table of predefined entities variable EntityPredef array set EntityPredef { lt < gt > amp & quot \" apos ' } } # xml::parser -- # # Creates XML parser object. # # Arguments: # args Unique name for parser object # plus option/value pairs # # Recognised Options: # -final Indicates end of document data # -elementstartcommand Called when an element starts # -elementendcommand Called when an element ends # -characterdatacommand Called when character data occurs # -processinginstructioncommand Called when a PI occurs # -externalentityrefcommand Called for an external entity reference # # (Not compatible with expat) # -xmldeclcommand Called when the XML declaration occurs # -doctypecommand Called when the document type declaration occurs # # -errorcommand Script to evaluate for a fatal error # -warningcommand Script to evaluate for a reportable warning # -statevariable global state variable # -reportempty whether to provide empty element indication # # Results: # The state variable is initialised. proc xml::parser {args} { variable ParserCounter if {[llength $args] > 0} { set name [lindex $args 0] set args [lreplace $args 0 0] } else { set name parser[incr ParserCounter] } if {[info command [namespace current]::$name] != {}} { return -code error "unable to create parser object \"[namespace current]::$name\" command" } # Initialise state variable and object command upvar \#0 [namespace current]::$name parser set sgml_ns [namespace parent]::sgml array set parser [list name $name \ -final 1 \ -elementstartcommand ${sgml_ns}::noop \ -elementendcommand ${sgml_ns}::noop \ -characterdatacommand ${sgml_ns}::noop \ -processinginstructioncommand ${sgml_ns}::noop \ -externalentityrefcommand ${sgml_ns}::noop \ -xmldeclcommand ${sgml_ns}::noop \ -doctypecommand ${sgml_ns}::noop \ -warningcommand ${sgml_ns}::noop \ -statevariable [namespace current]::$name \ -reportempty 0 \ internaldtd {} \ ] proc [namespace current]::$name {method args} \ "eval ParseCommand $name \$method \$args" eval ParseCommand [list $name] configure $args return [namespace current]::$name } # xml::ParseCommand -- # # Handles parse object command invocations # # Valid Methods: # cget # configure # parse # reset # # Arguments: # parser parser object # method minor command # args other arguments # # Results: # Depends on method proc xml::ParseCommand {parser method args} { upvar \#0 [namespace current]::$parser state switch -- $method { cget { return $state([lindex $args 0]) } configure { foreach {opt value} $args { set state($opt) $value } } parse { ParseCommand_parse $parser [lindex $args 0] } reset { if {[llength $args]} { return -code error "too many arguments" } ParseCommand_reset $parser } default { return -code error "unknown method \"$method\"" } } return {} } # xml::ParseCommand_parse -- # # Parses document instance data # # Arguments: # object parser object # xml data # # Results: # Callbacks are invoked, if any are defined proc xml::ParseCommand_parse {object xml} { upvar \#0 [namespace current]::$object parser variable Wsp variable tokExpr variable substExpr set parent [namespace parent] if {"::" eq $parent } { set parent {} } set tokenised [lrange \ [${parent}::sgml::tokenise $xml \ $tokExpr \ $substExpr \ -internaldtdvariable [namespace current]::${object}(internaldtd)] \ 5 end] eval ${parent}::sgml::parseEvent \ [list $tokenised \ -emptyelement [namespace code ParseEmpty] \ -parseattributelistcommand [namespace code ParseAttrs]] \ [array get parser -*command] \ [array get parser -entityvariable] \ [array get parser -reportempty] \ -normalize 0 \ -internaldtd [list $parser(internaldtd)] return {} } # xml::ParseEmpty -- # # Used by parser to determine whether an element is empty. # This should be dead easy in XML. The only complication is # that the RE above can't catch the trailing slash, so we have # to dig it out of the tag name or attribute list. # # Tcl 8.1 REs should fix this. # # Arguments: # tag element name # attr attribute list (raw) # e End tag delimiter. # # Results: # "/" if the trailing slash is found. Optionally, return a list # containing new values for the tag name and/or attribute list. proc xml::ParseEmpty {tag attr e} { if {[string match */ [string trimright $tag]] && \ ![string length $attr]} { regsub {/$} $tag {} tag return [list / $tag $attr] } elseif {[string match */ [string trimright $attr]]} { regsub {/$} [string trimright $attr] {} attr return [list / $tag $attr] } else { return {} } } # xml::ParseAttrs -- # # Parse element attributes. # # There are two forms for name-value pairs: # # name="value" # name='value' # # Watch out for the trailing slash on empty elements. # # Arguments: # attrs attribute string given in a tag # # Results: # Returns a Tcl list representing the name-value pairs in the # attribute string proc xml::ParseAttrs attrs { variable Wsp variable Name # First check whether there's any work to do if {{} eq [string trim $attrs] } { return {} } # Strip the trailing slash on empty elements regsub [format {/[%s]*$} " \t\n\r"] $attrs {} atList set mode name set result {} foreach component [split $atList =] { switch $mode { name { set component [string trim $component] if {[regexp $Name $component]} { lappend result $component } else { return -code error "invalid attribute name \"$component\"" } set mode value:start } value:start { set component [string trimleft $component] set delimiter [string index $component 0] set value {} switch -- $delimiter { \" - ' { if {[regexp [format {%s([^%s]*)%s(.*)} $delimiter $delimiter $delimiter] $component discard value remainder]} { lappend result $value set remainder [string trim $remainder] if {[string length $remainder]} { if {[regexp $Name $remainder]} { lappend result $remainder set mode value:start } else { return -code error "invalid attribute name \"$remainder\"" } } else { set mode end } } else { set value [string range $component 1 end] set mode value:continue } } default { return -code error "invalid value for attribute \"[lindex $result end]\"" } } } value:continue { if {[regexp [format {([^%s]*)%s(.*)} $delimiter $delimiter] $component discard valuepart remainder]} { append value = $valuepart lappend result $value set remainder [string trim $remainder] if {[string length $remainder]} { if {[regexp $Name $remainder]} { lappend result $remainder set mode value:start } else { return -code error "invalid attribute name \"$remainder\"" } } else { set mode end } } else { append value = $component } } end { return -code error "unexpected data found after end of attribute list" } } } switch $mode { name - end { # This is normal } default { return -code error "unexpected end of attribute list" } } return $result } proc xml::OLDParseAttrs {attrs} { variable Wsp variable Name # First check whether there's any work to do if {{} eq [string trim $attrs] } { return {} } # Strip the trailing slash on empty elements regsub [format {/[%s]*$} " \t\n\r"] $attrs {} atList # Protect Tcl special characters #regsub -all {([[\$\\])} $atList {\\\1} atList regsub -all & $atList {\&} atList regsub -all {\[} $atList {\&ob;} atList regsub -all {\]} $atList {\&cb;} atlist # NB. sgml package delivers braces and backslashes quoted regsub -all {\\\{} $atList {\&oc;} atList regsub -all {\\\}} $atList {\&cc;} atlist regsub -all {\$} $atList {\$} atList regsub -all {\\\\} $atList {\&bs;} atList regsub -all [format {(%s)[%s]*=[%s]*"([^"]*)"} $Name $Wsp $Wsp] \ $atList {[set parsed(\1) {\2}; set dummy {}] } atList ;# " regsub -all [format {(%s)[%s]*=[%s]*'([^']*)'} $Name $Wsp $Wsp] \ $atList {[set parsed(\1) {\2}; set dummy {}] } atList set leftovers [subst $atList] if {[string length [string trim $leftovers]]} { return -code error "syntax error in attribute list \"$attrs\"" } return [ParseAttrs:Deprotect [array get parsed]] } # xml::ParseAttrs:Deprotect -- # # Reverse map Tcl special characters previously protected # # Arguments: # attrs attribute list # # Results: # Characters substituted proc xml::ParseAttrs:Deprotect attrs { regsub -all &\; $attrs \\& attrs regsub -all &ob\; $attrs \[ attrs regsub -all &cb\; $attrs \] attrs regsub -all &oc\; $attrs \{ attrs regsub -all &cc\; $attrs \} attrs regsub -all &dollar\; $attrs \$ attrs regsub -all &bs\; $attrs \\\\ attrs return $attrs } # xml::ParseCommand_reset -- # # Initialize parser data # # Arguments: # object parser object # # Results: # Parser data structure initialised proc xml::ParseCommand_reset object { upvar \#0 [namespace current]::$object parser array set parser [list \ -final 1 \ internaldtd {} \ ] } # xml::noop -- # # A do-nothing proc proc xml::noop args {} ### Following procedures are based on html_library # xml::zapWhite -- # # Convert multiple white space into a single space. # # Arguments: # data plain text # # Results: # As above proc xml::zapWhite data { regsub -all "\[ \t\r\n\]+" $data { } data return $data } # # DTD parser for XML is wholly contained within the sgml.tcl package # # xml::parseDTD -- # # Entry point to the XML DTD parser. # # Arguments: # dtd XML data defining the DTD to be parsed # args configuration options # # Results: # Returns a three element list, first element is the content model # for each element, second element are the attribute lists of the # elements and the third element is the entity map. proc xml::parseDTD {dtd args} { return [eval [expr {[namespace parent] == {::} ? {} : [namespace parent]}]::sgml::parseDTD [list $dtd] $args] } ./xotcl-1.6.8/library/xml/._xml.xotcl000755 000765 000024 00000000430 12161600406 020150 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/xml.xotcl000755 000765 000024 00000007360 12161600406 017744 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: xml.xotcl,v 1.2 2006/02/18 22:17:33 neumann Exp $ # # smaller implementation of an XML parser wrapper, similar to xoXML # example from the XOTcl paper # # not used in ActiWeb # package require xml # # Xml Parser Connection Class (wrapper facade to TclXML and expat interface like parsers) # Class XMLParser XMLParser instproc init args { my set PC [xml::parser [my autoname [namespace tail [self]]]] my config \ -characterdatacommand "[self] pcdata" \ -elementstartcommand "[self] start" \ -elementendcommand "[self] end" my set currentElement [Node create [self]::T] next } # Create Forwarding methods to the parser == # abstact interface for xml parser acces XMLParser instproc cget option {[my set PC] cget $option} XMLParser instproc config args {eval "[my set PC] configure $args"} XMLParser instproc parse data {[my set PC] parse $data} XMLParser instproc reset {} {[my set PC] reset; [self]::T reset} XMLParser instproc pcdata text { my instvar currentElement $currentElement insertText $text } XMLParser instproc start {name attrList} { my instvar currentElement set currentElement [$currentElement insertElement $name $attrList] } XMLParser instproc end {name} { my instvar currentElement set currentElement [$currentElement info parent] } XMLParser instproc print {} { ::x::T print puts "" } ############################################################################### # Simple Node tree # General Nodes Class Node Node instproc reset {} { foreach c [my info children] {$c destroy} my set children "" } Node instproc print {} { if {[my exists children]} { foreach c [my set children] { $c print} } } Node instproc insert {xoclass elementclass args} { set new [eval $xoclass new -childof [self] $args] my lappend children $new return $new } Node instproc insertElement {tag args} { return [eval my insert Element $tag -attributes $args -tag $tag] } Node instproc insertText {text} { return [my insert Text text -content $text] } # Element Nodes Class Element -superclass Node -parameter { {attributes ""} tag } Element instproc print {} { my instvar tag attributes if {[llength $attributes]>0} { foreach {n v} $attributes {append string " " $n = '$v'} } else { set string "" } puts -nonewline <$tag$string> next puts -nonewline } # Text Nodes Class Text -superclass Node -parameter { {content ""} } Text instproc print {} { puts -nonewline [my set content] } ################################################################################# ### Examples ################################################################################# XMLParser x x parse { Mary Andrew Jacky Crystal The Coolest Web Page Il Pagio di Web Fuba } ::x print puts ============================================================ x reset x parse { a b c def g } x print ./xotcl-1.6.8/library/xml/._xmlRecreatorVisitor.xotcl000644 000765 000024 00000000430 12161607126 023402 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/xmlRecreatorVisitor.xotcl000644 000765 000024 00000010301 12161607126 023163 0ustar00neumannstaff000000 000000 package provide xotcl::xml::recreatorVisitor 1.0 package require -exact xotcl::xml::parser 1.0 package require XOTcl 1 namespace eval ::xotcl::xml::recreatorVisitor { namespace import ::xotcl::* ############################################################################## # # a visitor that recreates an XML representation from a # node tree # ############################################################################# Class XMLRecreatorVisitor -superclass NodeTreeVisitor -parameter useCDATA # # determine nesting depth of an object if the aggregation tree # XMLRecreatorVisitor instproc nestingDepth {obj} { for {set d 0;set s [$obj info parent]} {$s ne "::"} {set s [$s info parent]} { incr d } return $d } # # insert appropriate number of spaces for indentation -> return space string # XMLRecreatorVisitor instproc indent chars { set spaces " " for {set l 9} {$l<$chars} {incr l $l} {append spaces $spaces} return [string range $spaces 1 $chars] } XMLRecreatorVisitor instproc insertIndent {obj} { my instvar nestingStart return [my indent [expr {([my nestingDepth $obj] - $nestingStart)*2} - 2]] } XMLRecreatorVisitor instproc attrIndent {objName fa} { upvar [self callinglevel] $fa firstAttr if {$firstAttr} { set firstAttr 0 return " " } else { return "\n[my insertIndent $objName] " } } XMLRecreatorVisitor instproc getContent objName { return [$objName content] } XMLRecreatorVisitor instproc hasOnlyAttrs {obj} { if {[$obj exists pcdata]} {return 0} foreach c [$obj info children] { if {[$c istype XMLNode]} {return 0} } return 1 } # # hook to append line feed dependent on the object # default is to append one \n # XMLRecreatorVisitor instproc appendLineFeed obj { return "\n" } # # evaluate node objName # XMLRecreatorVisitor instproc visit objName { my instvar result set c [my getContent $objName] if {$c ne ""} { $objName instvar attributes pcdata set ns [$objName resolveNS] set firstAttr 1 set attrStr "" if {[string first $objName $ns] != -1} { # append xmlns attributes, xmlns=... first if {[$ns exists nsArray(xmlns)]} { append attrStr [my attrIndent $objName firstAttr] append attrStr "xmlns = \"[$ns set nsArray(xmlns)]\"" } foreach a [$ns array names nsArray] { if {$a ne "xmlns"} { append attrStr [my attrIndent $objName firstAttr] append attrStr "xmlns:${a} = \"[$ns set nsArray($a)]\"" } } } foreach a [array names attributes] { append attrStr [my attrIndent $objName firstAttr] append attrStr "$a = \"$attributes($a)\"" } append result "[my insertIndent $objName]<${c}$attrStr" if {[my hasOnlyAttrs $objName]} { append result "/>" } else { append result ">" } if {[info exists pcdata] && [llength $pcdata]>1 && [lindex $pcdata 0] eq ""} { append result " " [my pcdataString [lindex $pcdata 1]] } append result [my appendLineFeed $objName] } return $result } XMLRecreatorVisitor instproc pcdataString text { if {[my exists useCDATA] && [regexp < $text]} { return "" } return $text } # # evaluate end of a node # XMLRecreatorVisitor instproc visitEnd objName { my instvar result set c [$objName content] if {$c ne ""} { if {![my hasOnlyAttrs $objName]} { append result [my insertIndent $objName] \n } } # a child is responsible for the "mixed content" data elements # that have a location after the child set p [$objName info parent] if {[$p istype XMLElement] && [$p mixedContent]} { foreach {location data} [$p set pcdata] { if {$location == $objName} { append result [my insertIndent $objName] \ [my pcdataString $data] \n } } } } # # public method to be called on top node -> returns XML text as result # XMLRecreatorVisitor instproc interpretNodeTree node { my instvar result set result "" my set nestingStart [my nestingDepth $node] $node accept [self] return $result } namespace export XMLRecreatorVisitor } namespace import ::xotcl::xml::recreatorVisitor::* ./xotcl-1.6.8/library/xml/._xoXML.xotcl000644 000765 000024 00000000430 12161607177 020370 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/library/xml/xoXML.xotcl000644 000765 000024 00000042621 12161607177 020163 0ustar00neumannstaff000000 000000 package provide xotcl::xml::parser 1.0 package require XOTcl 1 package require -exact xotcl::pattern::chainOfResponsibility 1.0 package require -exact xotcl::pattern::sortedCompositeWithAfter 1.0 #package require -exact xotcl::pattern::link 1.0 package require -exact xotcl::trace 1.0 #package require -exact xml #package require expat namespace eval ::xotcl::xml::parser { namespace import ::xotcl::* ############################################################################## # # XML Namespace Handling # ############################################################################## @ ChainOfResponsibility XMLNamespace { description { A Chain of Responsiblity Class that handles the XML XMLNamespace facility for an object tree especially for internal usage of the xoXML component } } ChainOfResponsibility XMLNamespace XMLNamespace instproc init args { # Per default: New NS is end of a namespace chain # indicated by "" my successor "" my array set nsArray {} next } # # add two operations searchPrefix and searchFullName as chained -> calls are # automatically forwarded in the chain, if the failure value (here: "") # is returned by the chained object # XMLNamespace addChainedOperation searchPrefix "" XMLNamespace addChainedOperation searchFullName "" XMLNamespace addChainedOperation searchNamespaceByPrefix "" # # namespaces are added by value pairs of prefix and full namespace # name (ns) # XMLNamespace instproc add {prefix ns} { #puts stderr "adding ns: $prefix $ns" my set nsArray($prefix) $ns } # # search the chain for a prefix -> return full name, if found # XMLNamespace instproc searchPrefix {prefix} { #puts stderr "[self proc]: Searching for $prefix in [self]" #puts stderr "[self proc]: There are: [my array names nsArray]" if {[my exists nsArray($prefix)]} { return [my set nsArray($prefix)] } else { return "" } } # # search the chain for a prefix -> return the responisble namespace name # XMLNamespace instproc searchNamespaceByPrefix {prefix} { if {[my exists nsArray($prefix)]} { return [self] } else { return "" } } # # search the chain for the full name -> return prefix, if found # XMLNamespace instproc searchFullName {fname} { foreach n [my array names nsArray] { if {[string match [my set nsArray($n)] $fname]} { return $n } } return "" } # # construct the full name from either a expression "prefix:name" # or just "name" (then construct with "xmlns" as default namespace prefix) # XMLNamespace instproc getFullName {fname} { #puts stderr "Getting FullName for $fname in [self]" if {[regexp "^(.*):(.*)$" $fname _ prefix name]} { if {[set pre [my searchPrefix $prefix]] != ""} { return [set pre]$name } } else { # no colon -> use xmlns return [my searchPrefix "xmlns"]$fname } return $fname } ############################################################################## # # Abstract Node Class # ############################################################################## SortedComposite AbstractXMLNode @ SortedComposite AbstractXMLNode { description { Abstract interface for all node classes. Nodes have an event based parsing interface to build up a node tree, from an event based parsing stream } } # # called if node start event occurs -> # start parsing node "name" and intpretation hook for the attribute list # AbstractXMLNode abstract instproc parseStart {name attrList} # # called if "character data" is reached # AbstractXMLNode abstract instproc parseData {text} # # called if node end is reached # AbstractXMLNode abstract instproc parseEnd {name} # # convinience method for printing nodes to output stream (e.g. for debugging) # AbstractXMLNode abstract instproc print {} # # Visitor acceptance methods -> call visit and visitEnd of the given # "visitor" with my as argument # AbstractXMLNode abstract instproc accept {visitor} AbstractXMLNode abstract instproc acceptEnd {visitor} # make 'accept' and 'acceptEnd' composite operations AbstractXMLNode addOperations {accept accept} AbstractXMLNode addAfterOperations {accept acceptEnd} ############################################################################## # # XMLNode Node Class # ############################################################################## # # the pcdata variable stores the data elements in form of a tuple list # . # Class XMLNode -superclass AbstractXMLNode -parameter { {content ""} {namespace} {parser ""} pcdata } @ Class XMLNode { description { general superclass for XML nodes } } XMLNode instproc init args { my array set attributes {} next } XMLNode instproc nextChild {name} { set child [my autoname $name] my set lastChild $child my appendChildren $child return $child } # # placeholder methods for the event interface # XMLNode instproc parseStart {name attrList} { #puts "parsed start: [my info class]: $name $attrList" } # # chracter data is stored in a pcdata variable. # XMLNode instproc mixedContent {} { expr {[my exists children] && [my exists pcdata]} } XMLNode instproc parseData {text} { #my showCall my instvar pcdata set childBeforePCData "" # if pcdata exists seek the last XMLElement child #if {[my exists children]} { # foreach c [my set children] { # if {[[self]::$c istype XMLElement]} { # set childBeforePCData [self]::$c # } # } # } if {[my exists lastChild]} { set childBeforePCData [self]::[my set lastChild] } #my showMsg childBeforePCData=$childBeforePCData #my showMsg old-pcdata=$pcdata if {[my exists pcdata]} { foreach {e d} $pcdata { } #puts stderr "//$e//$d// [expr {$e == $childBeforePCData}]" if {$e == $childBeforePCData} { set pcdata [lreplace $pcdata [expr {[llength $pcdata]-2}] end] set text $d$text } lappend pcdata $childBeforePCData $text #puts stderr *append****new-pcdata=$pcdata } else { set pcdata [list $childBeforePCData $text] #puts stderr *set*******new-pcdata=$pcdata } } # # this method just returns the data elt in the first pcdata # XMLNode instproc getFirstPCData {} { if {[my exists pcdata]} { return [lindex [my set pcdata] 1] } return "" } # # returns a list of all pcdata elememts, without location information # stored in the pcdata instance variable # XMLNode instproc getPCdataList {} { set result "" foreach {l data} [my set pcdata] { lappend result $data } return $result } # #my set pcdata $text XMLNode instproc parseEnd {name} { #puts "parsed end: [my info class]: $name" } XMLNode instproc print {} { set c "[my info class]-[self] --- [my content]" foreach a [my array names attributes] { append c "\nATTR: $a = [my set attributes($a)]" } if {[my exists pcdata]} { foreach d [my getPCdataList] { append c "\nPCDATA:\n$d" } } return $c } # # composite accept operation for visiting the node tree # through visitors # # -> interpretation of the interpreter pattern # XMLNode instproc accept {visitor} { $visitor visit [self] } # # composite operation called at termination of computation of # a level == end node # XMLNode instproc acceptEnd {visitor} { $visitor visitEnd [self] } # # error message, if child can't be parsed # XMLNode instproc errorChild {c} { error "[self] unexpected content $c" } # # find the namespace object that is currently responsible # for the [self] node # XMLNode instproc resolveNS {} { set parser [my set parser] if {[my exists namespace]} { return [my set namespace] } else { set p [my info parent] if {$p ne "" && $p != $parser} { return [$p resolveNS] } else { #puts stderr "No parent namespace !! Using Parser's topNs ..." return "" } } } # # add a new namespace entry to the object's NS entry, if it exists # otherwise: act as a factory method for NS objects and create an # NS object for the [self] node # XMLNode instproc makeIndividualNSEntry {prefix entry} { set ns [my resolveNS] if {[string first [self] $ns] == -1} { #puts stderr "new namespace for [self]" set newNS [XMLNamespace create [self]::[my autoname ns]] $newNS set successor $ns my namespace $newNS set ns $newNS } $ns add $prefix $entry } # # check for xmlns attribute in the name/value pair "n v" # return 1 on success, otherwise 0 # XMLNode instproc checkForXmlNS {n v} { #puts "checking to build NS in [self] with $n == $v" if {[regexp {^xmlns:?(.*)$} $n _ prefix]} { if {$prefix eq ""} { set prefix "xmlns" } my makeIndividualNSEntry $prefix $v return 1 } return 0 } # small helper proc to extract the namespace prefix from content XMLNode instproc getContentPrefix {} { if {[regexp {^([^:]*):} [my set content] _ prefix]} { return $prefix } return "" } ############################################################################## # # XMLNode _Class_ Factory for creating XML style node # node classes # ############################################################################## Class XMLNodeClassFactory -superclass Class XMLNodeClassFactory create XMLElement -superclass XMLNode ############################################################################## # # Add some methods to the created XMLElement class # ############################################################################## XMLElement instproc parseAttributes {name attrList} { my set content $name foreach {n v} $attrList { if {[my checkForXmlNS $n $v]} {continue} my set attributes($n) $v } } # # build a child corresponding to the node start event and # check attribute list -> set content (attr name) and value (attr value) # on created attr children objects of the XMLElement child # return the new XMLElement child # XMLElement instproc parseStart {name attrList} { set parser [my set parser] set nf [$parser set nodeFactory] set r [$nf getNode XMLElement [self]::[my nextChild elt] $parser] $r parseAttributes $name $attrList return $r } # no action of parse end -> just return [self] for convinience XMLElement instproc parseEnd content { self } ############################################################################## # # Abstract interface for factories that create node objects; # ############################################################################## Class AbstractXMLNodeFactory # # get a node with the specifies key (normally the classname) and name # the node "objName" -> without flyweights an object "objName" or type "key" # is created # AbstractXMLNodeFactory abstract instproc getNode {key objName parser} # # clean up the node factory # AbstractXMLNodeFactory abstract instproc reset {} ############################################################################## # # Special Node Factory as used in xoXML and xoRDF # for shared classes the factory acts as a flyweight factory # ############################################################################## Class XMLNodeFactory -superclass AbstractXMLNodeFactory -parameter { {sharedNodes ""} } XMLNodeFactory instproc getNode {class objName parser} { $class create $objName -parser $parser ;# returns object ID } XMLNodeFactory instproc reset {} { #my array set flyweights {} } ############################################################################## # # XML Factory for creating node objects # ############################################################################## XMLNodeFactory xmlNodeFactory ############################################################################## # # Xml Parser Connection Class (wrapper facade to TclXML, expat # interface like parsers) # ############################################################################## Class XMLParser -parameter { {topLevelNodeHandler ""} {nodeFactory "xmlNodeFactory"} {xmlTextParser expat_fallback_tclxml} } # # normally all toplevel start events are handled with XML-Elements # here we can define regexp patterns for other toplevel handlers # XMLParser instproc topLevelHandlerPattern {regexp handlerClass} { my lappend topLevelNodeHandler $regexp $handlerClass } # # if regexp matches -> handler class is used (see start instproc) # if none matches -> use XMLElement; "name" is name given by the # start method # XMLParser instproc createTopLevelNode {name attrList} { set nf [my set nodeFactory] set tnName [my autoname topNode] foreach {regexpPattern class} [my set topLevelNodeHandler] { if {[regexp $regexpPattern $name]} { set tn [$nf getNode $class [self]::$tnName [self]] my set currentTopNode $tn return $tn } } set tn [$nf getNode XMLElement [self]::$tnName [self]] my set currentTopNode $tn $tn parseAttributes $name $attrList return $tn } # # determine the current node -> either the end of node list or topNode # XMLParser instproc currentNode {} { set nodeList [my set nodeList] if {$nodeList eq ""} { if {[my exists currentTopNode]} { return [my set currentTopNode] } error "No current top node" } else { return [lindex $nodeList end] } } # # instatiate parser and register event callback methods with parser # XMLParser instproc init args { #my set xmlTextParser expat switch -- [my set xmlTextParser] { tclxml { package require xml my set PC \ [xml::parser [[self class] autoname [namespace tail [self]]]] } expat { package require xotcl::xml::expat my set PC \ [expat [[self class] autoname [namespace tail [self]]]] } expat_fallback_tclxml { if {[catch {package require xotcl::xml::expat}]} { package require xml my set PC \ [xml::parser [[self class] autoname [namespace tail [self]]]] #puts "using tclxml" } else { my set PC \ [expat [[self class] autoname [namespace tail [self]]]] #puts "using expat" } } } my configure \ -characterdatacommand [list [self] pcdata] \ -elementstartcommand [list [self] start] \ -elementendcommand [list [self] end] my set nodeList "" next } XMLParser instproc characterdatacommand cmd { [my set PC] configure -[self proc] $cmd } XMLParser instproc elementstartcommand cmd { [my set PC] configure -[self proc] $cmd } XMLParser instproc elementendcommand cmd { [my set PC] configure -[self proc] $cmd } # # Create Forwarding methods to the parser == # abstact interface for xml parser acces # XMLParser instproc cget option {[my set PC] cget $option} XMLParser instproc parse data {[my set PC] parse $data} XMLParser instproc parseFile filename { set F [open $filename r]; set c [read $F]; close $F return [my parse $c] } XMLParser instproc reset {} { [my set PC] reset foreach c [my info children] { $c destroy } my autoname -reset topNode my set nodeList "" [my set nodeFactory] reset } XMLParser instproc pcdata text { #my showCall set t [string trim $text] if {$t ne ""} { #puts stderr "[self]->[self proc] '$text'" [my currentNode] parseData $t } } XMLParser instproc start {name {attrList ""}} { #puts "[self]->[self proc] $name $attrList" my instvar nodeList if {$nodeList eq ""} { # no currentNode -> we have to create one set newStartNode [my createTopLevelNode $name $attrList] } else { set newStartNode [[my currentNode] parseStart $name $attrList] } lappend nodeList $newStartNode } XMLParser instproc end {name} { #puts "[self]->[self proc] $name" my instvar nodeList set currentNode [my currentNode] $currentNode parseEnd $name set nodeList [lreplace $nodeList end end] } XMLParser instproc destroy args { if {[my exists PC]} { rename [my set PC] "" } next } ############################################################################## # # Abstract class for visiting Parser Node Trees # ############################################################################## Class NodeTreeVisitor # # visit a given node "objName" -> called by accept method of objName # visit encapsulates the interpretation algorithm for a node # NodeTreeVisitor abstract instproc visit objName # # interpret the whole node tree strating with top node "node" # NodeTreeVisitor abstract instproc interpretNodeTree node # # visit end may stay unspecified in concrete visitors # NodeTreeVisitor instproc visitEnd objName {;} # # template method that interprets all topnodes of a parser # in original order # NodeTreeVisitor instproc interpretAll {parser} { set result "" foreach tn [lsort [$parser info children topNode*]] { append result [my interpretNodeTree $tn] } return $result } namespace export XMLNamespace AbstractXMLNode XMLNode \ XMLNodeClassFactory XMLElement AbstractXMLNodeFactory \ XMLNodeFactory XMLParser NodeTreeVisitor } namespace import ::xotcl::xml::parser::* ./xotcl-1.6.8/._Makefile.in000644 000765 000024 00000000430 12327661144 016105 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/Makefile.in000644 000765 000024 00000061774 12327661144 015712 0ustar00neumannstaff000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2003 ActiveState Corporation. # Copyright (C) 1999-2014 Gustaf Neumann (a) (b) # Copyright (C) 1999-2007 Uwe Zdun (a) (b) # # See the file "tcl-license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # RCS: @(#) $Id: Makefile.in,v 1.25 2007/09/18 19:27:32 neumann Exp $ #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #XOTCL_VERSION = @PACKAGE_VERSION@ XOTCL_VERSION = @XOTCL_VERSION@ src_lib_dir = ${srcdir}/library src_doc_dir = ${srcdir}/doc src_test_dir = ${srcdir}/tests src_app_dir = ${srcdir}/apps src_generic_dir = ${srcdir}/generic src_man_dir = ${srcdir}/man TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@ TK_LIB_SPEC = @TK_LIB_SPEC@ TK_STUB_LIB_SPEC = @TK_STUB_LIB_SPEC@ subdirs = @subdirs@ aol_prefix = @aol_prefix@ # Requires native paths PLATFORM_DIR = `@CYGPATH@ $(srcdir)/@TEA_PLATFORM@` target_doc_dir = ./doc src_lib_dir_native = `@CYGPATH@ ${src_lib_dir}` src_doc_dir_native = `@CYGPATH@ ${src_doc_dir}` src_test_dir_native = `@CYGPATH@ ${src_test_dir}` src_app_dir_native = `@CYGPATH@ ${src_app_dir}` src_generic_dir_native = `@CYGPATH@ ${src_generic_dir}` libdirs = comm lib serialize @libdirs_actiweb@ libsrc = COPYRIGHT pkgIndex.tcl appdirs = comm scripts utils @apps_actiweb@ appsrc = COPYRIGHT DOC_SOURCE = \ $(src_doc_dir)/langRef.xotcl \ $(src_lib_dir)/lib/*.xotcl \ $(src_lib_dir)/store/*.xotcl \ $(src_lib_dir)/serialize/Serializer.xotcl \ $(src_test_dir)/*.xotcl \ $(src_app_dir)/scripts/*.xotcl \ $(src_app_dir)/comm/[flsw]*.xotcl \ $(src_app_dir)/actiweb/univ/UNIVERSAL.xotcl \ $(src_app_dir)/utils/xo-*[a-z0-9] #export TCLLIBPATH=. ${srcdir} mkinstalldirs= mkdir -p #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ bindir = @bindir@ libdir = @libdir@ datadir = @datadir@ mandir = @mandir@ includedir = @includedir@ DESTDIR = top_builddir = . INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ # INSTALL = $(SHELL) $(srcdir)/config/install-sh -c ${INSTALL_OPTIONS} # INSTALL_DATA_DIR = ${INSTALL} -d -m 755 # INSTALL_PROGRAM = ${INSTALL} -m 755 # INSTALL_DATA = ${INSTALL} -m 644 # INSTALL_SCRIPT = ${INSTALL_PROGRAM} # INSTALL_LIBRARY = ${INSTALL_DATA} PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ CLEANFILES = @CLEANFILES@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_FLAGS = @SHLIB_LD_FLAGS@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ # This is necessary for packages that use private Tcl headers #TCL_TOP_DIR_NATIVE = @TCL_TOP_DIR_NATIVE@ # Not used, but retained for reference of what libs Tcl required TCL_LIBS = @TCL_LIBS@ pkgdatadir = @pkgdatadir@ pkglibdir = @pkglibdir@ pkgincludedir = @pkgincludedir@ # XOTCLSH = @XOTCLSH@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \ @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(top_builddir) ${srcdir}" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) SHARED_BUILD = @SHARED_BUILD@ AM_CPPFLAGS = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ @XOTCL_BUILD_INCLUDE_SPEC@ EXTRA_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(EXTRA_CFLAGS) DEFS = @DEFS@ $(EXTRA_CFLAGS) CONFIG_CLEAN_FILES = @CONFIG_CLEAN_FILES@ CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = @AR@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target inclues executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries doc end #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) @XOTCLSH@ @XOWISH@ pkgIndex.tcl @if test ! "x$(subdirs)" = "x" ; then dirs="$(subdirs)" ; \ for dir in $$dirs ; do \ if (cd $$dir; $(MAKE) $@) ; then true ; else exit 1 ; fi ; \ done; fi; libraries: @if test ! "x$(subdirs)" = "x" ; then dirs="$(subdirs)" ; \ for dir in $$dirs ; do \ if (cd $$dir; $(MAKE) $@) ; then true ; else exit 1 ; fi ; \ done; fi; libraries-pkgindex: @$(TCLSH) $(src_lib_dir_native)/lib/make.xotcl -dir $(src_lib_dir_native) -all fulldoc: doc pdf # use language reference as sample file to trigger generation of documentation files doc: $(target_doc_dir)/langRef-xotcl.html $(target_doc_dir)/langRef-xotcl.html: $(src_doc_dir)/langRef.xotcl $(DOC_SOURCE) @docs=""; \ for i in $(DOC_SOURCE); do docs="$$docs `@CYGPATH@ $$i`"; done; \ $(TCLSH) $(src_lib_dir_native)/lib/makeDoc.xotcl \ $(target_doc_dir) $$docs pdf: -(cd $(src_doc_dir); htmldoc --webpage --format pdf14 --title \ -f tutorial.pdf tutorial.html ) -(cd $(src_doc_dir); htmldoc --webpage --format pdf14 \ -f langRef-xotcl.pdf langRef-xotcl.html ) install: install-binaries install-shells install-libraries install-doc @if test ! "x$(subdirs)" = "x" ; then dirs="$(subdirs)" ; \ for dir in $$dirs ; do \ if (cd $$dir; $(MAKE) $@) ; then true ; else exit 1 ; fi ; \ done; fi; install-binaries: binaries install-lib-binaries install-bin-binaries install-pkgIndex install-aol: install-binaries install-libraries $(INSTALL) $(src_generic_dir)/aol-xotcl.tcl \ $(DESTDIR)/$(aol_prefix)/modules/tcl/xotcl.tcl #======================================================================== # This rule installs platform-independent files, such as header files. #======================================================================== install-libraries: libraries $(DESTDIR)$(includedir) $(DESTDIR)$(pkglibdir) @echo "Installing header files in $(DESTDIR)$(includedir)" @for i in $(PKG_HEADERS) ; do \ echo " Installing $$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; @echo "Installing Libraries to $(DESTDIR)$(pkglibdir)/" @for i in $(libdirs) ; do \ echo " Installing $$i/" ; \ rm -rf $(DESTDIR)$(pkglibdir)/$$i ; \ mkdir -p $(DESTDIR)$(pkglibdir)/$$i; \ chmod 755 $(DESTDIR)$(pkglibdir)/$$i; \ for j in $(src_lib_dir)/$$i/*.*tcl ; do \ $(INSTALL_DATA) $$j $(DESTDIR)$(pkglibdir)/$$i/; \ done; \ done; @for i in $(libsrc) ; do \ echo " Installing $$i" ; \ rm -rf $(DESTDIR)$(pkglibdir)/$$i ; \ $(INSTALL_DATA) $(src_lib_dir)/$$i $(DESTDIR)$(pkglibdir)/$$i ; \ done; cat unix/pkgIndex.unix >> $(DESTDIR)$(pkglibdir)/pkgIndex.tcl $(INSTALL_DATA) xotclConfig.sh $(DESTDIR)$(libdir)/ @echo "Installing Applications to $(DESTDIR)$(pkglibdir)/apps/" @for i in $(appdirs) ; do \ echo " Installing $$i/" ; \ rm -rf $(DESTDIR)$(pkglibdir)/apps/$$i ; \ mkdir -p $(DESTDIR)$(pkglibdir)/apps/$$i; \ chmod 755 $(DESTDIR)$(pkglibdir)/apps/$$i; \ for j in $(src_app_dir)/$$i/* ; do \ if test -d $$j; then \ mkdir -p $(DESTDIR)$(pkglibdir)/$$j; \ chmod 755 $(DESTDIR)$(pkglibdir)/$$j; \ for k in $$j/* ; do \ $(INSTALL) $$k $(DESTDIR)$(pkglibdir)/$$j ; \ done; \ else \ $(INSTALL) $$j $(DESTDIR)$(pkglibdir)/apps/$$i/; \ fi; \ done; \ done; @for i in $(appsrc) ; do \ echo " Installing $$i" ; \ rm -rf $(DESTDIR)$(pkglibdir)/apps/$$i ; \ $(INSTALL_DATA) $(src_app_dir)/$$i $(DESTDIR)$(pkglibdir)/apps ; \ done; @rm -rf $(DESTDIR)$(pkglibdir)/store/XOTclGdbm @rm -rf $(DESTDIR)$(pkglibdir)/store/XOTclSdbm @rm -rf $(DESTDIR)$(pkglibdir)/xml/TclExpat-1.1 #======================================================================== # Install documentation. Unix manpages should go in the $(DESTDIR)$(mandir) # directory. #======================================================================== install-doc: doc $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man3 $(DESTDIR)$(mandir)/mann @if test ! "x$(XOTCLSH)" = "x" ; then \ (cd $(src_man_dir)/ ; \ for i in *.1; do \ echo "Installing $$i"; \ rm -f $(DESTDIR)$(mandir)/man1/$$i; \ sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \ $$i > $(DESTDIR)$(mandir)/man1/$$i; \ chmod 444 $(DESTDIR)$(mandir)/man1/$$i; \ done) ; \ fi shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) test: binaries libraries test-core test-http @test_actiweb@ test-nohttp: binaries libraries test-core #TESTFLAGS = -srcdir $(srcdir) test-core: $(TCLSH_PROG) $(TCLSH) $(src_test_dir_native)/testx.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/testo.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/speedtest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/forwardtest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/slottest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/mixinoftest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/varresolutiontest.xotcl \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) test-http: $(TCLSH_PROG) $(TCLSH) $(src_test_dir_native)/xocomm.test \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) test-actiweb: $(TCLSH_PROG) $(TCLSH) $(src_test_dir_native)/actiweb.test \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/persistence.test \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/UNIVERSAL.test \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) $(TCLSH) $(src_test_dir_native)/xoRDF.test \ -libdir $(PLATFORM_DIR) $(TESTFLAGS) @rm -rf receiver depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # xotcl shells #======================================================================== pkgIndex.tcl: $(PKG_LIB_FILE) @echo package ifneeded XOTcl $(PACKAGE_VERSION) [list load [file join \$$dir . $(PKG_LIB_FILE)] XOTcl] > pkgIndex.tcl install-pkgIndex: # @echo package ifneeded XOTcl $(PACKAGE_VERSION) [list load [file join \$$dir .. "$(PKG_LIB_FILE)"] XOTcl] > "$(pkglibdir)/pkgIndex.tcl" xotclsh: tclAppInit.o $(PKG_OBJECTS) $(CONDITIONAL_STUB_OBJECTS) $(CC) -o $@ tclAppInit.o \ $(PKG_OBJECTS) \ $(CFLAGS) $(LDFLAGS_DEFAULT) $(TCL_LIB_SPEC) $(TCL_STUB_LIB_SPEC) \ $(DMALLOC_LIB) $(CONDITIONAL_STUB_OBJECTS) xowish: tkAppInit.o $(PKG_OBJECTS) $(CONDITIONAL_STUB_OBJECTS) $(CC) -o $@ tkAppInit.o \ $(PKG_OBJECTS) \ $(CFLAGS) $(LDFLAGS_DEFAULT) $(TCL_LIB_SPEC) $(TCL_STUB_LIB_SPEC) $(TK_LIB_SPEC) $(TK_STUB_LIB_SPEC) \ $(DMALLOC_LIB) $(CONDITIONAL_STUB_OBJECTS) install-shells: @if test -f xotclsh; then \ $(INSTALL_PROGRAM) xotclsh $(DESTDIR)$(bindir); \ fi @if test -f xowish; then \ $(INSTALL_PROGRAM) xowish $(DESTDIR)$(bindir); \ fi #======================================================================== # We need to enumerate the list of .c to .o lines here. # Unfortunately, there does not seem to be any other way to do this # in a Makefile-independent way. We can't use VPATH because it picks up # object files that may be located in the source directory. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # exampleA.$(OBJEXT): $(srcdir)/src/win/exampleA.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/src/win/exampleA.c` -o $@ #======================================================================== $(src_generic_dir)/predefined.h: $(src_generic_dir)/mk_predefined.xotcl $(src_generic_dir)/predefined.xotcl (cd $(src_generic_dir); $(TCLSH) mk_predefined.xotcl > predefined.h) xotclStubInit.$(OBJEXT): $(PKG_HEADERS) xotclStubLib.$(OBJEXT): $(src_generic_dir)/xotclStubLib.c $(PKG_HEADERS) xotcl.$(OBJEXT): $(src_generic_dir)/xotcl.c $(src_generic_dir)/predefined.h $(PKG_HEADERS) xotclError.$(OBJEXT): $(src_generic_dir)/xotclError.c $(PKG_HEADERS) xotclMetaData.$(OBJEXT): $(src_generic_dir)/xotclMetaData.c $(PKG_HEADERS) xotclObjectData.$(OBJEXT): $(src_generic_dir)/xotclObjectData.c $(PKG_HEADERS) xotclProfile.$(OBJEXT): $(src_generic_dir)/xotclProfile.c $(PKG_HEADERS) xotclTrace.$(OBJEXT): $(src_generic_dir)/xotclTrace.c $(PKG_HEADERS) xotclUtil.$(OBJEXT): $(src_generic_dir)/xotclUtil.c $(PKG_HEADERS) xotclShadow.$(OBJEXT): $(src_generic_dir)/xotclShadow.c $(PKG_HEADERS) aolstub.$(OBJEXT): $(src_generic_dir)/aolstub.c $(PKG_HEADERS) # # Target to regenerate header files and stub files from the *.decls tables. # genstubs: $(TCLSH) $(TCL_SRC_DIR)/tools/genStubs.tcl $(src_generic_dir) \ $(src_generic_dir)/xotcl.decls $(src_generic_dir)/xotclInt.decls # # Target to check that all exported functions have an entry in the stubs # tables. # checkstubs: -@for i in `nm -p $(PKG_LIB_FILE) | awk '$$2 ~ /T/ { print $$3 }' \ | sort -n`; do \ match=0; \ for j in $(TCL_DECLS); do \ if [ `grep -c $$i $$j` -gt 0 ]; then \ match=1; \ fi; \ done; \ if [ $$match -eq 0 ]; then echo $$i; fi \ done #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -rm -rf $(BINARIES) $(CLEANFILES) @XOTCLSH@ @XOWISH@ pkgIndex.tcl ./receiver \ $(target_doc_dir)/*-xotcl.html find ${srcdir} -type f -name \*~ -exec rm \{} \; @if test ! "x$(subdirs)" = "x" ; then dirs="$(subdirs)" ; \ for dir in $$dirs ; do \ if (cd $$dir; $(MAKE) $@) ; then true ; else exit 1 ; fi ; \ done; fi distclean: clean -rm -rf Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status @if test ! "x$(subdirs)" = "x" ; then dirs="$(subdirs)" ; \ for dir in $$dirs ; do \ if (cd $$dir; $(MAKE) $@) ; then true ; else exit 1 ; fi ; \ done; fi #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: @mkdir -p $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ ln -s $(DESTDIR)$(pkglibdir)/$$p $(DESTDIR)$(libdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: @mkdir -p $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done SUFFIXES= .c .$(OBJEXT) #Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status # cd $(top_builddir) \ # && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done $(DESTDIR)$(includedir): $(mkinstalldirs) $@ $(DESTDIR)$(bindir): $(mkinstalldirs) $@ $(DESTDIR)$(libdir): $(mkinstalldirs) $@ $(DESTDIR)$(pkglibdir): $(mkinstalldirs) $@ $(DESTDIR)$(pkglibdir)/apps: $(DESTDIR)$(pkglibdir) $(mkinstalldirs) $@ $(DESTDIR)$(mandir)/man1: $(mkinstalldirs) $@ $(DESTDIR)$(mandir)/man3: $(mkinstalldirs) $@ $(DESTDIR)$(mandir)/mann: $(mkinstalldirs) $@ end: @echo "" @echo "************************************************************" @echo " Make completed. In order to test XOTcl, invoke:" @echo " make test" @echo "" @echo " In order install XOTcl, invoke:" @echo " make install" @echo "" @echo " In order to install XOTcl for AOLserver 4.x, invoke:" @echo " make install-aol" @echo "" @echo " In order to invoke XOTcl interactively (before install), use:" @echo " export TCLLIBPATH=\"$(TCLLIBPATH)\" or " @echo " setenv TCLLIBPATH \"$(TCLLIBPATH)\"" @echo " and" @if test "x$(XOTCLSH)" = "x" ; then \ echo " @TCLSH_PROG@" ; \ echo " package require XOTcl; namespace import -force xotcl::*" ; \ echo " or" ; \ echo " put the 'package require' line into your ~/.tclshrc" ; \ else \ echo " ./xotclsh" ; \ fi @echo "************************************************************" RPMSOURCES=/usr/src/redhat/SOURCES RPMSPECS=/usr/src/redhat/SPECS rpm: @if test ! -d $(RPMSOURCES); then mkdir -p $(RPMSOURCES); fi @if test ! -d $(RPMSPECS); then mkdir -p $(RPMSPECS); fi cp unix/xotcl.spec $(RPMSPECS)/xotcl-$(PACKAGE_VERSION).spec make tar cp ../xotcl-$(PACKAGE_VERSION).tar.gz $(RPMSOURCES) rpmbuild -ba $(RPMSPECS)/xotcl-$(PACKAGE_VERSION).spec bin-tar: (cd ..; tar zcvf xotcl-$(PACKAGE_VERSION)-bin-linux-i686-glibc.tar.gz \ `find $(exec_prefix)/bin/xotclsh $(exec_prefix)/bin/xowish \ $(prefix)/lib/xotcl$(PACKAGE_VERSION)* \ $(prefix)/lib/libxotcl$(PACKAGE_VERSION)* \ $(prefix)/include/xotcl*.h \ $(DESTDIR)$(pkglibdir) $(prefix)/man/man1/xo* \ -type f -o -type l | fgrep -v CVS | fgrep -v SCCS | fgrep -v .junk| fgrep -v .db | fgrep -v "~" | fgrep -v "#" | fgrep -v /receiver/` \ ) tar: libraries-pkgindex sh ./tclconfig/mktar.sh .PHONY: all binaries clean depend distclean doc install libraries \ test test-core test-actiweb # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ./xotcl-1.6.8/man/._man.macros000644 000765 000024 00000000430 12161600406 016562 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/man/man.macros000644 000765 000024 00000011531 12161600406 016351 0ustar00neumannstaff000000 000000 '\" The definitions below are for supplemental macros used in Tcl/Tk '\" manual entries. '\" '\" .AP type name in/out ?indent? '\" Start paragraph describing an argument to a library procedure. '\" type is type of argument (int, etc.), in/out is either "in", "out", '\" or "in/out" to describe whether procedure reads or modifies arg, '\" and indent is equivalent to second arg of .IP (shouldn't ever be '\" needed; use .AS below instead) '\" '\" .AS ?type? ?name? '\" Give maximum sizes of arguments for setting tab stops. Type and '\" name are examples of largest possible arguments that will be passed '\" to .AP later. If args are omitted, default tab stops are used. '\" '\" .BS '\" Start box enclosure. From here until next .BE, everything will be '\" enclosed in one large box. '\" '\" .BE '\" End of box enclosure. '\" '\" .CS '\" Begin code excerpt. '\" '\" .CE '\" End code excerpt. '\" '\" .VS ?version? ?br? '\" Begin vertical sidebar, for use in marking newly-changed parts '\" of man pages. The first argument is ignored and used for recording '\" the version when the .VS was added, so that the sidebars can be '\" found and removed when they reach a certain age. If another argument '\" is present, then a line break is forced before starting the sidebar. '\" '\" .VE '\" End of vertical sidebar. '\" '\" .DS '\" Begin an indented unfilled display. '\" '\" .DE '\" End of indented unfilled display. '\" '\" .SO '\" Start of list of standard options for a Tk widget. The '\" options follow on successive lines, in four columns separated '\" by tabs. '\" '\" .SE '\" End of list of standard options for a Tk widget. '\" '\" .OP cmdName dbName dbClass '\" Start of description of a specific option. cmdName gives the '\" option's name as specified in the class command, dbName gives '\" the option's name in the option database, and dbClass gives '\" the option's class in the option database. '\" '\" .UL arg1 arg2 '\" Print arg1 underlined, then print arg2 normally. '\" '\" RCS: @(#) $Id: man.macros,v 1.1 2004/05/23 22:50:39 neumann Exp $ '\" '\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. .if t .wh -1.3i ^B .nr ^l \n(.l .ad b '\" # Start an argument description .de AP .ie !"\\$4"" .TP \\$4 .el \{\ . ie !"\\$2"" .TP \\n()Cu . el .TP 15 .\} .ta \\n()Au \\n()Bu .ie !"\\$3"" \{\ \&\\$1 \\fI\\$2\\fP (\\$3) .\".b .\} .el \{\ .br .ie !"\\$2"" \{\ \&\\$1 \\fI\\$2\\fP .\} .el \{\ \&\\fI\\$1\\fP .\} .\} .. '\" # define tabbing values for .AP .de AS .nr )A 10n .if !"\\$1"" .nr )A \\w'\\$1'u+3n .nr )B \\n()Au+15n .\" .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n .nr )C \\n()Bu+\\w'(in/out)'u+2n .. .AS Tcl_Interp Tcl_CreateInterp in/out '\" # BS - start boxed text '\" # ^y = starting y location '\" # ^b = 1 .de BS .br .mk ^y .nr ^b 1u .if n .nf .if n .ti 0 .if n \l'\\n(.lu\(ul' .if n .fi .. '\" # BE - end boxed text (draw box now) .de BE .nf .ti 0 .mk ^t .ie n \l'\\n(^lu\(ul' .el \{\ .\" Draw four-sided box normally, but don't draw top of .\" box if the box started on an earlier page. .ie !\\n(^b-1 \{\ \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .el \}\ \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .\} .fi .br .nr ^b 0 .. '\" # VS - start vertical sidebar '\" # ^Y = starting y location '\" # ^v = 1 (for troff; for nroff this doesn't matter) .de VS .if !"\\$2"" .br .mk ^Y .ie n 'mc \s12\(br\s0 .el .nr ^v 1u .. '\" # VE - end of vertical sidebar .de VE .ie n 'mc .el \{\ .ev 2 .nf .ti 0 .mk ^t \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' .sp -1 .fi .ev .\} .nr ^v 0 .. '\" # Special macro to handle page bottom: finish off current '\" # box/sidebar if in box/sidebar mode, then invoked standard '\" # page bottom macro. .de ^B .ev 2 'ti 0 'nf .mk ^t .if \\n(^b \{\ .\" Draw three-sided box if this is the box's first page, .\" draw two sides but no top otherwise. .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .\} .if \\n(^v \{\ .nr ^x \\n(^tu+1v-\\n(^Yu \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c .\} .bp 'fi .ev .if \\n(^b \{\ .mk ^y .nr ^b 2 .\} .if \\n(^v \{\ .mk ^Y .\} .. '\" # DS - begin display .de DS .RS .nf .sp .. '\" # DE - end display .de DE .fi .RE .sp .. '\" # SO - start of list of standard options .de SO .SH "STANDARD OPTIONS" .LP .nf .ta 4c 8c 12c .ft B .. '\" # SE - end of list of standard options .de SE .fi .ft R .LP See the \\fBoptions\\fR manual entry for details on the standard options. .. '\" # OP - start of full description for a single option .de OP .LP .nf .ta 4c Command-Line Name: \\fB\\$1\\fR Database Name: \\fB\\$2\\fR Database Class: \\fB\\$3\\fR .fi .IP .. '\" # CS - begin code excerpt .de CS .RS .nf .ta .25i .5i .75i 1i .. '\" # CE - end code excerpt .de CE .fi .RE .. .de UL \\$1\l'|0\(ul'\\$2 .. ./xotcl-1.6.8/man/._xotclsh.1000644 000765 000024 00000000430 12327000756 016355 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/man/xotclsh.1000644 000765 000024 00000006471 12327000756 016153 0ustar00neumannstaff000000 000000 '\" '\" XOTcl - Extended OTcl '\" Copyright (C) 1999-2014 Gustaf Neumann, '\" Copyright (C) 1999-2007 Uwe Zdun '\" '\" .so man.macros .TH xotclsh 1 "" XOTcl "XOTcl Applications" .BS .SH NAME xotclsh \- Tcl Shell containing object-oriented scripting language XOTcl .SH SYNOPSIS \fBxotclsh\fR \fI?filename arg arg ...?\fR .BE .SH DESCRIPTION .PP \fBxotclsh\fR is a shell-like application that reads XOTcl commands from its standard input or from a file and evaluates them. Similarly as the relation between \fBtclsh\fR and \fBwish\fR, \fBxowish\fR provides all functionality of xotclsh and provides as well predefined support for TK widgets. .PP XOTcl (XOTcl, pronounced exotickle) is an object-oriented scripting language based on MIT's OTcl. It is intended as a value added replacement of OTcl. .PP Scripting languages, such as Tcl, are designed for glueing components together, provide features such as dynamic extensibility and dynamic typing with automatic conversion, that make them well suited for rapid application development. .PP The object system of XOTcl enables a user to to define objects, classes, and meta-classes. Classes are special objects with the purpose of managing other objects. ``Managing'' means that a class controls the creation and destruction of its instances and that it contains a repository of methods accessible for the instances. Every object may be enhanced with object-specific methods. XOTcl supports single and multiple inheritance. All object-class and class-class relationships in XOTcl are introspectable and can be dynamically changed at arbitrary times. Ambiguities in name resolution of methods are avoided through method chaining through "next", which does not require explicit method naming. .PP XOTcl combines the ideas of scripting and object-orientation in a way that preserves the benefits of both of them. It is equipped with several new language constructs that help building and managing complex systems. We added the following support: .PP \fIDynamic Object Aggregations\fR, to provide dynamic aggregations through nested namespaces (objects). .PP \fINested Classes\fR, to reduce the interference of independently developed program structures. .PP \fIAssertions\fR, to reduce the interface and the reliability problems caused by dynamic typing and, therefore, to ease the combination of many components. .PP \fIMeta-data\fR, to enhance self-documentation of objects and classes. .PP \fIPer-object mixins\fR, as a means to give an object dynamically access to the methods of one or several supplemental classes. .PP \fIPer-class mixins\fR, as a means to give all instances of an class dynamically access to the methods of one or several supplemental classes. .PP \fIFilters\fR as a means of abstractions over method invocations to implement large program structures, like design patterns. XOTcl provides a value-added replacement of Tcl package loading providing integration with object-oriented constructs and tracking/tracing of component loading. .SH VARIABLES .PP \fBxotclsh\fR sets all variables that \fBtclsh\fR sets, and additionally the following variables: .TP 15 \fB::xotcl::version\fR XOTcl version number. .TP 15 \fB::xotcl::confdir\fR Directory for XOTcl configuration. .TP 15 \fB::xotcl::logdir\fR Directory where logfiles are placed. .PP .SH KEYWORDS argument, interpreter, prompt, script file, shell ./xotcl-1.6.8/man/._xowish.1000644 000765 000024 00000000430 12327001014 016176 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/man/xowish.1000644 000765 000024 00000006353 12327001014 015773 0ustar00neumannstaff000000 000000 '\" '\" XOTcl - Extended OTcl '\" Copyright (C) 1999-2014 Gustaf Neumann, '\" Copyright (C) 1999-2007 Uwe Zdun '\" '\" .so man.macros .TH xowish 1 "" XOWish "XOTcl Applications" .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME xowish \- Graphical shell containing object-oriented scripting language XOTcl .SH SYNOPSIS \fBxowish\fR ?\fIfileName arg arg ...\fR? .BE .SH DESCRIPTION .PP \fBxowish\fR is a shell-like application that reads XOTcl commands from its standard input or from a file and evaluates them. In addition to \fBxotclsh\fR it provides graphical user interface support for TK widgets. .PP XOTcl (XOTcl, pronounced exotickle) is an object-oriented scripting language based on MIT's OTcl. It is intended as a value added replacement for OTcl. .PP Scripting languages, like Tcl, are designed for glueing components together, provide features like dynamic extensibility and dynamic typing with automatic conversion, that make them well suited for rapid application development. .PP The basic object system of XOTcl is adopted from OTcl. The object system enables us to define objects, classes, and meta-classes. Classes are special objects with the purpose of managing other objects. ``Managing'' means that a class controls the creation and destruction of its instances and that it contains a repository of methods accessible for the instances. Every object may be enhanced with object-specific methods. XOTcl supports single and multiple inheritance. All relationships in XOTcl, including class and superclass relationships, are completely dynamic and can be introspected. Through method chaining without explicit naming of the intended method, ambiguities in name resolution of methods are avoided. This way a shadowed method can be ``mixed into'' the execution of the current method. .PP XOTcl combines the ideas of scripting and object-orientation in a way that preserves the benefits of both of them. It is equipped with several new language functionalities that help building and managing complex systems. We added the following support: .PP Dynamic Object Aggregations, to provide dynamic aggregations through nested namespaces (objects). .PP Nested Classes, to reduce the interference of independently developed program structures. .PP Assertions, to reduce the interface and the reliability problems caused by dynamic typing and, therefore, to ease the combination of many components. .PP Meta-data, to enhance self-documentation of objects and classes. .PP Per-object mixins, as a means to improve flexibility of mixin methods by giving an object access to several different supplemental classes, which may be changed dynamically. .PP Per-class mixins, as a means to improve flexibility of mixin methods to a class, all instances of the class have access to the mixed in methods like for multiple inheritance, but without the need of intersection classes. .PP Filters as a means of abstractions over method invocations to implement large program structures, like design patterns. .PP Dynamic Component Loading XOTcl integrates the Tcl package loading with architectrual support for integration with object-oriented constructs. Moreover, it provides tracking/tracing of component loading. .PP .SH KEYWORDS argument, interpreter, prompt, script file, shell ./xotcl-1.6.8/._README000644 000765 000024 00000000430 12327660745 014726 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/README000644 000765 000024 00000011152 12327660745 014514 0ustar00neumannstaff000000 000000 ***************** XOTcl README File ***************** ********************************** Compilation of Source Distribution ********************************* Read COMPILE for compilation guidance on UNIX or COMPILE.win for Windows. ************************************ Installation of Binary Distributions ************************************ For all binary distributions firstly Tcl and Tk must be installed properly. Binary distributions require Tcl/Tk 8.3 (included in most Linux distributions), which you can find from: http://www.tcl.tk Working with a Shell -------------------- From version 1.1 on XOTcl does not - by default - build xotclsh and xowish anymore. Instead you should use xotcl from tclsh or wish. The typical way to do so is to load XOTcl as a packages and then import the commands from the XOTcl namespace into the current namespace: tclsh8.5 package require XOTcl; namespace import -force xotcl::* That means, the XOTcl installed package library needs to be on Tcl's search path for packages. If XOTcl is not installed in the standard Tcl location, you can either set the environment variable TCLLIBPATH from outside of Tcl to this location, or use the variable auto_path in Tcl. For instance, to use the local, extracted tar ball, you can use something like (under UNIX): export TCLLIBPATH="./xotcl-1.6.8" or setenv TCLLIBPATH "./xotcl-1.6.8" Under Windows: set TCLLIBPATH=".\xotcl-1.6.8" Linux Binary Distribution ------------------------- Per default the Linux version install to usr/local and XOTcl directories. If you want to install to these directions, just cd / tar xvfz xotcl-XXX.tar.gz otherwise: mkdir temp-xotcl cd temp-xotcl tar xvfz xotcl-XXX.tar.gz and then copy the file in temp-xotcl/usr/local to your installation destination and temp-dir/xotcl where you want to have the examples and documentation. If the packages can not be found, try to set the TCLLIBPATH. On Unix Systems: csh: setenv TCLLIBPATH "/usr/local/lib/xotcl-/ $(TCLLIBPATH)" bash: export TCLLIBPATH="/usr/local/lib/xotcl-/ $(TCLLIBPATH)" Windows Binary Release ---------------------- You need Tcl installed properly. If necessary, get Tcl for your system from http://www.tcl.tk Now check where Tcl is installed and what the name of the tclsh*.exe is. If you installed Tcl 8.5.13, the name is tclsh85.exe. On my system Tcl installs tclsh in c:\Programme\Tcl\bin (in English versions this is most likely under c:\Program Files\Tcl\bin). On my system the tcl installer adds this directory automatically to the search PATH; if this is not the case on your system, add this directory manually to your PATH (under NT or Win2K, use: Control Panel/System/.../Environment; MSDOS-class system use autoexec.bat to add this directory to the PATH variable by a line like SET PATH=c:\Progra~1\Tcl\bin;%PATH% ) and reboot. Now you should be able now to start the Tcl shell by typing "tclsh83". You will see the % prompt. To exit the shell, type "exit". The xotcl*.zip file contains the XOTcl distribution. Unzip the contents of the XOTcl zip file on c: to a directory "xotcl*." Open a DOS box window and change to the XOTcl win directory, like: c: cd \xotcl-\win Next, you have to invoke the installer: tclsh83 installWin.tcl The installer tries to install xotcl in the default directory "\Program~1\Tcl", which should at least work on English and German platforms (in English Windows distributions the program directory is called "Program Files", in German versions, it is called "Programme"). If you want to install XOTcl at a different you can specify the target directory as an argument of the installer: tclsh83 installWin.tcl /Programme/Tcl Now you should be able to use XOTcl by starting Tclsh and using: package require XOTcl; namespace import -force xotcl::* If XOTcl is not found on your system, you can set the TCLLIBPATH enviornment variable to the location of xotcl, e.g.: set TCLLIBPATH="C:/PROGRA~1/TCL/lib/xotcl" Please note the slashes, do not use backslashes here! You can test your installation with: XOTcl Tests: tclsh xotcl-/tests/testx.xotcl tclsh xotcl-/tests/testo.xotcl tclsh xotcl-/tests/speedtest.xotcl tclsh xotcl-/tests/xocomm.test tclsh xotcl-/tests/persistence.test tclsh xotcl-/tests/xoRDF.test More Infos ---------- More information can be found at: http://www.xotcl.org You can find a mailing list about XOTcl there as well. Please report bugs and problems to the authors under one of these email addresses: uwe.zdun@wu-wien.ac.at, zdun@xotcl.org gustaf.neumann@wu-wien.ac.at, neumann@xotcl.org ./xotcl-1.6.8/._README.aol000644 000765 000024 00000000430 12161600406 015460 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/README.aol000644 000765 000024 00000001057 12161600406 015251 0ustar00neumannstaff000000 000000 Starting with Aolserver 4.* xotcl can be loaded via package require. However, it is recommended to install the binaries under the aolserver directory. The recommended configuration is: ./configure --enable-threads --prefix=/usr/local/aolserver Then, you can do a make make install We provide a small .tcl-file for providing xotcl as a module (available in all connection threads) and easing the load of .xotcl files (to be loaded after the xotcl extension). The support file can be installed via: make install-aol Zoran, Gustaf ./xotcl-1.6.8/._tcl-license.terms000644 000765 000024 00000000430 12161600305 017302 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tcl-license.terms000644 000765 000024 00000004321 12161600305 017070 0ustar00neumannstaff000000 000000 This software is copyrighted by the Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState Corporation and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, the Government shall have only "Restricted Rights" in the software and related documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, the software shall be classified as "Commercial Computer Software" and the Government shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the authors grant the U.S. Government and others acting in its behalf permission to use and distribute the software in accordance with the terms specified in this license. ./xotcl-1.6.8/._tcl.m4000644 000765 000024 00000000521 12326520136 015057 0ustar00neumannstaff000000 000000 Mac OS X  2QATTRQ¸™¸€com.apple.acl.text8com.apple.quarantine!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity q/0001;5341449d;Firefox;./xotcl-1.6.8/tcl.m4000644 000765 000024 00000405647 12326520136 014664 0ustar00neumannstaff000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ `ls -d /usr/lib/tcl8.6 2>/dev/null` \ `ls -d /usr/lib/tcl8.5 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef _WIN32 #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" do64bit_ok=yes CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) case $system in FreeBSD-3.*) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' TCL_LIB_VERSIONS_OK=nodots ;; esac ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) INSTALL_DATA="\${INSTALL} -m 644" AC_SUBST(INSTALL_DATA) INSTALL_PROGRAM="\${INSTALL}" AC_SUBST(INSTALL_PROGRAM) INSTALL_SCRIPT="\${INSTALL}" AC_SUBST(INSTALL_SCRIPT) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -nodefaultlib -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test "$GCC" = "yes"; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} -static-libgcc" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_LIB_FILE=lib${PKG_LIB_FILE} fi fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ./xotcl-1.6.8/tclconfig/._install-sh000755 000765 000024 00000000430 12327645477 020027 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tclconfig/install-sh000755 000765 000024 00000033054 12327645477 017622 0ustar00neumannstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -S $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ./xotcl-1.6.8/tclconfig/._mktar.sh000755 000765 000024 00000000430 12161600406 017453 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tclconfig/mktar.sh000755 000765 000024 00000000573 12161600406 017246 0ustar00neumannstaff000000 000000 #!/bin/sh pwd=`pwd` name=`basename $(pwd)` echo "name=$name" make distclean cd .. tar zcvf ./$name.tar.gz \ `find ./$name -type f -o -type l| fgrep -v .git| fgrep -v CVS | fgrep -v SCCS | \ fgrep -v Attic | fgrep -v "autom4te"| fgrep -v "~"|fgrep -v .db | \ fgrep -v .junk | fgrep -v .orig | fgrep -v "#" |fgrep -v .DS_Store| fgrep -v config. | \ fgrep -v .gdb` ./xotcl-1.6.8/tests/._actiweb.test000755 000765 000024 00000000430 12161601511 017510 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/actiweb.test000755 000765 000024 00000006266 12161601511 017310 0ustar00neumannstaff000000 000000 # -*- Mode: tcl -*- # $Id: actiweb.test,v 1.9 2006/09/27 08:12:40 neumann Exp $ # regression test for actiweb examples #if {[set ::tcl_platform(platform)] == "windows"} { # lappend auto_path . #} package require XOTcl 1; namespace import -force ::xotcl::* set pkgDir [file dirname [info script]]/.. lappend auto_path $pkgDir package require xotcl::test 1 #package require xotcl::package; package verbose 1 package require xotcl::comm::httpAccess 1 #package require xotcl::trace set tclsh [info nameofexecutable] set dir [file dir [info script]] set actiwebApps $dir/../apps/actiweb # remove persitent vars to get reproducible behavior catch [file delete -force receiver] proc terminate {} { catch [file delete -force receiver] exit } puts "$tclsh ${actiwebApps}/Counter.xotcl" puts "------------------------------------ $tclsh ${actiwebApps}/Counter.xotcl -pkgdir $pkgDir" set PIPE1 [open "| $tclsh ${actiwebApps}/Counter.xotcl -pkgdir $pkgDir"] set PIPE2 [open "| $tclsh ${actiwebApps}/Counter2.xotcl -pkgdir $pkgDir"] set PIPE3 [open "| $tclsh ${actiwebApps}/Counter3.xotcl -pkgdir $pkgDir"] set PIPE4 [open "| $tclsh ${actiwebApps}/Counter4.xotcl -pkgdir $pkgDir"] set PIPE5 [open "| $tclsh ${actiwebApps}/MC.xotcl -pkgdir $pkgDir"] proc printError msg {puts stderr !!!$msg!!!} Class T -superclass Test -parameter { {count 1} {errorReport { puts "\tcontent-length: \[r0::sink set contentLength\]\n\ \tstatus-code: \[\[r0 set token\] set responseCode\]" }}} T new -msg "Trying Counter.xotcl ... " \ -setResult {regexp {^The value in counter-1.html is now: 0} [r0::sink set d]} \ -cmd [list SimpleRequest r0 -url http://localhost:8090/counter-1.html] T new -msg "terminate Counter" -setResult {set x 1} \ -cmd [list SimpleRequest r0 -url http://localhost:8090/receiver::exit] \ -post {catch {close $::PIPE1}} T new -msg "Trying Counter2.xotcl ... " \ -setResult {r0 getContentLength} \ -expected 238 \ -cmd [list SimpleRequest r0 -url http://localhost:8091/web-c1] T new -msg "terminate Counter1" -setResult {set x 1} \ -cmd [list SimpleRequest r0 -url http://localhost:8091/receiver::exit] \ -post {catch {close $::PIPE2}} T new -msg "Trying Counter3.xotcl ... " \ -setResult {r0 getContentLength} \ -expected 122 \ -cmd [list SimpleRequest r0 -url http://localhost:8093/c1] T new -msg "terminate Counter3" -setResult {set x 1} \ -cmd [list SimpleRequest r0 -url http://localhost:8093/receiver::exit] \ -post {catch {close $::PIPE3}} T new -msg "Trying Counter4.xotcl (a) ... " \ -setResult {r0 getContentLength} \ -expected 126 \ -cmd [list SimpleRequest r0 -url http://localhost:8094/wc1] T new -msg "terminate Counter4" -setResult {set x 1} \ -cmd [list SimpleRequest r0 -url http://localhost:8094/receiver::exit] \ -post {catch {close $::PIPE4}} T new -msg "Trying MC.xotcl ... " \ -setResult {r0 getContentLength} \ -expected 1767 \ -cmd [list SimpleRequest r0 -url http://localhost:8092/Gustaf.html ] T new -msg "terminate MC" -setResult {set x 1} \ -cmd [list SimpleRequest r0 -url http://localhost:8092/receiver::exit] \ -post {catch {close $::PIPE5}; exit} after 4000 {Test run} catch {vwait forever} ./xotcl-1.6.8/tests/._forwardtest.xotcl000644 000765 000024 00000000430 12161601336 020612 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/forwardtest.xotcl000644 000765 000024 00000017507 12161601336 020412 0ustar00neumannstaff000000 000000 # $Id: forwardtest.xotcl,v 1.12 2007/08/14 16:38:27 neumann Exp $ package require XOTcl 1 namespace import -force xotcl::* package require xotcl::test 1 proc ? {cmd expected} { set t [Test new -cmd $cmd] $t expected $expected $t run } ########################################### # trivial object delegation ########################################### Object dog Object tail tail proc wag args { return $args } dog forward wag tail %proc ? {dog wag 100} 100 ########################################### # evaluating in scope ########################################### Class X -parameter {{x 1}} X instforward Incr -objscope incr X x1 -x 100 x1 Incr x x1 Incr x x1 Incr x ? {x1 x} 103 #puts "======" ########################################### # adding ########################################### Object obj obj forward addOne expr 1 + ? {obj addOne 5} 6 #puts "======" ########################################### # more arguments ########################################### Object target target proc foo args {return $args} obj forward foo target %proc %self a1 a2 ? {obj foo x1 x2} [list ::obj a1 a2 x1 x2] obj forward foo target %proc %self %%self %%p ? {obj foo x1 x2} [list ::obj %self %p x1 x2] #puts "======" ########################################### # mixin example ########################################### Object create mixin mixin proc unknown {m args} {return [concat [self] $m $args]} obj forward Mixin mixin %1 %self ? {obj Mixin add M1} [list ::mixin add ::obj M1] ? {catch {obj Mixin}} 1 obj forward Mixin -default {getter setter} mixin %1 %self ? {obj Mixin add M1} [list ::mixin add ::obj M1] ? {obj Mixin M1} [list ::mixin setter ::obj M1] ? {obj Mixin} [list ::mixin getter ::obj] #puts "======" ########################################### # sketching extensibe info ########################################### Object Info Info proc @mixin {o} { $o info mixin } Info proc @class {o} { ;# without prefix, doing here a [Info class] wod be wrong $o info class } Info proc @help {o} { ;# define a new subcommand for info foreach c [my info procs] {lappend result [string range $c 1 end]} return $result } Object instforward Info -methodprefix @ Info %1 %self ? {x1 Info class} ::X ? {x1 Info help} [list help mixin class] ########################################### # variations of placement of options ########################################### obj set x 1 obj forward i1 -objscope incr x ? {obj i1} 2 #puts "======" ########################################### # introspeciton options ########################################### Class C C instforward Info -methodprefix @ Info %1 %self ? {C info instforward} Info C instforward XXXo x ? {lsort [C info instforward]} [list Info XXXo] ? {C info instforward X*} [list XXXo] ? {lsort [C info instforward *o]} [list Info XXXo] # delete the forwarder C instproc XXXo {} {} ? {C info instforward} [list Info] # get the definition of a instforwarder ? {C info instforward -definition Info} [list -methodprefix @ Info %1 %self] # chek introspection for objects ? {lsort [obj info forward]} "Mixin addOne foo i1" ? {obj info forward -definition Mixin} "-default {getter setter} mixin %1 %self" ? {obj info forward -definition addOne} "expr 1 +" ? {obj info forward -definition foo} "target %proc %self %%self %%p" ? {obj info forward -definition i1} "-objscope ::incr x" #puts "======" ########################################### # test serializer ########################################### package require xotcl::serializer 1 obj proc test {} {puts "i am [self proc]"} set a [Serializer deepSerialize obj] #puts <<$a>> eval $a ? {set ::a} [Serializer deepSerialize obj] ########################################### # test optional target cmd ########################################### obj set x 2 obj forward append -objscope ? {obj append x y z} 2yz Object n; Object n::x; Object o; o forward ::n::x ? {o x self} ::n::x ########################################### # arg including instvar ########################################### obj set x 10 obj forward x* expr {%my set x} * ? {obj x* 10} "100" ########################################### # positional arguments ########################################### obj forward @end-13 list {%@end 13} ? {obj @end-13 1 2 3 } [list 1 2 3 13] obj forward @-1-13 list {%@-1 13} ? {obj @-1-13 1 2 3 } [list 1 2 13 3] obj forward @1-13 list {%@1 13} ? {obj @1-13 1 2 3 } [list 13 1 2 3] ? {obj @1-13} [list 13] obj forward @2-13 list {%@2 13} ? {obj @2-13 1 2 3 } [list 1 13 2 3] obj forward @list 10 {%@0 list} {%@end 99} ? {obj @list} [list 10 99] ? {obj @list a b c} [list 10 a b c 99] obj forward @list {%@end 99} {%@0 list} 10 ? {obj @list} [list 10 99] ? {obj @list a b c} [list 10 a b c 99] obj forward @list {%@2 2} {%@1 1} {%@0 list} ? {obj @list} [list 1 2] ? {obj @list a b c} [list 1 2 a b c] obj forward @list x y z {%@0 list} {%@1 1} {%@2 2} ? {obj @list} [list 1 2 x y z] ? {obj @list a b c} [list 1 2 x y z a b c] obj forward @list x y z {%@2 2} {%@1 1} {%@0 list} ? {obj @list} [list x 1 y 2 z] ? {obj @list a b c} [list x 1 y 2 z a b c] ############################################### # substitution depending on number of arguments ############################################### obj forward f %self [list %argclindex [list a b c]] obj proc a args {return [list [self proc] $args]} obj proc b args {return [list [self proc] $args]} obj proc c args {return [list [self proc] $args]} ? {obj f} [list a {}] ? {obj f 1 } [list b 1] ? {obj f 1 2} [list c {1 2}] ? {catch {obj f 1 2 3}} 1 ############################################### # option earlybinding ############################################### obj forward s -earlybinding ::set %proc ? {obj s 100} 100 ? {obj s} 100 Object instproc f args { next } Class NS Class NS::Main NS::Main proc m1 {} { my m2 } NS::Main proc m2 {} { ? {namespace eval :: {Object toplevelObj1}} ::toplevelObj1 ? [list set _ [namespace current]] ::NS ? [list set _ [NS create m1]] ::NS::m1 NS filter f ? [list set _ [NS create m2]] ::NS::m2 NS filter "" namespace eval ::test { ? [list set _ [NS create m3]] ::test::m3 NS filter f ? [list set _ [NS create m4]] ::test::m4 NS filter "" } namespace eval test { ? [list set _ [NS create m5]] ::NS::test::m5 NS filter f ? [list set _ [NS create m6]] ::NS::test::m6 NS filter "" } } NS::Main instproc i1 {} { my i2 } NS::Main instproc i2 {} { ? {namespace eval :: {Object toplevelObj2}} ::toplevelObj2 ? [list set _ [namespace current]] ::NS ? [list set _ [NS create i1]] ::NS::i1 NS filter f ? [list set _ [NS create i2]] ::NS::i2 NS filter "" namespace eval ::test { ? [list set _ [NS create i3]] ::test::i3 NS filter f ? [list set _ [NS create i4]] ::test::i4 NS filter "" } namespace eval test { ? [list set _ [NS create i5]] ::NS::test::i5 NS filter f ? [list set _ [NS create i6]] ::NS::test::i6 NS filter "" } } #puts ==== NS::Main m1 NS::Main create m m i1 #puts ==== ? [list set _ [NS create n1]] ::n1 NS filter f ? [list set _ [NS create n2]] ::n2 NS filter "" #puts ==== namespace eval test { ? [list set _ [NS create n1]] ::test::n1 ? [list set _ [NS create n3]] ::test::n3 NS filter f ? [list set _ [NS create n4]] ::test::n4 NS filter "" } ########################################### # forward to expr + callstack ########################################### Object instforward expr -objscope Class C C instproc xx {} {self} C proc t {o expr} { return [$o expr $expr] } C create c1 #puts ==== ? {c1 expr {[self]}} ::c1 ? {c1 expr {[self] == "::c1"}} 1 ? {c1 expr {[my xx]}} ::c1 ? {c1 expr {[my info class]}} ::C ? {c1 expr {[my istype C]}} 1 ? {c1 expr {[my istype ::C]}} 1 ? {C t ::c1 {[self]}} ::c1 ? {C t ::c1 {[self] == "::c1"}} 1 ? {C t ::c1 {[my xx]}} ::c1 ? {C t ::c1 {[my info class]}} ::C ? {C t ::c1 {[my istype C]}} 1 ? {C t ::c1 {[my istype ::C]}} 1 ./xotcl-1.6.8/tests/._mixinoftest.xotcl000644 000765 000024 00000000430 12161600406 020614 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/mixinoftest.xotcl000644 000765 000024 00000034330 12161600406 020405 0ustar00neumannstaff000000 000000 # testing mixinof package require XOTcl 1 namespace import -force xotcl::* package require xotcl::test 1 proc ? {cmd expected} { set t [Test new -cmd $cmd] $t expected $expected $t run } ########################################### # testing simple per object mixins ########################################### Class A Object o -mixin A ? {o mixin} ::A ? {o info mixin} ::A ? {A info mixinof} ::o o destroy ? {A info mixinof} "" A destroy ########################################### # testing transitive per object mixins ########################################### Class B Class C -superclass B Class M B instmixin M Object o -mixin C Object o1 -mixin B ? {C info mixinof} ::o ? {lsort [B info mixinof -closure]} "::o ::o1" ? {lsort [B info mixinof -closure ::o1]} "::o1" ? {lsort [B info mixinof -closure ::o*]} "::o ::o1" ? {lsort [C info mixinof -closure ::o*]} "::o" # A class is mixed into a per-object mixin class ? {lsort [M info mixinof -closure ::o*]} "::o ::o1" ? {lsort [M info mixinof]} "" M destroy B destroy C destroy ::o destroy ::o1 destroy ########################################### # testing per object mixins with redefinition ########################################### Class M -instproc foo args {puts x;next} Object o -mixin M ? {o info mixin} ::M ? {o info precedence} "::M ::xotcl::Object" ? {o procsearch foo} "::M instproc foo" Class M -instproc foo args next ? {o info mixin} ::M ? {o info precedence} "::M ::xotcl::Object" ? {o procsearch foo} "::M instproc foo" M destroy ? {o info mixin} "" ? {o info precedence} "::xotcl::Object" ? {o procsearch foo} "" o destroy ########################################### # testing simple per class mixins ########################################### ::xotcl::test::case pcm Class A Class B -instmixin A Class C -superclass B C c1 ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {c1 info precedence} "::A ::C ::B ::xotcl::Object" B destroy ? {A info instmixinof} "" ? {c1 info precedence} "::C ::xotcl::Object" A destroy C destroy c1 destroy ########################################### # testing simple per class mixins with guards ########################################### ::xotcl::test::case pcm2 Class M1 Class M2 Class X Class A -instmixin {M1 M2 X} A instmixinguard M1 "test" Class B -superclass A ? {A info instmixin M2} ::M2 ? {A info instmixin M*} "::M1 ::M2" ? {A info instmixin -guards} "{::M1 -guard test} ::M2 ::X" ? {B info instmixin} "" ? {B info instmixin -closure} "::M1 ::M2 ::X" ? {B info instmixin -closure M2} ::M2 ? {B info instmixin -closure M*} "::M1 ::M2" ? {B info instmixin -closure -guards} "{::M1 -guard test} ::M2 ::X" ? {B info instmixin -closure -guards M1} "{::M1 -guard test}" ? {B info instmixin -closure -guards M*} "{::M1 -guard test} ::M2" A destroy B destroy X destroy M1 destroy M2 destroy ########################################### # testing transitive per class mixins ########################################### ::xotcl::test::case trans-pcm1 Class A Class B -instmixin A Class C -superclass B A instmixin [Class M] A a1 B b1 C c1 ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {a1 info precedence} "::M ::A ::xotcl::Object" ? {b1 info precedence} "::M ::A ::B ::xotcl::Object" ? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object" ? {M info instmixinof} "::A" # since M is an instmixin of A and A is a instmixin of B, # M is a instmixin of B as well, and of its subclasses ? {M info instmixinof -closure} "::A ::B ::C" ? {A info instmixinof} "::B" ? {A info instmixinof -closure} "::B ::C" ? {B info instmixinof} "" ? {B info instmixinof -closure} "" # and now destroy mixin classes M destroy ? {a1 info precedence} "::A ::xotcl::Object" ? {b1 info precedence} "::A ::B ::xotcl::Object" ? {c1 info precedence} "::A ::C ::B ::xotcl::Object" B destroy ? {A info instmixinof} "" ? {c1 info precedence} "::C ::xotcl::Object" foreach o {A C a1 b1 c1} { $o destroy } ########################################### # testing transitive per class mixins with subclasses ########################################### ::xotcl::test::case trans-pcm2 Class X Class D Class C -superclass D Class A -instmixin C Class B -superclass A B b1 ? {C info instmixinof -closure} "::A ::B" ? {D info instmixinof -closure} "" ? {A info instmixinof -closure} "" ? {B info instmixinof -closure} "" ? {X info instmixinof -closure} "" D instmixin X ? {C info instmixinof -closure} "::A ::B" ? {D info instmixinof -closure} "" ? {A info instmixinof -closure} "" ? {B info instmixinof -closure} "" ? {X info instmixinof -closure} "::D ::C ::A ::B" ? {b1 info precedence} "::C ::X ::D ::B ::A ::xotcl::Object" B b2 ? {b2 info precedence} "::C ::X ::D ::B ::A ::xotcl::Object" foreach o {X D C A B b1 b2} {$o destroy} ########################################### # testing transitive per class mixins with subclasses ########################################### ::xotcl::test::case trans-pcm3 Class A3 -superclass [Class A2 -superclass [Class A1]] Class B3 -superclass [Class B2 -superclass [Class B1 -superclass [Class B0]]] Class C3 -superclass [Class C2 -superclass [Class C1]] A2 instmixin B2 B1 instmixin C2 ? {A1 info instmixinof -closure} "" ? {A2 info instmixinof -closure} "" ? {A3 info instmixinof -closure} "" ? {B0 info instmixinof -closure} "" ? {B1 info instmixinof -closure} "" ? {B2 info instmixinof -closure} "::A2 ::A3" ? {B3 info instmixinof -closure} "" ? {C1 info instmixinof -closure} "" ? {C2 info instmixinof -closure} "::B1 ::B2 ::B3 ::A2 ::A3" ? {C3 info instmixinof -closure} "" foreach o {A1 A2 A3 B0 B1 B2 B3 C1 C2 C3} {$o destroy} ########################################### # testing transitive per class mixins with destroy ########################################### ::xotcl::test::case pcm-trans-destroy-A Class A -instmixin [Class M] Class B -instmixin A Class C -superclass B A a1 B b1 C c1 ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {a1 info precedence} "::M ::A ::xotcl::Object" ? {b1 info precedence} "::M ::A ::B ::xotcl::Object" ? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object" # and now destroy A A destroy ? {a1 info precedence} "::xotcl::Object" ? {b1 info precedence} "::B ::xotcl::Object" ? {c1 info precedence} "::C ::B ::xotcl::Object" ? {M info instmixinof} "" ? {M info instmixinof -closure} "" B destroy ? {M info instmixinof} "" ? {c1 info precedence} "::C ::xotcl::Object" foreach o {M C a1 b1 c1} { $o destroy } ########################################### # testing transitive per class mixins with destroy ########################################### ::xotcl::test::case pcm-trans-destroy-B Class A -instmixin [Class M] Class B -instmixin A Class C -superclass B A a1 B b1 C c1 ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {a1 info precedence} "::M ::A ::xotcl::Object" ? {b1 info precedence} "::M ::A ::B ::xotcl::Object" ? {c1 info precedence} "::M ::A ::C ::B ::xotcl::Object" B destroy ? {a1 info precedence} "::M ::A ::xotcl::Object" ? {b1 info precedence} "::xotcl::Object" ? {c1 info precedence} "::C ::xotcl::Object" ? {M info instmixinof} "::A" ? {M info instmixinof -closure} "::A" ? {A info instmixinof} "" foreach o {M C a1 b1 c1} { $o destroy } ########################################### # testing simple per class mixins with redefinition ########################################### ::xotcl::test::case pcm-redefine Class A Class B -instmixin A Class C -superclass B C c1 ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {c1 info precedence} "::A ::C ::B ::xotcl::Object" ? {B info heritage} "::xotcl::Object" ? {C info heritage} "::B ::xotcl::Object" Class B -instmixin A ? {B info heritage} "::xotcl::Object" ? {C info heritage} "::xotcl::Object" ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {c1 info precedence} "::C ::xotcl::Object" B destroy ? {A info instmixinof} "" ? {c1 info precedence} "::C ::xotcl::Object" A destroy C destroy c1 destroy ########################################### # testing simple per class mixins with # redefinition and softrecreate ########################################### ::xotcl::test::case pcm-redefine-soft ::xotcl::configure softrecreate true Class A Class B -instmixin A Class C -superclass B C c1 ? {B instmixin} ::A ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {c1 info precedence} "::A ::C ::B ::xotcl::Object" ? {C info heritage} "::B ::xotcl::Object" ? {B info heritage} "::xotcl::Object" Class B -instmixin A ? {C info heritage} "::B ::xotcl::Object" ? {B info heritage} "::xotcl::Object" ? {B info instmixin} ::A ? {A info instmixinof} ::B ? {c1 info precedence} "::A ::C ::B ::xotcl::Object" B destroy ? {A info instmixinof} "" ? {c1 info precedence} "::C ::xotcl::Object" A destroy C destroy c1 destroy ########################################### # test of recreate with same superclass, # with softrecreate off ########################################### ::xotcl::test::case precedence ::xotcl::configure softrecreate false Class O Class A -superclass O Class B -superclass A B b1 A a1 O o1 ? {A info superclass} "::O" ? {B info heritage} "::A ::O ::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::A ::O ::xotcl::Object" ? {b1 info precedence} "::B ::A ::O ::xotcl::Object" # we recreate the class new, with the same superclass Class A -superclass O ? {A info superclass} "::O" ? {B info heritage} "::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "{} {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::xotcl::Object ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::xotcl::Object ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::xotcl::Object" ? {b1 info precedence} "::B ::xotcl::Object" foreach o {A O B a1 b1 o1} {$o destroy} ########################################### # test of recreate with different superclass # with softrecreate on ########################################### ::xotcl::test::case alternate-precedence ::xotcl::configure softrecreate false Class O Class A -superclass O Class B -superclass A B b1 A a1 O o1 ? {A info superclass} "::O" ? {B info heritage} "::A ::O ::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::A ::O ::xotcl::Object" ? {b1 info precedence} "::B ::A ::O ::xotcl::Object" # we recreate the class new, with a different superclass Class A ? {A info superclass} "::xotcl::Object" ? {B info heritage} "::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "{} {} {}" ? {list [A info superclass] [B info superclass] [O info superclass]} "::xotcl::Object ::xotcl::Object ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::xotcl::Object ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::xotcl::Object" ? {b1 info precedence} "::B ::xotcl::Object" foreach o {A O B a1 b1 o1} {$o destroy} ########################################### # test of recreate with same superclass, # with softrecreate on ########################################### ::xotcl::test::case recreate-precedence ::xotcl::configure softrecreate true Class O Class A -superclass O Class B -superclass A B b1 A a1 O o1 ? {A info superclass} "::O" ? {B info heritage} "::A ::O ::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::A ::O ::xotcl::Object" ? {b1 info precedence} "::B ::A ::O ::xotcl::Object" # we recreate the class new, with the same superclass Class A -superclass O ? {A info superclass} "::O" ? {B info heritage} "::A ::O ::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::A ::O ::xotcl::Object" ? {b1 info precedence} "::B ::A ::O ::xotcl::Object" foreach o {A O B a1 b1 o1} {$o destroy} ########################################### # test of recreate with different superclass # with softrecreate on ########################################### ::xotcl::test::case recreate-alternate-precedence ::xotcl::configure softrecreate true Class O Class A -superclass O Class B -superclass A B b1 A a1 O o1 ? {B info heritage} "::A ::O ::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} ::A" ? {list [A info superclass] [B info superclass] [O info superclass]} "::O ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::A ::O ::xotcl::Object" ? {b1 info precedence} "::B ::A ::O ::xotcl::Object" # we recreate the class new, with a different superclass Class A ? {A info superclass} "::xotcl::Object" ? {B info heritage} "::A ::xotcl::Object" ? {B info heritage} "::A ::xotcl::Object" ? {list [A info subclass] [B info subclass] [O info subclass]} "::B {} {}" ? {list [A info superclass] [B info superclass] [O info superclass]} "::xotcl::Object ::A ::xotcl::Object" ? {list [a1 info class] [b1 info class] [o1 info class]} "::A ::B ::O" ? {o1 info precedence} "::O ::xotcl::Object" ? {a1 info precedence} "::A ::xotcl::Object" ? {b1 info precedence} "::B ::A ::xotcl::Object" foreach o {A O B a1 b1 o1} {$o destroy} #foreach o [::xotcl::test::Test info instances] {$o destroy} #::xotcl::test::Test destroy #puts [lsort [::xotcl::Object allinstances]] ./xotcl-1.6.8/tests/._persistence.test000755 000765 000024 00000000430 12161600406 020420 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/persistence.test000755 000765 000024 00000025610 12161600406 020212 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # -*- Tcl -*- $Id: persistence.test,v 1.1 2004/05/23 22:50:39 neumann Exp $ package require XOTcl 1; namespace import -force xotcl::* @ @File { description { Several tests for persistent stores and performance comparison. The "-bigdb" command line option additionally starts a (longer) big database test. The test automatically detects which storages are avaiable. } } array set opt {-bigdb 0 -bench 0} array set opt $argv lappend auto_path [file dir [info script]]/.. #set auto_path ".. ../../src $auto_path" #package require xotcl::package;package verbose 1 set storageCandidates {Sdbm Jufgdbm Mem Gdbm TextFile} set storageCandidates {Sdbm Mem Gdbm TextFile} #set storageCandidates {Gdbm} set stores "" foreach store $storageCandidates { if {![catch {package require xotcl::store::[string tolower $store]}]} { lappend stores $store } else { puts "FAILED: package require xotcl::store::[string tolower $store]" } } puts "\nPersistence Test\n\nUsing the following Storages: \n $stores\n" set ::tests { testStorageFeatures Stores Traverse Store_Fetch_List Store_Fetch_List_Same_Key SimplePersistentObjects LotsOfObjects } if {$opt(-bigdb)} { lappend ::tests bigdb puts " ... bigdb test enabled.\n" } else { puts " ... bigdb test disabled.\n" } if {$opt(-bench)} { set ::runs 10 # don't use number >= 1000 because of SDBMs's char key length with the # test SimplePersistentObjects # don't use number > 272 because of SDBMs's key pairs max length of 1024 # FIX THIS in FUTURE RELEASES!! set ::iterations 272 } else { set ::runs 1 set ::iterations 10 } #package require xotcl::store::trace #Storage=Gdbm instmixin TraceStorage package require xotcl::store::persistence proc ::errorCheck {got expected msg} { if {$got != $expected} { puts stderr "FAILED: $msg\nGot: $got\nExpected: $expected" exit -1 } } proc ::errorCheckList {got expected msg} { if {[lsort $got] != [lsort $expected]} { puts stderr "FAILED: $msg\nGot: $got\nExpected: $expected" exit -1 } } Class PersistenceTest @ Class PersistenceTest PersistenceTest instproc init args { next } PersistenceTest instproc testStorageFeatures {store} { Storage=$store s s open testDB s set "{::a::s x} {x}" {a b c d} s set "::a::s x" {{r t} a b c r} s set ::a::t 7 set result [s set ::a::t] errorCheck $result 7 "Failed fetch ::a::t" set result [s set "{::a::s x} {x}"] errorCheck $result "a b c d" "Failed fetch {::a::s x} {x}" set result [s set "::a::s x"] errorCheck $result "{r t} a b c r" "Failed fetch ::a::s x" errorCheckList [s names] "{::a::s x} {{::a::s x} {x}} ::a::t" "Failed list -- all" set keys [list [s firstkey]] while {[set nk [s nextkey]] != ""} {lappend keys $nk} set keys [lappend keys [s firstkey]] while {[set nk [s nextkey]] != ""} {lappend keys $nk} errorCheckList $keys "{{::a::s x} {x}} {::a::s x} ::a::t {{::a::s x} {x}} {::a::s x} ::a::t" "First/next key traversal failed." s unset "{::a::s x} {x}" errorCheckList [s names] "{::a::s x} ::a::t" "Failed delete {::a::s x} {x}" s unset "::a::s x" errorCheckList [s names] "::a::t" "Failed delete ::a::s x" s close s destroy return " PASSED with $store" } PersistenceTest instproc Traverse { store} { Storage=$store s s open testDB for {set i 0} {$i < $::iterations} {incr i} { set key "::a${i}" set value "An value for the test $i $i $i\0" s set $key $value lappend resultKeys $key lappend resultValues $value } set keys [list [s firstkey]] set values [list [s set $keys]] while {[set nk [s nextkey]] != ""} { lappend keys $nk lappend values [s set $nk] } errorCheckList $keys $resultKeys "Failed Traverse keys" errorCheckList $values $resultValues "Failed Traverse values" s close s destroy return " PASSED with $store" } PersistenceTest instproc Stores {store} { Storage=$store s s open testDB for {set i 0} {$i < $::iterations} {incr i} { s set "::a${i}" "An value for the test $i $i $i" } set list [s names] errorCheck [llength $list] $::iterations "Failed Stores $::iterations -- Wrong \# of stored elements" s close s destroy return " PASSED with $store" } PersistenceTest instproc Store_Fetch_List {store} { Storage=$store s s open testDB for {set i 0} {$i < $::iterations} {incr i} { set key "::a${i}" set value "An value for the test $i $i $i" s set $key $value set list [s names] errorCheck [llength $list] [expr $i +1] "Failed Store_Fetch_List $::iterations -- Wrong \# of stored elements" set result [s set $key] errorCheck $result $value "Failed fetch Store_Fetch_List current key" set result [s set "::a0"] errorCheck $result "An value for the test 0 0 0" "Failed fetch Store_Fetch_List first key" } s close s destroy return " PASSED with $store" } PersistenceTest instproc Store_Fetch_List_Same_Key {store} { Storage=$store s s open testDB set key "Always the same key" for {set i 0} {$i < $::iterations} {incr i} { set value "An value for the test $i $i $i" s set $key $value set list [s names] errorCheck [llength $list] 1 "Failed Store_Fetch_List_Same_Key $::iterations -- Wrong \# of stored elements" set result [s set $key] errorCheck $result $value "Failed fetch Store_Fetch_List_Same_Key current key" } s close s destroy return " PASSED with $store" } # # tests dependent on the Persistence package # PersistenceTest instproc SimplePersistentObjects {store} { set ox 1; set oy 1; set py 1; set px 1; set oza 1; set ozb 1; set onames [list a b] set pza 1; set pzb 1; set pnames [list a b] #puts stderr mixin=[pmgr info mixin] #pmgr mixin [concat TraceStorage [pmgr info mixin]] for {set i 0} {$i < $::iterations} {incr i} { PersistenceMgr pmgr -dirName . \ -fileName testDB -dbPackage $store # Two example objects with variables set to default values Object o o set x 1 o set y 1 o set threeLines "a b c" o array set z {a 1 b 1} Object p p set x 1 p set y 1 p array set z {a 1 b 1} o mixin Persistent=Eager p mixin Persistent=Lazy # for the mem storage Lazy Persistence makes not much sense if {$store == "Mem"} {p mixin Persistent=Eager} o persistenceMgr pmgr p persistenceMgr pmgr o persistent {x y z threeLines} p persistent {x y z} o incr x 2 incr ox 2 o append y 1 append oy 1 p incr x 3 incr px 3 p append y 2 append py 2 o incr z(a) 2 incr oza 2 o append z(b) 1 append ozb 1 o set z($i) 5 lappend onames $i p incr z(a) 2 incr pza 2 p append z(b) 1 append pzb 1 p set z($i) 5 lappend pnames $i errorCheck [o set x] $ox "Persistence: o->x Failed" errorCheck [o set y] $oy "Persistence: o->y Failed" errorCheck [o set z(a)] $oza "Persistence: o->z(a) Failed" errorCheck [o set z(b)] $ozb "Persistence: o->z(b) Failed" errorCheckList [o array names z] $onames "Array indizes got lost - o -" errorCheck [p set x] $px "Persistence: p->x Failed" errorCheck [p set y] $py "Persistence: p->y Failed" errorCheckList [o array names z] $onames "Array indizes got lost" errorCheck [p set z(a)] $pza "Persistence: p->z(a) Failed" errorCheck [p set z(b)] $pzb "Persistence: p->z(b) Failed" errorCheckList [p array names z] $pnames "Array indizes got lost - p -" errorCheck [o set threeLines] {a b c} "Three Lines Failed" o destroy p destroy pmgr destroy } #errorCheck $ox 21 "Persistence: o->x End Result Failed" #errorCheck $oy 11111111111 "Persistence: o->y End Result Failed" #errorCheck $px 31 "Persistence: p->x End Result Failed" #errorCheck $py 12222222222 "Persistence: p->y End Result Failed" return " PASSED with $store" } PersistenceTest instproc LotsOfObjects {store} { set secondLoopMax 1 PersistenceMgr pmgr -dirName . \ -fileName testDB -dbPackage $store for {set i 0} {$i < $::iterations} {incr i} { # we create 10 objects per iteration for {set j 0} {$j < $secondLoopMax} {incr j} { Object iHaveaVeryLongName${i}${j} Object iHaveaVeryLongName${i}${j}::meToo${i}${j} iHaveaVeryLongName${i}${j} mixin Persistent=Eager iHaveaVeryLongName${i}${j} persistenceMgr pmgr iHaveaVeryLongName${i}${j}::meToo${i}${j} mixin Persistent=Eager iHaveaVeryLongName${i}${j}::meToo${i}${j} persistenceMgr pmgr foreach var {a b c d e f g h i j k l m n o p} { iHaveaVeryLongName${i}${j} set $var " some useless test ...... with spaces and lines breaks iHaveaVeryLongName$i $var $i " iHaveaVeryLongName${i}${j} persistent $var iHaveaVeryLongName${i}${j}::meToo${i}${j} set $var " some useless test ...... with spaces and lines breaks iHaveaVeryLongName$i $var $i " iHaveaVeryLongName${i}${j}::meToo${i}${j} persistent $var } } } pmgr destroy return " PASSED with $store" } PersistenceTest instproc random modulo { ;### random number generator [self] instvar seed set seed [expr {($seed*12731+34197) % 21473}] return [expr {$seed % $modulo}] } PersistenceTest instproc bigdb {store} { Storage=$store s s open testDB set max 100000 [self] set seed 4711 for {set i 0} {$i < $max} {incr i} { s set $i $i } [self] set seed 4711 for {set i 0} {$i < $max} {incr i} { set key [[self] random $max] set r [s set $key] errorCheck $r $key "Failed bigdb $::iterations -- Wrong result $r instead of $key" } s close s destroy return " PASSED with $store" } PersistenceTest instproc runOnce {} { eval file delete -force testDB [glob -nocomplain testDB*] catch {xotcl::memStoragePool remove testDB} foreach test $::tests { puts "[[self] set run]: $test $::iterations" foreach s $::stores { set t [time {set result [[self] $test $s]}] [self] report $test $s $t $result eval file delete -force testDB [glob -nocomplain testDB*] catch {xotcl::memStoragePool remove testDB} } } } PersistenceTest instproc run {runs} { [self] instvar run for {set run 1} {$run<=$runs} {incr run} { pt runOnce } } PersistenceTest instproc report {test store time result} { if {![regexp {^(-?[0-9]+) +(.*)$} $time _ ms string]} { puts stderr "time <$time> could not be parsed" return } set key bench($test,$store) set better " " if {[[self] exists $key]} { if {[[self] set $key] > $ms} { [self] set $key $ms set better "+" } } else { [self] set $key $ms } puts "[[self] set run]: [format %-22s $result]\ $better[format %10d $ms] $string" } PersistenceTest instproc table {} { set f [open "persistent.cvs" w] foreach test $::tests { set values "" foreach store $::stores { lappend values [[self] set bench($test,$store)] } puts "[format %-30s $test];[join $values {;}]" puts $f "[format %-30s $test];[join $values {;}]" } close $f } PersistenceTest pt -run $::runs if {$opt(-bench)} { pt table } ./xotcl-1.6.8/tests/._slottest.xotcl000644 000765 000024 00000000430 12161601415 020125 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/slottest.xotcl000644 000765 000024 00000042152 12161601415 017717 0ustar00neumannstaff000000 000000 # $Id: slottest.xotcl,v 1.5 2007/08/14 16:38:27 neumann Exp $ package require XOTcl 1 namespace import -force xotcl::* package require xotcl::test 1 proc ? {cmd expected} { set t [Test new -cmd $cmd -count 100] $t expected $expected $t run } proc t {cmd expected {txt ""}} { set t [Test new -cmd $cmd -msg $txt] $t expected $expected $t run } # what's new: # - slots instances are manager objects for slot values # - generalization of slots to have different kind of domains and managers # - slots for objects and classes (slot parameter 'per-object' true|false, # when to used on a class object) # - works for mixins/filters/class/superclass (e.g ... superclass add ::M) # - initcmd and valuecmd # initcmd: is executed when the instance variable is read the first time # valuecmd: is executed whenever the instance variable is read # (implemented via trace; alternate approach for similar behavior # is to define per-object procs for get/assign, see e.g. slots for # class and superclass; slots require methods to be invoked, # not var references; # otoh, trace are somewhat more fragile and harder to debug) # default, initcmd and valuecmd are to be used mutually exclusively # - valuechangedcmd: executed after the change of an instance variable, # can be used e.g. for validation # # -gustaf neumann 21.Jan. 2006 package require xotcl::serializer 1 #proc ? {cmd expected} { # set r [eval $cmd] # if {$r ne $expected} {error "$cmd returned '$r' ne '$expected'"} #} # proc t {cmd {txt ""}} { # set n 1000 # #set ms [lindex [time [list time $cmd $n] 10] 0] # set ms [lindex [time [list time $cmd $n] 5] 0] # puts "[format %7.4f [expr {$ms*1.0/$n}]]ms for [format %-30s $cmd] ($txt)" # } ####################################################### # testing __initcmds set ::hu 0 proc T1 {var sub op} {c1 set $var t1} proc T2 {var sub op} {c1 set $var t2} Class C -array set __initcmds { x {set x 1} y {incr ::hu} z {my trace add variable z read T1}} C create c1 ? {c1 info vars x} x ? {c1 info vars y} "" ? {c1 set x} 1 ? {set ::hu} 1 Class D -array set __initcmds { x {set x 2} z {my trace add variable z read T2}} -superclass C D create c1 ? {c1 set x} 2 ? {c1 set z} t2 ? {set ::hu} 2 ####################################################### # # a small helper Object instproc slots cmds { if {![my isobject [self]::slot]} {Object create [self]::slot} namespace eval [self]::slot $cmds } ###################### # system slots ###################### Class M Class O -mixin M ? {catch {Object o -mixin check1 M}} 1 ? {O mixin} ::M Class M2 O mixin add M2 ? {O mixin} {::M2 ::M} O mixin M2 ? {O mixin} ::M2 O mixin "" ? {O mixin} "" O mixin set M ;# not sure, whether we should keep set here, or use assign or some better term ? {O mixin} ::M ? {O mixin ""} "" # with slots like class etc. we have to option to # a) rename the original command like in the following # b) provide a no-op value, such that we define only meta-data in the slot # c) define a low-level tcl command like setrelation (or extend it) to handle the setter # "class" is not multivalued, therefore we should not add (or remove) add/delete # from the set of subcommands... ? {::xotcl::InfoSlot class} "::xotcl::MetaSlot" O o1 ? {o1 class} "::O" o1 class Object ? {o1 class} "::xotcl::Object" ? {catch {o1 class add M}} 1 ? {O superclass} "::xotcl::Object" Class O2 -superclass O #t {O2 superclass O} "superclass 1" ? {O superclass} "::xotcl::Object" ::xotcl::Slot instproc slot {object name property} { switch $property { self {return [self]} domain {return [my domain]} } } ? {O superclass slot self} "::xotcl::Class::slot::superclass" ? {O superclass slot domain} "::xotcl::Class" ? {O2 superclass} "::O" O2 superclass add M ? {O2 superclass} "::M ::O" O2 superclass delete ::O ? {O2 superclass} "::M" # the main difference between an Attribute and a Role is that # it references some other objects #Class Attribute -superclass ::xotcl::Slot Class Role -superclass Attribute -parameter {references} ###################### # application classes ###################### Class Person -slots { Attribute name Attribute age -default 0 } Class Article -slots { Attribute title Attribute date } Class publishes -slots { Role written_by -references Person -multivalued true Role has_published -references Paper -multivalued true } Class Project -slots { Attribute name Role manager -references Person Role member -references Person -multivalued true } puts [Person serialize] Person slot name default "gustaf" ? {Person slot name default} gustaf Person p1 -name neophytos ? {p1 name} neophytos ? {p1 age} 0 p1 age 123 ? {p1 age} 123 Object o1 o1 set i 0 ::xotcl::alias o1 Incr -objscope ::incr t {o1 incr i} 1 "method incr" t {o1 Incr i} 1002 "aliased tcl incr" t {o1 incr i} 2003 "method incr" t {o1 Incr i} 3004 "aliased tcl incr" ::xotcl::alias ::xotcl::Object Set -objscope ::set t {o1 set i 1} 1 "method set" t {o1 set i} 1 "method set" t {o1 Set i 1} 1 "aliased tcl set" t {o1 Set i} 1 "aliased tcl set" ::xotcl::alias o1 Set -objscope ::set t {o1 Set i 1} 1 "aliased object tcl set" t {o1 Set i} 1 "aliased object tcl set" ::xotcl::Object instforward SSet -earlybinding -objscope ::set t {o1 SSet i 1} 1 "forward earlybinding tcl set" t {o1 SSet i} 1 "forward earlybinding tcl set" #exit o1 set z 100 #o1 forward z o1 [list %argclindex [list set set]] %proc #o1 proc get name {my set $name} o1 forward get -earlybinding ::xotcl::setinstvar %self %1 ? {o1 get z 101} 101 ? {o1 get z} "101" t {o1 get z} 101 "get value via new parametercmd get" t {o1 get z 124} 124 "set value via new parametercmd get" o1 forward zz -earlybinding ::xotcl::setinstvar %self %proc ? {o1 zz 123} 123 ? {o1 zz} 123 t {o1 zz} 123 "parametercmd forward earlybinding setinstvar" t {o1 zz 124} 124 "parametercmd forward earlybinding setinstvar" o1 forward z2 -earlybinding -objscope ::set %proc t {o1 z2 111} 111 "parametercmd forward earlybinding tcl set" t {o1 z2} 111 "parametercmd forward earlybinding tcl set" o1 forward z3 -objscope ::set %proc t {o1 z3 111} 111 "parametercmd forward tcl set" t {o1 z3} 111 "parametercmd forward tcl set" o1 set y 11 o1 parametercmd y t {o1 y} 11 "parametercmd" t {o1 y 1} 1 "parametercmd" #Class C -parameter {a {b 10} {c "Hello World"}} #C copy V #puts [C serialize] #puts [V serialize] #C destroy #V v1 #puts [v1 b] # ::xotcl::Object instproc param arglist { # foreach arg $arglist { # puts "arg=$arg" # set l [llength $arg] # set name [lindex $arg 0] # if {![my isobject [self]::slot]} {::xotcl::Object create [self]::slot} # if {$l == 1} { # Attribute create [self]::slot::$name # } elseif {$l == 2} { # Attribute create [self]::slot::$name -default [lindex $arg 1] # } else { # set paramstring [string range $arg [expr {[string length $name]+1}] end] # #puts stderr "remaining arg = '$paramstring'" # if {[string match {[$\[]*} $paramstring]} { # #puts stderr "match, $cl set __defaults($name) $paramstring" # Attribute create [self]::slot::$name -default $paramstring # continue # } # } # } # } ::xotcl::Slot instmixin delete ::xotcl::Slot::Optimizer Class C1 -parameter {a {b 10} {c "Hello World"}} C1 c1 -a 1 ? {c1 a} 1 ? {c1 b} 10 ? {c1 c} "Hello World" ##### is short form of Class C2 -slots { Attribute a Attribute b -default 10 Attribute c -default "Hello World" } C2 c2 -a 1 ? {c2 procsearch a} "::C2 instforward a" ? {c2 a} 1 ? {c2 b} 10 ? {c2 c} "Hello World" t {c2 a} 1 "new indirect parametercmd" t {c2 a 1} 1 "new indirect parametercmd" ::xotcl::Slot instmixin add ::xotcl::Slot::Optimizer Class C3 -slots { Attribute a Attribute b -default 10 Attribute c -default "Hello World" } C3 c3 -a 1 ? {c3 procsearch a} "::C3 instparametercmd a" ? {c3 a} 1 ? {c3 b} 10 ? {c3 c} "Hello World" t {c3 a} 1 "new indirect parametercmd optimized" t {c3 a 1} 1 "new indirect parametercmd optimized" ####### nasty names Class create D -slots { Attribute create create -default 1 } D d1 ####### gargash 2 Class create A -parameter {{foo 1}} # or Class create A -slots { Attribute foo -default 1 } A create a1 -foo 234 ;# calls default foo setter A instproc f1 {} {puts hu} A instforward f2 puts hu A create a0 #a0 f1 a0 proc f3 {} {puts hu} a0 forward f4 puts hu ? {a0 procsearch f1} "::A instproc f1" ? {a0 procsearch f2} "::A instforward f2" ? {a0 procsearch f3} "::a0 proc f3" ? {a0 procsearch f4} "::a0 forward f4" ? {a0 procsearch set} "::xotcl::Object instcmd set" ? {A slot foo procsearch assign} "::xotcl::Slot instcmd assign" # redefine setter for foo of class A A slot foo proc assign {domain var val} { # Do something with [self] that isn't valid pre-init puts setter-[self proc] $domain set $var $val } a1 foo ;# calls default foo getter a1 foo 123 ;# calls overridden foosetter ? {a1 foo} 123 #puts [A serialize] ################### # Application Slots # Class Person -slots { Attribute name Attribute age -default 0 Attribute projects -default {} -multivalued true } Person p1 -name "Gustaf" ? {p1 name} Gustaf ? {p1 age} 0 ? {p1 projects} {} Class Project -slots { Attribute name Attribute description Attribute manager Attribute member -multivalued 1 } Project project1 -name XOTcl -description "A highly flexible OO scripting language" p1 projects add ::project1 ? {p1 projects} ::project1 #p1 projects add some-other-value #? {p1 projects} "some-other-value ::project1" ::xotcl::Slot instproc check { {-keep_old_value:boolean true} value predicate type obj var } { puts "+++ checking $value with $predicate ==> [expr $predicate]" if {![expr $predicate]} { if {[$obj exists __oldvalue($var)]} { $obj set $var [$obj set __oldvalue($var)] } else { $obj unset $var } error "$value is not of type $type" } if {$keep_old_value} {$obj set __oldvalue($var) $value} } ::xotcl::Slot instproc checkall {values predicate type obj var} { foreach value $values { my check -keep_old_value false $value $predicate $type $obj $var } $obj set __oldvalue($var) $value } Person slots { Attribute projects -default "" -multivalued true -type ::Project Attribute salary -type integer } Person p2 -name "Gustaf" p2 projects add ::project1 ? {catch {p2 projects add ::o1}} 1 p2 salary 100 ? {catch {p2 salary 100.9}} 1 ? {p2 salary} 100 p2 append salary 9 ? {p2 salary} 1009 ? {catch {p2 append salary b}} 1 ? {p2 salary} 1009 Person slots { Attribute sex -type "my sex" -proc sex {value} { switch -glob $value { m* {my uplevel {$obj set $var m}; return 1} f* {my uplevel {$obj set $var f}; return 1} default {return 0} } } } Person p3 -sex male ? {p3 sex} m set ::hu 0 Class C -slots { Attribute x -initcmd {incr ::hu; set x 101} } C c1 ? {c1 info vars} "" ? {c1 set x} 101 ? {c1 info vars} "x" ? {set ::hu 1} 1 Class Point -parameter {{x 100} {y 300}} Class Rectangle -parameter {color} Rectangle r0 -color pink -contains { Rectangle r1 -color red -contains { Point x1 -x 1 -y 2 Point x2 -x 1 -y 2 } Rectangle r2 -color green -contains { Point x1 Point x2 } } ? {r0 color} pink ? {r0 r1 color} red ? {r0 r1 x1 x} 1 ? {r0 r1 x2 y} 2 ? {r0 r2 color} green #puts [r0 serialize] ##### Class create A -slots { Attribute foo -default 1 -proc assign { domain var value} { if {$value < 0 || $value > 99} { error "$value is not in the range of 0 .. 99" } $domain set $var $value } } A create a1 ? {a1 foo 10} 10 ? {a1 foo 20} 20 ? {a1 foo} 20 ? {catch {a1 foo -1}} 1 ? {catch {a1 foo 100}} 1 ? {catch {a1 foo 99}} 0 set x [Object new -set x 1 -contains { Object new -set x 1.1 Object new -set x 1.2 -contains { Object new -set x 1.2.1 Object new -set x 1.2.2 -contains { Object new -set x 1.2.2.1 } Object new -set x 1.2.3 } Object new -set x 1.3 }] ? {llength [$x info children]} 3 ? {llength [[lindex [lsort [$x info children]] 0] info children]} 0 ? {llength [[lindex [lsort [$x info children]] 1] info children]} 3 ? {llength [[lindex [lsort [$x info children]] 2] info children]} 0 # / / / / / / / / / / / / / / / / / / / / / / / # Tests specific to per-object attribute slots # Class create C -slots { Attribute foo \ -per-object true \ -default 1 } C create c ? {C procsearch foo} "::C parametercmd foo" ? {c procsearch foo} "" ? {C slot foo procsearch assign} "::xotcl::Slot instcmd assign" ? {C exists foo} 1 ? {C set foo} 1 t {C foo} 1 "retrieves default value" C foo 123 t {C foo} 123 "custom defined value" C destroy # # basics (without default) # Class create C -slots { Attribute bar \ -per-object true } C create c ? {C procsearch bar} "::C parametercmd bar" ? {c procsearch bar} "" ? {C slot bar procsearch assign} "::xotcl::Slot instcmd assign" ? {C exists bar} 0 ? {C bar 1} 1 ? {C bar} 1 ? {c exists bar} 0 C destroy; c destroy # # basics (with default) # Class create C -slots { Attribute foo \ -per-object true \ -default 1 } C create c ? {C procsearch foo} "::C parametercmd foo" ? {c procsearch foo} "" ? {C slot foo procsearch assign} "::xotcl::Slot instcmd assign" ? {C exists foo} 1 ? {C set foo} 1 t {C foo} 1 "retrieves default value" C foo 123 t {C foo} 123 "custom defined value" # default is to be skipped when variable is already # initialised C set bar x C slots { Attribute bar \ -per-object true \ -default y } ? {C exists bar} 1 ? {C bar} x C destroy; c destroy # # trace-based hooks for per-object attributes # # a. initcmd set ::__verify 0 Class C -slots { Attribute bar \ -per-object true \ -initcmd {incr ::__verify; set _ 101} } C create c ? {C exists bar} 1 ? {set ::__verify} 1 ? {C bar} 101 ? {C exists bar} 1 ? {set ::__verify} 1 # b. valuecmd C slots { Attribute bar2 \ -per-object true \ -valuecmd { set ::__verify 2; set _ 101 } } ? {C exists bar2} 1 ? {set ::__verify} 2 ? {C bar2} 101 ? {set ::__verify} 2 ? {C bar2 202} 202 # c. valuechangedcmd C slots { Attribute bar3 \ -per-object true \ -valuechangedcmd { set ::__verify 3; $obj set $var 909 } } ? {C exists bar3} 0 ? {set ::__verify} 2 ? {C bar3 101} 909 ? {set ::__verify} 3 ? {C bar3 102} 909 C destroy; c destroy #exit #puts [Person array get __defaults] #puts [Person serialize] #puts [Serializer all] #eval [Serializer all] ? {p2 salary} 1009 ? {catch {p2 append salary b}} 1 ? {p2 salary} 1009 #p2 projects add ::o1 p1 set x 0 t {p1 set x} 0 "get instvar value via set" t {p1 set x 1} 1 "set instvar value via set" Object o1 proc f {x} {return $x} o1 forward myf -earlybinding f ? {o1 myf abc} abc rename f "" proc f {x} {return 11} ? {o1 myf abc} 11 Object o2 o2 proc f {x} {expr {$x*2}} o1 forward myf -earlybinding o2 f ? {o1 myf 100} 200 o1 set x 42 o1 forward x -earlybinding ::xotcl::setinstvar %self %proc ? [list o1 x] 42 ? [list o1 x 41] 41 t {o1 x} 41 "get parametercmd via forward (earlybinding)" t {o1 x 41} 41 "set parametercmd via forward (earlybinding)" #obj forward Mixin -default {getter setter} mixin %1 %self o1 forward z -default {getter setter} %self o1 forward myfset -objscope set o1 myfset y 102 ? {o1 myfset y} 102 t {o1 myfset y} 102 "get instvar value via forward" t {o1 myfset y 122} 122 "set instvar value via forward" o1 forward myfdset -earlybinding -objscope set o1 myfdset y 103 ? {o1 myfdset y} 103 t {o1 myfdset y} 103 "get instvar value via forward -earlybinding" t {o1 myfdset y 123} 123 "set instvar value via forward -earlybinding" ::xotcl::alias o1 myset -objscope ::set o1 myset x 101 ? {o1 myset x} 101 t {o1 myset x} 101 "get instvar value via set alias" t {o1 myset x 123} 123 "set instvar value via set alias" Class Fred -slots { Attribute create a -initcmd { set _ 4 } } ? {Fred x} ::x ? {x a 4} 4 x move y ? {y a} 4 exit # t {p1 age} 0 "slot read" # Class P -parameter {age {s -setter sets}} # P instproc sets {var value} { # my set $var $value # } # P create p2 -age 345 -s 567 # t {p2 age} "parametercmd read" # t {::xotcl::setinstvar p2 age} "via setinstvar" # t {p2 s} "parameter read with setter" ::xotcl::Attribute create Project::slot::fullbudget \ -initcmd {puts stderr init-on-[self];my set __x 100} \ -valuechangedcmd { puts "budget is now [my set fullbudget]" my set __x [my set fullbudget] } ::xotcl::Attribute create Project::slot::currentbudget -valuecmd {puts stderr change-on-[self];my incr __x -1} Person p2 -name gustaf Person p3 -name frido Article a1 -title "My life as a saint" -date "1.1.2006" publishes new -written_by p1 -has_published a1 set p [Project new -name icamp -manager p2 -member add p1 -member add p3] $p member add X end puts [$p member] ? [list $p fullbudget] 100 ? [list $p fullbudget] 100 ? [list $p currentbudget] 99 ? [list $p currentbudget] 98 ? [list $p fullbudget 200] 200 ? [list $p currentbudget] 199 exit foreach o [Object allinstances] { if {[$o isclass]} continue if {[$o istype Slot]} continue if {$o eq "::xotcl::relmgr"} continue set string "$o\n" foreach v [$o info vars] { append string " $v = [$o set $v]\n" } puts $string } puts stderr DONE-[p1 name]-[p1 age] p3 age 77 exit puts [XoXML asXML] puts ==== foreach n [XoXML selectNodes {//object[age > 1]}] {puts [$n asXML]} exit ./xotcl-1.6.8/tests/._speedtest.xotcl000644 000765 000024 00000000430 12161600406 020243 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/speedtest.xotcl000644 000765 000024 00000035766 12161600406 020052 0ustar00neumannstaff000000 000000 #memory trace on # $Id: speedtest.xotcl,v 1.10 2007/08/14 16:38:27 neumann Exp $ package require XOTcl 1 namespace import -force xotcl::* #set auto_path [concat [file dirname [info script]]/../library/lib $auto_path] set auto_path [concat [file dirname [info script]]/../library/lib/ $auto_path] puts stderr "I AM [pwd] -- [file dirname [info script]]/.. -- auto=$auto_path" package require xotcl::test 1 @ @File {description { Regression and speed test for various ways to achieve a similar behaviour. } } Class M1; Class M2 Class C -parameter {{p 99} {q 98} r} C instproc f args {next} C instproc init args { my instvar n v for {set i 1} {$i<1000} {incr i} {set n($i) 1} for {set i 1} {$i<1000} {incr i} {Object [self]::$i} set v 1 } C instproc mixinappend m { my mixin [concat [my info mixin] $m] my info mixin } C instproc ma m { set mix [my info mixin] my mixin [lappend mix $m] my info mixin } C instproc existsViaInstvar {} { my instvar v info exists v } C instproc existsViaMyInstvar {} { my instvar v info exists v } C instproc existsViaExistsMethod {} { my exists v } C instproc existsViaMyExistsMethod {} { my exists v } C instproc notExistsViaInstvar {} { my instvar xxx info exists xxx } C instproc notExistsViaExistsMethod {} { my exists xxx } C instproc existsAndReturnValue1 {} { if {[my exists v]} { my set v } } C instproc existsAndReturnValue3 {} { if {[my exists v]} { set x [my set v] } } C instproc setViaInstvar x { my instvar v set v $x } C instproc setViaSetMethod x { my set v $x } C instproc setViaParameter x { my r $x } C instproc testAndSetViaInstvar x { my instvar v if {[info exists v]} {set v $x} } C instproc testAndSetViaSetMethod x { if {[my info vars v] ne ""} {my set v $x} } C instproc readViaInstvar {} { my instvar p set p } C instproc readViaSetMethod {} { my set p } C instproc readViaSetMethodNoSelf {} { ::c set p } C instproc readViaParameter {} { my p } C instproc readTwiceViaInstvar {} { my instvar p set p set p } C instproc readTwiceViaSetMethod {} { my set p my set p } C instproc readTwiceViaSetMethodNoSelf {} { ::c set p ::c set p } C instproc readTwiceViaParameter {} { my p my p } C instproc readTwovarsViaInstvar {} { my instvar p q set p set q } C instproc readTwovarsViaSetMethod {} { my set p my set q } C instproc readTwovarsViaSetMethodNoSelf {} { ::c set p ::c set q } C instproc readTwovarsViaParameter {} { my p my q } C instproc instvarAlias {} { my instvar {a b} set b 1 my exists a } C instproc explicitReturn {} { return [set i 1] } C instproc implicitReturn {} { set i 1 } C instproc explicitReturnFromVar {} { set i 1 return $i } C instproc implicitReturnFromVar {} { set i 1 set i } C instproc childNodeNamespace {} { Object [self]::13 } C instproc childNodeNamespaceCreate {} { Object create [self]::13 } C instproc createVolatileRc {} { Object new -volatile return 2 } C c Class D -superclass C D instproc init args {} D d Test new -cmd {llength [c info children]} -expected 999 Test new -cmd {llength [Object info instances]} -expected 1006 Test new -cmd {d istype D} -expected 1 Test new -cmd {c setViaInstvar 100} -expected 100 Test new -cmd {c setViaSetMethod 100} -expected 100 Test new -cmd {c setViaParameter 100} -expected 100 Test new -cmd {c existsViaInstvar} Test new -cmd {c existsViaMyInstvar} Test new -cmd {c existsViaExistsMethod} Test new -cmd {c existsViaMyExistsMethod} Test new -cmd {c exists v} Test new -cmd {c notExistsViaInstvar} -expected 0 Test new -cmd {c notExistsViaExistsMethod} -expected 0 Test new -cmd {c exists xxx} -expected 0 Test new -cmd {c existsAndReturnValue1} -expected 100 Test new -cmd {c existsAndReturnValue3} -expected 100 Test new -cmd {c testAndSetViaInstvar 100} -expected 100 Test new -cmd {c testAndSetViaSetMethod 100} -expected 100 Test new -cmd {c readViaInstvar} -expected 99 Test new -cmd {c readViaSetMethod} -expected 99 Test new -cmd {c readViaParameter} -expected 99 Test new -cmd {c readViaSetMethodNoSelf} -expected 99 Test new -cmd {c readTwiceViaInstvar} -expected 99 Test new -cmd {c readTwiceViaSetMethod} -expected 99 Test new -cmd {c readTwiceViaParameter} -expected 99 Test new -cmd {c readTwiceViaSetMethodNoSelf} -expected 99 Test new -cmd {c readTwovarsViaInstvar} -expected 98 Test new -cmd {c readTwovarsViaSetMethod} -expected 98 Test new -cmd {c readTwovarsViaParameter} -expected 98 Test new -cmd {c readTwovarsViaSetMethodNoSelf} -expected 98 Test new -cmd {c instvarAlias} Test new -cmd {c incr v} -post {c set v 1} -expected 101 Test new -cmd {c unset v; set r [c exists v]; c set v 1; set r} -expected 0 Test new -cmd {c explicitReturn} Test new -cmd {c implicitReturn} Test new -cmd {c explicitReturnFromVar} Test new -cmd {c implicitReturnFromVar} Test new -cmd {c childNodeNamespace} -expected ::c::13 Test new -cmd {c childNodeNamespaceCreate} -expected ::c::13 Test new -cmd {c createVolatileRc} -expected 2 Test new -count 1 -cmd {llength [Object info instances]} -expected 1006 Test new -cmd {Object new -volatile} -expected ::xotcl::__\#F9 -count 2000 \ -post {foreach o [Object info instances ::xotcl::__*] {$o destroy}} Test new -cmd {Object new} -expected ::xotcl::__\#lQ -count 2000 \ -post {foreach o [Object info instances ::xotcl::__*] {$o destroy}} Test new -cmd {Object new -childof o} -expected ::o::__\#0Hh \ -pre {Object o} -post {o destroy} # should be still the same number as above Test new -count 1 -cmd {llength [Object info instances]} -expected 1006 Test new -count 1000 -pre {::set ::count 0} \ -cmd {Object create [incr ::count]} \ -expected ::1 \ -post {::unset ::count} Test new -count 1000 -pre {::set ::count 0} \ -cmd {[incr ::count] destroy} \ -post {::unset ::count} \ -expected "" Test new -cmd {Object create x} -expected ::x Test new -cmd {Object create x -set a -1 -set b ,, -set c a--} \ -expected ::x Test new -cmd {expr {[c array names n 500] ne ""}} Test new -cmd {info exists c::n(500)} Test new -cmd {c exists n(500)} Test new -cmd {llength [c info children]} -expected 999 Test new -cmd {c info children ::c::500} -expected ::c::500 Test new -cmd {llength [Object info instances]} -expected 1007 Test new -cmd {Object info instances ::c::500*} -expected ::c::500 Test new -cmd {Object info instances ::c::500} -expected ::c::500 Test new -cmd {Object info instances ::c::5000} -expected "" Test new -count 100 -pre {set ::c::l ""} \ -cmd {lappend ::c::l 1} \ -post {c unset l} Test new \ -count 100 \ -cmd {c mixinappend M1} \ -expected ::M1 \ -post {c mixin ""} Test new \ -count 100 \ -cmd {c ma M1} \ -expected ::M1 \ -post {c mixin ""} Test new \ -count 100 \ -cmd {c mixin add M1} \ -expected "" \ -post {c mixin ""} Test new \ -count 100 \ -cmd {c mixinappend M1; c mixinappend M2} \ -expected {::M1 ::M2} \ -post {c mixin ""} Test new \ -count 100 \ -cmd {c ma M1; c ma M2} \ -expected {::M1 ::M2} \ -post {c mixin ""} Test new \ -count 100 \ -pre {Class D; Class E; Object o -mixin {D E}} \ -cmd {o info mixin D} \ -expected {::D} \ -post {foreach o {D E o} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Object o -mixin {D E}} \ -cmd {o info mixin E} \ -expected {::E} \ -post {foreach o {D E o} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Object o -mixin {D E}} \ -cmd {o info mixin ::E*} \ -expected {::E} \ -post {foreach o {D E o} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class E1; Object o -mixin {D E E1}} \ -cmd {o info mixin ::E*} \ -expected {::E ::E1} \ -post {foreach o {D E E1 o} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class X -instmixin {D E}} \ -cmd {X info instmixin D} \ -expected {::D} \ -post {foreach o {D E X} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class X -instmixin {D E}} \ -cmd {X info instmixin E} \ -expected {::E} \ -post {foreach o {D E X} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class E1; Class X -instmixin {D E E1}} \ -cmd {X info instmixin ::E*} \ -expected {::E ::E1} \ -post {foreach o {D E E1 X} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class X -instmixin {D E}} \ -cmd {X info instmixin ::E*} \ -expected {::E} \ -post {foreach o {D E X} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class X} \ -cmd {X instmixin {D E}; X instmixin delete ::E; X info instmixin} \ -expected {::D} \ -post {foreach o {D E X} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class X} \ -cmd {X instmixin {D E}; X instmixin delete E; X info instmixin} \ -expected {::D} \ -post {foreach o {D E X} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class E1; Class X} \ -cmd {X instmixin {D E E1}; catch {X instmixin delete ::E*}; X info instmixin} \ -expected {::D} \ -post {foreach o {D E E1 X} {$o destroy}} Test new \ -count 100 \ -pre {Class D; Class E; Class E1; Class X} \ -cmd {X instmixin {D E E1}; catch {X instmixin delete E*}; X info instmixin} \ -expected {::D} \ -post {foreach o {D E E1 X} {$o destroy}} Test new \ -cmd {C instfilter f; C info instfilter} \ -expected f \ -post {C instfilter ""} Test new -pre {set s \#hallo} -cmd {string match "\#*" $s} Test new -pre {set s \#hallo} -cmd {regexp {^\#} $s} Test new -pre {set s \#hallo} -cmd {expr {[string first "\#" $s] == 0}} Test new -pre {set s \#hallo} -cmd {expr {[string range $s 0 0] == "\#"}} Test new -pre {set s \#hallo} -cmd {regexp {^\#.*a} $s} Test new -pre {set s \#hallo} -cmd {regexp {^\#.*a.*o} $s} Test new -pre {set s \#hallo} -cmd {regexp {^\#.*a(.*)o} $s} Test new -pre {set s \#hallo} -cmd {regexp {^\#.*a(.*)o} $s _} Test new -pre {set s \#hallo} -cmd {regexp {^\#.*a(.*)o} $s _ out} Test new -msg {call proc of subobject directly} \ -pre {C c2; C c2::o; c2::o proc f a {incr a}} \ -cmd {c2::o::f 10} -expected 11 -count 5000 \ -post {c2 destroy} Test new -msg {call proc of subobject via dispatch} \ -pre {C c2; C c2::o; c2::o proc f a {incr a}} \ -cmd {c2::o f 10} -expected 11 -count 5000 \ -post {c2 destroy} Test new -msg {call proc of object and subobject via dispatch} \ -pre {C c2; C c2::o; c2::o proc f a {incr a}} \ -cmd {c2 o f 10} -expected 11 -count 5000 \ -post {c2 destroy} Test new -msg {dispatch subobject directy via [self]} \ -pre {C c2; C c2::o; c2::o proc f a {incr a}; c2 proc t a {[self]::o f $a}} \ -cmd {c2 t 12} -expected 13 -count 5000 \ -post {c2 destroy} Test new -msg {dispatch subobject via my} \ -pre {C c2; C c2::o; c2::o proc f a {incr a}; c2 proc t a {my o f $a}} \ -cmd {c2 t 12} -expected 13 -count 5000 \ -post {c2 destroy} ###### insttclcmd tests set cnt 10000 #Test new -msg {call insttclcmd (append) and check created variable} \ -pre {Object o} \ -cmd {o append X 1; o exists X} -expected 1 \ -post {o destroy} #Test new -msg {call tclcmd (regexep) and check created variable} \ -pre {Object o; o tclcmd regexp} \ -cmd {o regexp (a) a _ x; o exists x} -expected 1 -count $cnt \ -post {o destroy} Test new -msg {call forwarder for (append) and check created variable} \ -pre {Object o; o forward append -objscope} \ -cmd {o append X 1; o exists X} -expected 1 \ -post {o destroy} Test new -msg {call forwarder (regexep) and check created variable} \ -pre {Object o; o forward regexp -objscope} \ -cmd {o regexp (a) a _ x; o exists x} -expected 1 -count $cnt \ -post {o destroy} Test new -msg {call forwarder to another obj} \ -pre {Object o; Object t; o forward set t set; t set x 100} \ -cmd {o set x} -expected 100 -count $cnt \ -post {o destroy} set cnt 100000 Test new -msg {call handcoded incr} \ -pre {Class C; C create o; o set x 1} \ -cmd {o incr x 77} -expected 78 -count $cnt \ -post {o destroy} Test new -msg {call incr via instforward} \ -pre {Class C; C instforward ::incr -objscope; C create o; o set x 1} \ -cmd {o incr x 77} -expected 78 -count $cnt \ -post {o destroy} Test new -msg {call incr via forward} \ -pre {Class C; C create o; o forward ::incr -objscope; o set x 1} \ -cmd {o incr x 77} -expected 78 -count $cnt \ -post {o destroy} set cnt 10000 Test new -msg {call obj with namespace via forward} \ -pre {Object n; Object n::x; Object o -forward ::n::x} \ -cmd {o x self} -expected ::n::x -count $cnt \ -post {o destroy} Test new -msg {call obj with namespace via instforward} \ -pre {Object n; Object n::x; Class C; C create o; C instforward ::n::x} \ -cmd {o x self} -expected ::n::x -count $cnt \ -post {o destroy} Test new -msg {call obj with namespace via instforward and mixinclass} \ -pre {Object n; Object n::x; Class M -instforward ::n::x; Class C -instmixin M; C create o } \ -cmd {o x self} -expected ::n::x -count $cnt \ -post {o destroy} Test new -msg {call obj with namespace via instforward and next from proc} \ -pre { Object n; Object n::x; Class C -instforward ::n::x; C create o -proc x args {next} } \ -cmd {o x self} -expected ::n::x -count $cnt \ -post {o destroy} Test new -msg {call obj with namespace via instforward and next from instproc} \ -pre { Object n; Object n::x; Class C -instforward ::n::x; Class D -superclass C -instproc x args {next}; D create o } \ -cmd {o x self} -expected ::n::x -count $cnt \ -post {o destroy} Test new -msg {call obj with namespace via mixin and instforward and next} \ -pre {Object n; Object n::x; Class M -instforward ::n::x; Class N -superclass M -instproc x args {next}; Class C -instmixin N; C create o} \ -cmd {o x self} -expected ::n::x -count $cnt \ -post {o destroy} Test new -msg {return -code break} \ -pre {Class A -instproc br {} {return -code break}; A create a1} \ -cmd {catch {a1 br}} -expected 3 -count 2 \ -post {A destroy; a1 destroy} Test new -msg {test multiple dashed args} \ -pre {::Class create Person} \ -cmd {Person create p0 [list -set a -a1] [list -set b "-b 1 -y 2"]} \ -expected ::p0 \ -post {Person destroy} Test new -msg {test multiple dashed args} \ -pre {::Class create Person} \ -cmd {Person create p1 Person create p1 -proc foo args {return 1} [list -set a -a1] [list -set b "-b 1 -y 2"]} \ -expected ::p1 \ -post {Person destroy} Test new -msg {test multiple dashed args} \ -pre {::Class create Person -parameter {a b}} \ -cmd {Person create p2 {-proc foo args {return 1}} {-set -a -t1} {-set b "-b 1 -y 2"}} \ -expected ::p2 \ -post {Person destroy} Test new -msg {test multiple dashed args} \ -pre {::Class create Person -parameter {a b}} \ -cmd {Person create p3 -proc foo args {return 1} {-set -a -t1} {-set b "-b 1 -y 2"}} \ -expected ::p3 \ -post {Person destroy} Test run; exit ./xotcl-1.6.8/tests/._testo.xotcl000644 000765 000024 00000000430 12161600406 017401 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/testo.xotcl000644 000765 000024 00000026675 12161600406 017207 0ustar00neumannstaff000000 000000 # $Id: testo.xotcl,v 1.9 2007/08/14 16:38:27 neumann Exp $ # # Copyright 1993 Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # package require XOTcl 1 namespace import -force xotcl::* @ @File {description { This is a class which provides regression test objects for the OTcl derived features of the XOTcl - Language. This script is based upon the test.tcl script of the OTcl distribution and adopted for XOTcl. } } # # a meta-class for test objects, and a class for test suites # Class TestSuite @ Class TestSuite Class TestClass -superclass Class @ Class TestClass { description { A meta-class for test objects. } } # # check basic argument dispatch and unknown # TestSuite objectdispatch objectdispatch proc run {{n 50}} { Object adispatch adispatch proc unknown {m args} {eval list [list $m] $args} adispatch proc cycle {l n args} { if {$l>=$n} then {return ok} set i [llength $args] foreach a $args { if {$a != $i} then { error "wrong order in arguments: $l $n $args" } incr i -1 } incr l set ukn [eval [list [self]] $args] if {$ukn != $args} then { error "wrong order in unknown: $ukns" } eval [list [self]] [list [self proc]] [list $l] [list $n] [list $l] $args } if {[catch {adispatch cycle 1 $n 1} msg]} then { error "FAILED [self]: cycle: $msg" } return "PASSED [self]" } # # examples from the workshop paper # TestSuite paperexamples paperexamples proc example1 {} { Object astack astack set things {} astack proc put {thing} { my instvar things set things [concat [list $thing] $things] return $thing } astack proc get {} { my instvar things set top [lindex $things 0] set things [lrange $things 1 end] return $top } astack put bagel astack get astack destroy } paperexamples proc example2 {} { Class Safety Safety instproc init {} { next my set count 0 } Safety instproc put {thing} { my instvar count incr count next } Safety instproc get {} { my instvar count if {$count == 0} then { return {empty!} } incr count -1 next } Class Stack Stack instproc init {} { next my set things {} } Stack instproc put {thing} { my instvar things set things [concat [list $thing] $things] return $thing } Stack instproc get {} { my instvar things set top [lindex $things 0] set things [lrange $things 1 end] return $top } Class SafeStack -superclass {Safety Stack} SafeStack s s put bagel s get s get s destroy SafeStack destroy Stack destroy Safety destroy } paperexamples proc run {} { set msg {} if {[catch {my example1; my example2} msg] == "0"} then { return "PASSED [self]" } else { error "FAILED [self]: $msg" } } # # create a graph of classes # TestSuite classcreate classcreate proc factorgraph {{n 3600}} { TestClass $n for {set i [expr {$n/2}]} {$i>1} {incr i -1} { if {($n % $i) == 0} then { # # factors become subclasses, direct or indirect # if {[TestClass info instances $i] eq ""} then { my factorgraph $i $i superclass $n } elseif {[$i info superclass $n] == 0} then { $i superclass [concat [$i info superclass] $n] } } } } classcreate proc run {} { set msg {} if {[catch {my factorgraph} msg] == "0"} then { return "PASSED [self]" } else { error "FAILED [self]: $msg" } } # # lookup superclasses and combine inherited methods # TestSuite inheritance inheritance proc meshes {s l} { set p -1 foreach j $s { set n [lsearch -exact $l $j] if {$n == -1} then { error "FAILED [self] - missing superclass" } if {$n <= $p} then { error "FAILED [self] - misordered heritage: $s : $l" } set p $n } } inheritance proc superclass {} { foreach i [TestClass info instances] { set s [$i info superclass] set h [$i info heritage] # # superclasses should mesh with heritage # my meshes $s $h } } inheritance proc combination {} { foreach i [lsort [TestClass info instances]] { # # combination should mesh with heritage # $i anumber set obj [lrange [anumber combineforobj] 1 end] set h [$i info heritage] my meshes $obj $h anumber destroy if {[$i info procs combineforclass] ne ""} then { set cls [lrange [$i combineforclass] 1 end] my meshes $cls $h } } } inheritance proc run {} { # # add combine methods to "random" half of the graph # set t [TestClass info instances] for {set i 0} {$i < [llength $t]} {incr i 2} { set o [lindex $t $i] $o instproc combineforobj {} { return [concat [list [self class]] [next]] } $o proc combineforclass {} { return [concat [list [self class]] [next]] } } # # and to Object as a fallback # Object instproc combineforobj {} { return [concat [list [self class]] [next]] } Object proc combineforclass {} { return [concat [list [self class]] [next]] } my superclass my combination return "PASSED [self]" } # # destroy graph of classes # TestSuite classdestroy classdestroy proc run {} { # # remove half of the graph at a time # TestClass instproc destroy {} { global TCdestroy set TCdestroy [self] next } while {[TestClass info instances] ne ""} { set t [TestClass info instances] for {set i 0} {$i < [llength $t]} {incr i} { set o [lindex $t $i] # # quarter dies directly, quarter indirectly, quarter renamed # if {($i % 2) == 0} then { global TCdestroy set sb [$o info subclass] if {[info tclversion] >= 7.4 && ($i % 4) == 0} then { $o move "" } else { $o destroy } if {[catch {set TCdestroy}] || $TCdestroy != $o} then { error "FAILED [self] - destroy instproc not run for $o" } if {[info commands $o] ne ""} then { error "FAILED [self] - $o not removed from interpreter" } unset TCdestroy # # but everyone must still have a superclass # foreach j $sb { if {[$j info superclass] eq ""} then { $j superclass Object } } } elseif {[info tclversion] >= 7.4 && ($i % 3) == 0} then { $o move $o.$i } } inheritance superclass inheritance combination } return "PASSED [self]" } TestSuite objectinits objectinits proc prepare {n} { # # head of a chain of classes that do add inits # TestClass 0 0 instproc init {args} { next my set order {} } # # and the rest # for {set i 1} {$i < $n} {incr i} { TestClass $i -superclass [expr {$i-1}] # # record the reverse order of inits # $i instproc init {args} { eval next $args my instvar order lappend order [namespace tail [self class]] } # # add instproc for init options # $i instproc m$i.set {val} { my instvar [namespace tail [self class]] set [namespace tail [self class]] [self proc].$val } } } objectinits proc run {{n 15}} { my prepare $n set il {} for {set i 1} {$i < $n} {incr i} { lappend il $i set al {} set args {} for {set j $i} {$j > 0} {incr j -1} { lappend al $j lappend args -m$j.set $j # # create obj of increasing class with increasing options # if {[catch {eval $i m$i.$j $args} msg] != 0} then { error "FAILED [self] - $msg" } if {[m$i.$j set order] != $il} then { error "FAILED [self] - inited order was wrong" } set vl [lsort -decreasing -integer [m$i.$j info vars {[0-9]*}]] if {$vl != $al} then { error "FAILED [self] - wrong instvar names: $vl : $al" } foreach k $vl { if {[m$i.$j set $k] != "m$k.set.$k"} then { error "FAILED [self] - wrong instvar values" } } } } return "PASSED [self]" } TestSuite objectvariables objectvariables proc run {{n 100}} { TestClass Variables Variables avar foreach obj {avar Variables TestClass xotcl::Class xotcl::Object} { # # set up some variables # $obj set scalar 0 $obj set array() {} $obj unset array() $obj set unset.$n {} # # mess with them recursively # $obj proc recurse {n} { my instvar scalar array incr scalar set array($n) $n my instvar unset.$n unset unset.$n incr n -1 my instvar unset.$n set unset.$n [array names array] if {$n > 0} then { my recurse $n } } $obj recurse $n # # check the result and clean up # if {[$obj set scalar] != $n} then { error "FAILED [self] - scalar" } $obj unset scalar for {set i $n} {$i > 0} {incr i -1} { if {[$obj set array($i)] != $i} then { error "FAILED [self] - array" } } $obj unset array if {[$obj info vars "unset.0"] eq ""} then { error "FAILED [self] - unset: [$obj info vars]" } } # # trace variables # Variables avar2 avar2 proc trace {var ops} { my instvar $var ::trace variable $var $ops "avar2 traceproc" } avar2 proc traceproc {maj min op} { set majTmp [namespace tail "$maj"] global trail; lappend trail [list $majTmp $min $op] } avar2 proc killSelf {} { my destroy } global guide trail set trail {} set guide {} avar2 trace array wu for {set i 0} {$i < $n} {incr i} { avar2 trace scalar$i wu avar2 set scalar$i $i lappend guide [list scalar$i {} w] avar2 set array($i) [avar2 set scalar$i] lappend guide [list array $i w] } if {$guide != $trail} then { error "FAILED [self] - trace: expected $guide, got $trail" } # # destroy must trigger unset traces # set trail {} set guide {} lappend guide [list array {} u] for {set i 0} {$i < $n} {incr i} { lappend guide [list scalar$i {} u] } avar2 killSelf if {[lsort $guide] != [lsort $trail]} then { error "FAILED [self] - trace: expected $guide, got $trail" } Variables destroy return "PASSED [self]" } # # c api, if compiled with -DTESTCAPI # TestSuite capi capi proc run {{n 50}} { set start [dawnoftime read] for {set i 0} {$i < $n} {incr i} { Timer atime$i if {$i % 3} {atime$i stop} if {$i % 7} {atime$i read} if {$i % 2} {atime$i start} if {$i % 5} {atime$i stop} } set end [dawnoftime read] if {$end < $start} { error "FAILED [self]: timer doesn't work" } foreach i [Timer info instances] {$i destroy} Timer destroy return "PASSED [self]" } TestSuite proc run {} { # # run individual tests in needed order # puts [objectdispatch run] puts [paperexamples run] puts [classcreate run] puts [inheritance run] puts [classdestroy run] puts [objectinits run] puts [objectvariables run] if {[info commands Timer] ne ""} then { puts [capi run] } # puts [autoload run] } puts [time {TestSuite run} 1] #exit # Local Variables: # mode: tcl # tcl-indent-level: 2 # End: ./xotcl-1.6.8/tests/._testx.xotcl000644 000765 000024 00000000430 12161600406 017412 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/testx.xotcl000644 000765 000024 00000371506 12161600406 017214 0ustar00neumannstaff000000 000000 # -*- Tcl -*- package require XOTcl 1 namespace import -force xotcl::* proc ::errorCheck {got expected msg} { if {$got != $expected} { puts stderr "[self] FAILED: $msg\nGot: $got\nExpected: $expected" foreach g $got e $expected { set result [expr {$g == $e}] if {[string length $g]>60} { puts "$result g='$g'\n e='$e'" } else { puts "$result g='$g' e='$e'" } } exit -1 } } proc ::cutSpaces {string} { regsub -all " " $string "" result regsub -all "\n" $result " " result return $result } Class TestX \ -instmixin [Class TestXM -instproc run args {next; puts "[self] PASSED"}] @ @File {description { This is a file which provides a regression test for the features of the XOTcl - Language. } } @ Class TestX @ TestX nestingClasses { description {Regression test object testing the class nesting feature.} } TestX nestingClasses -proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { Class x($i) Class x($i)::y ::errorCheck [x($i) info commands y] "y" " -- creating Nested Class " Class x($i)::z Class x($i)::z::t Class x($i)::t ::errorCheck [x($i) info classchildren] "::x($i)::t ::x($i)::y ::x($i)::z" \ "info classchildren" ::errorCheck [x($i)::z info classparent] "::x($i)" \ "info classparent" ::errorCheck [x($i) info commands t] "t" \ "-- MakeClass " x($i) a x($i)::z a x($i)::z::t a x($i)::z::t move x($i)::z::rt x($i)::z::rt a ::errorCheck [x($i)::z info commands rt] "rt" \ "renaming leaf " x($i)::z move x($i)::rz ::errorCheck [x($i) info commands rz] "rz" \ "renaming node (node itself)" ::errorCheck [x($i)::rz info commands rt] "rt" \ "renaming node (leaf in node)" ::errorCheck [x($i)::rz info classchildren] "::x($i)::rz::rt" \ "info classchildren (2)" ::errorCheck [x($i)::rz::rt info classparent] "::x($i)::rz" \ "info classparent (2)" x($i) move rx ::errorCheck [rx info commands rz] "rz" \ "renaming root " ::errorCheck [info commands rx] "rx" \ "renaming root " rx destroy } } @ TestX nestingObjects { description {Regression test object testing the object nesting feature.} } TestX nestingObjects -proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { Class C($i) C($i) instproc testinstproc {} { return } C($i) o o proc testproc {} { return } o testproc; o testinstproc C($i) o::y ::errorCheck [o info commands y] y "creating Nested Object " C($i) o::z C($i) o::z::t C($i) o::t ::errorCheck [o info children] "::o::t ::o::y ::o::z" "info children" ::errorCheck [o::t info parent] "::o" "info parent" ::errorCheck [o info commands t] t "MakeObject" o::z::t move o::z::rt ::errorCheck [o::z info commands rt] rt "renaming leaf" o::z move o::rz ::errorCheck [o::rz info commands rt] rt "renaming node" ::errorCheck [o info commands rz] rz "renaming node" o move rx ::errorCheck [rx info commands rz] rz "renaming root " ::errorCheck [info commands rx] rx "renaming root" rx destroy C($i) destroy Class A A instproc x {a1 args} { my set var $a1 } A a A a::n -x "1 2 3" ::errorCheck [::a::n set var] "1 2 3" "arg passing - init dash" } } @ TestX assertions { description {Regression test object testing the assertions.} } TestX assertions -proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { Class C($i) C($i) invar { {$a > 2} {$c < 3} {$d > 5} {#a} {#b} } C($i) instinvar { {$a > 2} {$c < 3} {$d > 5} {#a} {#b} } ::errorCheck [C($i) info invar] {{$a > 2} {$c < 3} {$d > 5} {#a} {#b}} \ "Class invar " ::errorCheck [C($i) info invar] {{$a > 2} {$c < 3} {$d > 5} {#a} {#b}} \ "Class instinvar " Object b($i) b($i) invar { {$a > 2} {$c < 3} {$d > 5} {#a} {#b} } ::errorCheck [C($i) info invar] {{$a > 2} {$c < 3} {$d > 5} {#a} {#b}} \ "Object invar " b($i) proc p {a b c} { return p } {pre1 pre2 pre3} {post1 post2 post3} ::errorCheck [b($i) info pre p] {{pre1} {pre2} {pre3}} \ "Obj proc pre assertion " ::errorCheck [b($i) info post p] {{post1} {post2} {post3}} \ "Obj proc post assertion " C($i) instproc p {a b c} { return p } {} {post1 post2 post3} ::errorCheck [C($i) info instpre p] "" \ "CL proc pre assertion " ::errorCheck [C($i) info instpost p] {{post1} {post2} {post3}} \ "CL proc post assertion " C(0) set a 3; C(0) set c 2; C(0) set d 7; C(0) set f 50; C(0) check all C(0) proc checkit {} { C(0) instvar a c d f ::errorCheck [my info check] {invar instinvar pre post} \ "check options != all" # turn obj-invar off C(0) check {pre post instinvar} C(0) set c 10 ::errorCheck [my info check] {instinvar pre post} \ "check options != instinvar pre post" } {{$f > 10}} {{$f < 100}} C(0) checkit } for {set i 0} {$i < $n} {incr i} { b($i) destroy C($i) destroy } Object b b proc p {a b c} { return p } {pre1 pre2 pre3} {post1 post2 post3} ::rename b a ::errorCheck [a info pre p] {{pre1} {pre2} {pre3}} \ "Obj proc pre assertion " ::errorCheck [a info post p] {{post1} {post2} {post3}} \ "Obj proc post assertion " Class Sensor -parameter {{value 1}} Sensor instinvar { {[regexp {^[0-9]$} [my value]] == 1} } Sensor s s check all Sensor instproc x {} { s value } { {[regexp {^[0-9]$} [my value]] == 1} } {} s x s value # inheritance Class A -parameter {{x 1} {y 1}} A instinvar {{$x == 1}} A instproc xTo2 args { my set x 2 } A instproc yTo2 args { my set y 2 } {} {{$y == 1}} A a -check all if {![catch {a xTo2} err]} { set err "ok" } else { a check {} a set x 1 a check all } ::errorCheck $err {Assertion failed check: {$x == 1} in proc 'xTo2'} \ "inheritance a xTo2" if {![catch {a yTo2} err]} { set err "ok" } ::errorCheck $err {Assertion failed check: {$y == 1} in proc 'yTo2'} \ "inheritance a yTo2" Class B -superclass A B b -check all if {![catch {b xTo2} err]} { set err "ok" } else { b check {} b set x 1 b check all } ::errorCheck $err {Assertion failed check: {$x == 1} in proc 'xTo2'} \ "inheritance b xTo2" if {![catch {b yTo2} err]} { set err "ok" } ::errorCheck $err {Assertion failed check: {$y == 1} in proc 'yTo2'} \ "inheritance b yTo2" } @ TestX filterAddRemove { description {Regression test object testing adding/removing of filters.} } TestX filterAddRemove -proc run {{n 20}} { set ::filterCount 0 for {set i 0} {$i < $n} {incr i} { Class SA($i) Class SB($i) Class SC($i) -superclass [list SB($i) SA($i)] SA($i) instproc fa args { incr ::filterCount my set x 150 return "[next]-[self class]::[self proc]" } SA($i) instproc f2 args { incr ::filterCount my set x 150 return "[next]-[self class]::[self proc]" } SB($i) instproc f2 args { incr ::filterCount my set x 150 return "[next]-[self class]::[self proc]" } SB($i) instproc fb args { incr ::filterCount my set x 150 return "[next]-[self class]::[self proc]" } SC($i) instproc fc args { incr ::filterCount my set x 150 return "[next]-[self class]::[self proc]" } SC($i) instfilter fc SB($i) instfilter {fb f2} SA($i) instfilter {fa f2} Class T T proc s {} { return } Class Filtered${i} -superclass SC($i) Filtered${i} instproc testfilter args { incr ::filterCount T s return "[next]-[self class]::[self proc]" } Filtered${i} instfilter testfilter Filtered${i} instproc a args { return "in a" } Filtered${i} f${i} set erg [f${i} a] ::errorCheck $erg \ "in a-::SA(${i})::f2-::SA(${i})::fa-::SB(${i})::f2-::SB(${i})::fb-::SC(${i})::fc-::Filtered${i}::testfilter" \ "Filter Test - add" SC($i) instfilter {} SB($i) instfilter fb SA($i) instfilter {} set erg [f${i} a] ::errorCheck $erg "in a-::SB(${i})::fb-::Filtered${i}::testfilter" \ "Filter Test - remove" f${i} proc procFilter args { return "[next]-[self class]::[self proc]" } f${i} filter {fa f2 procFilter} set erg [f${i} a] ::errorCheck $erg "in a-::SB(${i})::fb-::Filtered${i}::testfilter-::procFilter-::SB(${i})::f2-::SA(${i})::fa" \ "Obj Filter Test call three filter + instfilter" ::errorCheck "[f${i} info filter]-[SB($i) info instfilter]-[SC($i) info instfilter]" \ "fa f2 procFilter-::SB(${i})::fb-::Filtered${i}::testfilter-::procFilter-::SB(${i})::f2-::SA(${i})::fa-fb-"\ "filter infos" ::errorCheck [f${i} filtersearch fa]-[f${i} filtersearch fb]-[f${i} filtersearch procFilter] "::SA(${i}) instproc fa-::SB(${i})::fb-::Filtered${i}::testfilter-::procFilter-::SB(${i})::f2-::SA(${i})::fa-::SB(${i}) instproc fb-::SB(${i})::fb-::Filtered${i}::testfilter-::procFilter-::SB(${i})::f2-::SA(${i})::fa-::f${i} proc procFilter-::SB(${i})::fb-::Filtered${i}::testfilter-::procFilter-::SB(${i})::f2-::SA(${i})::fa" "filtersearch" Filtered${i} instfilter {} SB($i) instfilter {} set erg [f${i} a] ::errorCheck $erg "in a-::procFilter-::SB(${i})::f2-::SA(${i})::fa" \ "only obj filter" f${i} filter {} set erg [f${i} a] ::errorCheck $erg "in a" \ "obj filter remove" } for {set i 0} {$i < $n} {incr i} { SA($i) destroy SB($i) destroy SC($i) destroy } ::errorCheck $::filterCount 960 \ "Filter Test - Filter Count -- Got: $::filterCount" # # instvar test # Object o o set x 1 Object o1 o1 set x 11 Object o2 o2 proc t {} { # multiple imports for existing (x) and not existing vars (y) o instvar x y append result "x: $x " append result "y: ie [info exists y] me [my exists y] " \ "iv '[info vars y]' oe [o exists y] oiv '[o info vars y]' // " set y 100 append result "y: ie [info exists y] me [my exists y] " \ "iv '[info vars y]' oe [o exists y] oiv '[o info vars y]'" ::errorCheck $result \ "x: 1 y: ie 0 me 0 iv 'y' oe 0 oiv '' // y: ie 1 me 0 iv 'y' oe 1 oiv 'y'" \ "instvar test 1 failed" set result "" o1 instvar x y append result "x: $x " append result "y: ie [info exists y] me [my exists y] " \ "iv '[info vars y]' oe [o1 exists y] oiv '[o1 info vars y]' // " set y 101 append result "y: ie [info exists y] me [my exists y] " \ "iv '[info vars y]' oe [o1 exists y] oiv '[o1 info vars y]'" ::errorCheck $result \ "x: 11 y: ie 0 me 0 iv 'y' oe 0 oiv '' // y: ie 1 me 0 iv 'y' oe 1 oiv 'y'" \ "instvar test 2 failed" } o2 t o destroy o1 destroy o2 destroy global filterResult set filterResult "" Object a a set o 12 a set p 13 Class A A set m 14 Object instproc f args { global filterResult a instvar o p A instvar m ::append filterResult " [self] [self calledproc] [self callingproc]" ::append filterResult " $o $p $m" next } proc x {} { set ::a::e xxx } Object instfilter f x ::errorCheck $::a::e xxx \ "filterAddRemove: instvar test -- proc set failed" a set e yyy ::errorCheck $::a::e yyy \ "filterAddRemove: instvar test -- obj set failed" ::errorCheck $filterResult " ::A instvar f 12 13 14 ::a set run 12 13 14" \ "filterAddRemove: instvar test -- instvar filter failed" Object instfilter "" Object instproc f args { next } Object instfilter f ::errorCheck [Object o] "::o" \ "filterAddRemove: Object creation with filter" # This produces a bug, if not # RUNTIME_STATE(in)->returnCode = TCL_OK; # in ObjDispatch -> UNKNOWN handling */ # abrupt stop of program because result is set to XOTCL_UNKNOWN # instead of TCL_ERROR, as it should be catch {puts ${ZZZZZZZZZZZZZZZ::ZZZZZ}} o set r 43 ::errorCheck [o set r] "43" \ "filterAddRemove: Object creation with filter: setting var" Object instfilter "" # test for CmdListReplaceCmd set ::r "" Class A A instproc f2 args {lappend ::r [self class]-[self proc]; next} Class C -superclass A Class D -superclass C D instfilter {f2} D d d filter {f2} C instproc f2 args {lappend ::r [self class]-[self proc]; next} set ::r "" d set r 1 ::errorCheck $::r "::C-f2 ::A-f2" \ "filter method addition" o proc m {} { } o proc f args { my incr count next } o set count 0 o filter f o m ::errorCheck [o set count] 2 "filter count" o filter "" set filterstate [::xotcl::configure filter off] o set count 0 o m ::errorCheck [o set count]-$filterstate 0-1 "filter off + old state" o filter "" ::xotcl::configure filter on set ::r "" Object instproc f args { set r [next] lappend ::r [self]-[self calledproc] return $r } Class D D filter f D d1 ::errorCheck $::r "::D-d1 ::D-alloc ::D-create ::D-unknown" "filter state after next" } @ TestX filterClassChange { description {Regression test object testing class changes of filters.} } TestX filterClassChange -proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { Class A($i) Class B A($i) instproc f args { set result pre*[self]*[self proc]*$args lappend result [next] post*[self]*[self proc] return $result } A($i) o($i) o($i) proc change {} { my class B } o($i) proc call {} { return in-call } A($i) instfilter f set erg [o($i) call] ::errorCheck $erg "pre*::o($i)*f* in-call post*::o($i)*f" \ "Filter Class Change -- Call before change" o($i) change set erg [o($i) call] ::errorCheck $erg "in-call" \ "Filter Class Change -- Call after change" # testing deleting a filter proc Class F F instproc testf args {return filtered} F instfilter testf F f1 ::errorCheck [f1 set r 45] "filtered" "Deleting a filter proc ... before" F instproc testf {} {} ::errorCheck [f1 set r 45] "45" "Deleting a filter proc ... after" # testing remove a superclass Class F1 Class F2 -superclass F1 Class F3 -superclass F2 F1 instproc testf args {return [next]-filtered} F2 instproc testf2 args {return [next]-filtered} F3 instfilter {testf testf2} F3 f2 ::errorCheck [f2 filtersearch testf2] "::F2 instproc testf2-filtered-filtered" "filtersearch 2" ::errorCheck [f2 set r 45] "45-filtered-filtered" \ "Removing a superclass ... before" F3 superclass [F1 info superclass] ::errorCheck [f2 filtersearch testf2] "" "filtersearch 2 after" ::errorCheck [f2 set r 45] "45" "Class F2 removed from classtree ... after" } B destroy for {set i 0} {$i < $n} {incr i} {A($i) destroy} } @ TestX filterGuards { description {Regression test object testing filter guards.} } TestX filterGuards -proc run {{n 20}} { global filterResult for {set i 0} {$i < $n} {incr i} { set ::filterResult "" Class A A instproc f2 args { global filterResult append filterResult "-[self]-[self proc]-[self class]-[self calledproc]" next } Class B -superclass A B instproc f1 args { global filterResult append filterResult "-[self]-[self proc]-[self class]-[self calledproc]" next } B instproc f3 args { global filterResult append filterResult "-[self]-[self proc]-[self class]-[self calledproc]" next } B instfilter {{f1 -guard "1<0"}} B b ::errorCheck $filterResult "" "Filter guard: Filter never to be applied" b destroy A instproc f1 args { global filterResult append filterResult "-[self]-[self proc]-[self class]-[self calledproc]" next } set filterResult "" B b ::errorCheck $filterResult "" \ "Filter guard: Filter never to be applied + filter inheritance on this filter" # filter w/o guard -> has to be applied A instfilter f1 b destroy set filterResult "" B b ::errorCheck $filterResult "-::b-f1-::A-configure-::b-f1-::A-init" \ "Filter guard: two different filters, same name + different class, one guarded, one not" # two filter w/o guard -> both have to be applied B instfilter f1 b destroy set filterResult "" B b ::errorCheck $filterResult "-::b-f1-::B-configure-::b-f1-::A-configure-::b-f1-::B-init-::b-f1-::A-init" \ "Filter guard: two different filters, both not guarded anymore" # three filters with guards, not to be applied, in one chain b destroy A instfilter {} B instfilter {{f1 -guard {0}} {f3 -guard {0}} {f2 -guard {0}}} set filterResult "" B b ::errorCheck $filterResult "" "Filter guard: three filters in one chain" # three times the same filter --> guards are and-combined set filterResult "" B instfilter {{f2 -guard {[self calledproc] eq "set" || [self] == "::b2"}}} A instfilter {{f2 -guard {[self] == "::b2"}}} B b1 B b2 if {$i == 0} { ::errorCheck $filterResult "-::b2-f2-::A-configure-::b2-f2-::A-init" \ "Filter guard: creation with less restrictive guards" } else { ::errorCheck $filterResult "-::b2-f2-::A-cleanup-::b2-f2-::A-configure-::b2-f2-::A-init" \ "Filter guard: creation with less restrictive guards (b)" } set filterResult "" b1 set x 45 ::errorCheck $filterResult "-::b1-f2-::A-set" \ "Filter guard: setting restricted object" set filterResult "" b1 info class ::errorCheck $filterResult "" \ "Filter guard: info restricted object (no guard applies)" set filterResult "" b2 info class ::errorCheck $filterResult "-::b2-f2-::A-info" \ "Filter guard: setting restricted object (2nd guard applies)" b1 filter {{f2 -guard {[self calledproc] eq "info"}}} set filterResult "" b1 proc a {} { # } ::errorCheck $filterResult "" \ "Filter guard: proc on restricted object (no guard applies)" set filterResult "" b1 info class ::errorCheck $filterResult "-::b1-f2-::A-info" \ "Filter guard: info filtered by object filter guard" # checking infos ::errorCheck [b1 info filterguard f2]-[B info instfilterguard f2]-[A info instfilterguard f2] \ {[self calledproc] eq "info"-[self calledproc] eq "set" || [self] == "::b2"-[self] == "::b2"} \ "Filter guard: info filtered by object filter guard" # checking info -guards option Class A A instproc f1 args {next} A instproc fx args {next} Class B -superclass A B instproc f1 args {next} B instproc f2 args {next} B b B instfilter {{f1 -guard {[self] eq "::b"}} {f2 -guard 0} f1} b filter {{f1 -guard {[self] eq "::b"}} {f2 -guard 0}} ::errorCheck [B info instfilter]-[B info instfilter -guards]-[b info filter]-[b info filter -guards] \ {f1 f2-f1 {f2 -guard 0}-f1 f2-{f1 -guard {[self] eq "::b"}} {f2 -guard 0}}\ {[self] -- Filter guard: -guards option} A instfilter {f1 fx} A a a proc x args {next} a filter x ::errorCheck [b info filter -order]-[a info filter -order] "{::B instproc f1} {::B instproc f2} {::A instproc f1} {::A instproc fx}-{::a proc x} {::A instproc f1} {::A instproc fx}" \ {[self] -- Filter guard: -order option} ::errorCheck [b info filter -order -guards]-[a info filter -order -guards] {{f1 -guard {[self] eq "::b"}} {f2 -guard 0} f1 fx-x f1 fx} \ {[self] -- Filter guard: -order -guards options} Class Foo Foo instproc init {args} {my set bar hello} Foo instproc baz {args} { my instvar bar return $bar } Foo instproc myFilter {args} { lappend ::r myFilter->[self calledproc] my set r 4 next } Foo instfilter myFilter Foo instfilterguard myFilter { ([self calledproc] eq "baz") } Foo instfilterguard myFilter { ([self calledproc] eq "baz") } set f [Foo new] $f baz ::errorCheck [$f baz] "hello" {Filter guard from method call} Foo instfilterguard myFilter {} set ::r "" Foo create f f filter myFilter f filterguard myFilter { ([self calledproc] eq "baz") } lappend ::r [f baz] [f set r 1] f filterguard myFilter {} lappend ::r [f baz] [f set r 1] ::errorCheck $::r [list myFilter->configure myFilter->init \ myFilter->set myFilter->filter \ myFilter->filterguard myFilter->baz \ hello 1 myFilter->baz \ myFilter->instvar myFilter->set hello 1] \ {Filter guard from method call} f destroy Class Room Room instproc open {} {lappend ::r [self proc]} Room instproc x {} {lappend ::r [self proc]} Room instproc loggingFilter args { lappend ::r [self proc]-[self calledproc] next } Room instproc callsMethod {method calledproc} { return [string match $calledproc $method] } Room instproc callsLevel2 {} { set level [self guardedlevel] lappend ::r $level set calledproc [uplevel $level self calledproc] lappend ::r $calledproc } Room instfilter loggingFilter Room instfilterguard loggingFilter {[my callsMethod open [self calledproc]]} Room r set ::r "" r open r x ::errorCheck $::r "loggingFilter-open open x" {info guarded scope} } } @ TestX mixinGuards { description {Regression test object testing mixin guards.} } TestX mixinGuards -proc run {{n 20}} { set ::r "" Class Fly Fly instproc fly {} {lappend ::r "[my signature]: yippee, fly like an eagle!"} Class Sing Sing instproc sing {} {lappend ::r "[my signature]: what a difference a day make"} Class Animal -parameter age Animal instproc unknown args { lappend ::r "[my signature]: how should i $args?"} Animal instproc signature {} { return "[self] [my info class] ([my age] years)" } Class Bird -superclass Animal Class Penguine -superclass Bird Class Parrot -superclass Bird Class Duck -superclass Bird Parrot tweedy -age 1 Penguine pingo -age 5 Duck donald -age 4 Parrot lora -age 6 Bird instmixin {{Fly -guard {[my age]>2 && ![my istype Penguine]}} Sing} foreach bird {tweedy pingo donald lora} { $bird fly } ::errorCheck [set ::r] [list \ {::tweedy ::Parrot (1 years): how should i fly?} \ {::pingo ::Penguine (5 years): how should i fly?} \ {::donald ::Duck (4 years): yippee, fly like an eagle!} \ {::lora ::Parrot (6 years): yippee, fly like an eagle!}] \ {Simple Instmixin Guard} set ::r "" tweedy age 3 pingo class Duck lora class Penguine foreach bird {tweedy pingo donald lora} { $bird fly } ::errorCheck [set ::r] [list \ {::tweedy ::Parrot (3 years): yippee, fly like an eagle!} \ {::pingo ::Duck (5 years): yippee, fly like an eagle!} \ {::donald ::Duck (4 years): yippee, fly like an eagle!} \ {::lora ::Penguine (6 years): how should i fly?}] \ {Simple Instmixin Guard ... Class Change} set ::r "" pingo mixin {{Fly -guard {[my age]>2}} Sing} foreach i { {Bird info instmixin -guards} {pingo info mixin -guards} {pingo info mixin -order -guards}} { lappend ::r "$i [eval $i]" } ::errorCheck [set ::r] [list \ {Bird info instmixin -guards {::Fly -guard {[my age]>2 && ![my istype Penguine]}} ::Sing} \ {pingo info mixin -guards {::Fly -guard {[my age]>2}} ::Sing} \ {pingo info mixin -order -guards {::Fly -guard {[my age]>2}} ::Sing}] \ {Simple Instmixin Guard ... Info} set ::r "" Class POM-start Class POM-end Class PCM-start Class PCM-end pingo mixin {POM-start {Fly -guard {[my age]>2}} Sing POM-end} Bird instmixin {PCM-start {Fly -guard {[my age]>2 && ![my istype Penguine]}} Sing PCM-end} pingo class Penguine foreach i { {Bird info instmixin -guards} {pingo info mixin -guards} {pingo info mixin -order -guards}} { lappend ::r "$i [eval $i]" } ::errorCheck [set ::r] [list \ {Bird info instmixin -guards ::PCM-start {::Fly -guard {[my age]>2 && ![my istype Penguine]}} ::Sing ::PCM-end} \ {pingo info mixin -guards ::POM-start {::Fly -guard {[my age]>2}} ::Sing ::POM-end} \ {pingo info mixin -order -guards ::POM-start ::POM-end ::PCM-start {::Fly -guard {[my age]>2}} ::Sing ::PCM-end}] \ {Same Mixin Guard ... Info} set ::r "" pingo fly ::errorCheck [set ::r] [list \ {::pingo ::Penguine (5 years): yippee, fly like an eagle!}] \ {Same Mixin Guard ... most specific counts} set ::r "" Animal a -set age 20 a mixin Fly a mixinguard ::Fly {[my age] > 3} a fly lappend ::r [a info mixin -guards] lappend ::r [a info mixin -order -guards] a set age 2 a fly a mixinguard ::Fly {[my age] > 4} a fly set info "" lappend info [a info mixinguard Fly] lappend ::r [a info mixin -guards] lappend ::r [a info mixin -order -guards] a mixinguard ::Fly {} a fly lappend ::r [a info mixin -guards] lappend info [a info mixinguard Fly] lappend ::r [a info mixin -order -guards] ::errorCheck [set ::r] [list \ {::a ::Animal (20 years): yippee, fly like an eagle!} \ {{::Fly -guard {[my age] > 3}}} {{::Fly -guard {[my age] > 3}}} \ {::a ::Animal (2 years): how should i fly?} \ {::a ::Animal (2 years): how should i fly?} \ {{::Fly -guard {[my age] > 4}}} {{::Fly -guard {[my age] > 4}}} \ {::a ::Animal (2 years): yippee, fly like an eagle!} \ ::Fly ::Fly] \ {mixinguard method} set ::r "" Class A -superclass Animal A a -set age 20 A instmixin Fly A instmixinguard ::Fly {[my age] > 3} lappend info [A info instmixinguard ::Fly] a fly lappend ::r [A info instmixin -guards] lappend ::r [a info mixin -order -guards] a set age 2 a fly A instmixinguard ::Fly {[my age] > 4} lappend info [A info instmixinguard ::Fly] a fly lappend ::r [A info instmixin -guards] lappend ::r [a info mixin -order -guards] A instmixinguard ::Fly {} lappend info [A info instmixinguard ::Fly] a fly lappend ::r [A info instmixin -guards] lappend ::r [a info mixin -order -guards] ::errorCheck [set ::r] [list \ {::a ::A (20 years): yippee, fly like an eagle!} \ {{::Fly -guard {[my age] > 3}}} {{::Fly -guard {[my age] > 3}}} \ {::a ::A (2 years): how should i fly?} \ {::a ::A (2 years): how should i fly?} \ {{::Fly -guard {[my age] > 4}}} {{::Fly -guard {[my age] > 4}}} \ {::a ::A (2 years): yippee, fly like an eagle!} \ ::Fly ::Fly] \ {instmixinguard method} ::errorCheck [set info] [list {[my age] > 4} {} {[my age] > 3} \ {[my age] > 4} {} ] {info (inst)mixinguard} } @ TestX filterSimpleObserver { description {Regression test object testing a simple observer using filters. } } TestX filterSimpleObserver -proc run {{n 20}} { set ::filterCount 0 for {set i 0} {$i < $n} {incr i} { Class NetAccess$i Class Http$i -superclass NetAccess$i Class TransferDialog$i TransferDialog$i proc addObserver cl { $cl instproc observerFilter args { set calledMethod [self calledproc] set callingClass [my info class] incr ::filterCount set result [next] my set r 34 foreach var {args calledMethod callingClass result} { if {[info vars $var] != $var} { puts stderr "[self] -- Simple Observer - info vars in filter" exit } } return [self]-[self class]-[my info class]-$args-[self calledproc]-[self callingproc]-$result } $cl instfilter observerFilter } TransferDialog$i instproc show {i} { next TransferDialog${i} addObserver NetAccess$i [self class] instvar observingObjects lappend observingObjects(::NetAccess$i) [self] } Http$i parameter {a be bu} Http$i instproc path x { my set path $x } Http$i instproc query x { my set [self proc] $x } Http$i instproc init {args} { my set url abc next my instvar query path bu if {![info exists query] || ![info exists path] || ![info exists bu] || $query ne "q"} { puts stderr "FAILED - [self] -- Simple Observer - Variable Init"; exit } } Http$i instproc GET {x} { my instvar query url path if {[info exists query]} { append url ?$query append path ?$query } set ::baseLevel [info level] if {0 != [expr {[info level] - $::baseLevel}]} { puts stderr "FAILED - [self] -- Simple Observer - info level in filtered proc\n\ expected 0, got [expr {[info level] - $::baseLevel}]" exit } foreach var {x path query url} { if {[info vars $var] != $var} { puts stderr "FAILED - [self] -- Simple Observer - info vars in filtered proc"; exit } } return $url } TransferDialog$i t($i) t($i) show $i Http$i h($i) -query q -path p -bu b set erg [h($i) GET 1] ::errorCheck $erg "::h($i)-::NetAccess$i-::Http$i-1-GET-run-abc?q" \ "Simple Observer - Filter Return" } for {set i 0} {$i < $n} {incr i} { NetAccess$i instfilter {} h($i) destroy t($i) destroy Http$i destroy NetAccess$i destroy TransferDialog$i destroy } ::errorCheck $::filterCount 220 \ "Simple Observer - Filter Count" } @ TestX stdargs { description { Regression test object testing the ability of the next primitive to pass arguments without naming them. } } TestX stdargs -proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { Class C Class D Class A -superclass {C D} Class B -superclass A C instproc t {} { next return } D instproc t args { ::errorCheck $args "" --noArgs next return } A instproc t {a b args} { if {$a != 1 || $b != 2 || $args != {3 4 5 6 7 8 9}} { puts stderr "FAILED - [self] -- StdArgs not computed"; exit } next --noArgs return } B instproc t {a b args} { if {$a != 1 || $b != 2 || $args != {3 4 5 6 7 8 9}} { puts stderr "FAILED -[self] -- StdArgs not computed"; exit } next return } B x x t 1 2 3 4 5 6 7 8 9 } foreach o {x A B C D} {$o destroy} } @ TestX filterInfo { description{ Regression test object testing introspection of filters. } } TestX filterInfo # Helper Procs proc ::showStack {{m 100}} { set r "" set max [info level] if {$m<$max} {set max $m} for {set i 0} {$i < $max} {incr i} { set r ${r}-$i=[info level [expr -$i]] } return $r } proc ::showCall {} { set n "" for {set level -1} {1} {incr level -1} { set p [info level $level] if {[lindex $p 0] eq "next"} {set n "next:"} break } return [showStack] } filterInfo proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { global FInfo set FInfo "" Class FI FI proc addFilter {classname} { $classname instproc infoFilter args { global FInfo lappend FInfo \ [list callingclass [self callingclass] \ filterreg [self filterreg] \ callingobject [self callingobject] \ callingproc [self callingproc] \ calledproc [self calledproc]] set r [next] lappend FInfo \ [list self [self] proc [self proc] class [self class] \ infoclass [my info class] r $r] return $r } $classname instfilter infoFilter } Class C0 FI addFilter C0 C0 instproc m1 {} { my instvar aa bb cc set cc 1 } Class C1 -superclass C0 C1 instproc init args { my set a 1 my set c 22 next } C1 instproc m1 args { set r [next] my instvar a b cc return $r--${a}--[set cc] } set safedObjFilters [Object info filter] Object instfilter "" C1 c1 Object instfilter $safedObjFilters if {$i == 0} { ::errorCheck "$FInfo" \ "{callingclass {} filterreg {::C0 instfilter infoFilter} callingobject ::filterInfo callingproc run calledproc configure} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r 0} {callingclass {} filterreg {::C0 instfilter infoFilter} callingobject ::filterInfo callingproc run calledproc init} {callingclass ::C1 filterreg {::C0 instfilter infoFilter} callingobject ::c1 callingproc init calledproc set} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r 1} {callingclass ::C1 filterreg {::C0 instfilter infoFilter} callingobject ::c1 callingproc init calledproc set} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r 22} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r {}}" \ "Wrong filtering of instproc creation C/C1" } else { ::errorCheck "$FInfo" \ "{callingclass {} filterreg {::C0 instfilter infoFilter} callingobject ::filterInfo callingproc run calledproc cleanup} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r {}} {callingclass {} filterreg {::C0 instfilter infoFilter} callingobject ::filterInfo callingproc run calledproc configure} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r 0} {callingclass {} filterreg {::C0 instfilter infoFilter} callingobject ::filterInfo callingproc run calledproc init} {callingclass ::C1 filterreg {::C0 instfilter infoFilter} callingobject ::c1 callingproc init calledproc set} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r 1} {callingclass ::C1 filterreg {::C0 instfilter infoFilter} callingobject ::c1 callingproc init calledproc set} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r 22} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r {}}" \ "Wrong filtering of instproc creation C/C1 (b)" } set FInfo "" set result [c1 m1] ::errorCheck $FInfo \ "{callingclass {} filterreg {::C0 instfilter infoFilter} callingobject ::filterInfo callingproc run calledproc m1} {callingclass ::C0 filterreg {::C0 instfilter infoFilter} callingobject ::c1 callingproc m1 calledproc instvar} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r {}} {callingclass ::C1 filterreg {::C0 instfilter infoFilter} callingobject ::c1 callingproc m1 calledproc instvar} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r {}} {self ::c1 proc infoFilter class ::C0 infoclass ::C1 r 1--1--1}" \ "Wrong filtering of c1 m1" set FInfo "" ::errorCheck $result \ "1--1--1" "Wrong return result of Filter Example 2 'c1 m1' " Class T0 FI addFilter T0 T0 instproc m {} { set e -0=showStack-1=showCall-2=m-3=m-4=m-5=run-6=run if {[string first $e [showCall]] == -1} { puts stderr "FAILED - Wrong calling stack in T0 m: [showCall]" puts stderr "expected = '$e'" puts stderr "got = '[showCall]'" exit } return [self]-[self proc]-[self class]-[my info class] } Class T1 -superclass T0 T1 instproc m {} { set e 0=showStack-1=showCall-2=m-3=m-4=run-5=run if {[string first $e [showCall]] == -1} { puts stderr "FAILED - Wrong calling stack in T1 m: [showCall]" puts stderr "expected = '$e'" puts stderr "got = '[showCall]'" exit } set r1 before-[self]-[self proc]-[self class]-[my info class] set r2 [next] set r after-[self]-[self proc]-[self class]-[my info class]-${r1}-$r2 } T1 t set FInfo "" set result [t m] ::errorCheck $FInfo \ "{callingclass {} filterreg {::T0 instfilter infoFilter} callingobject ::filterInfo callingproc run calledproc m} {callingclass ::T1 filterreg {::T0 instfilter infoFilter} callingobject ::t callingproc m calledproc info} {self ::t proc infoFilter class ::T0 infoclass ::T1 r ::T1} {callingclass ::T0 filterreg {::T0 instfilter infoFilter} callingobject ::t callingproc m calledproc info} {self ::t proc infoFilter class ::T0 infoclass ::T1 r ::T1} {callingclass ::T1 filterreg {::T0 instfilter infoFilter} callingobject ::t callingproc m calledproc info} {self ::t proc infoFilter class ::T0 infoclass ::T1 r ::T1} {self ::t proc infoFilter class ::T0 infoclass ::T1 r after-::t-m-::T1-::T1-before-::t-m-::T1-::T1-::t-m-::T0-::T1}" \ "Wrong filtering of t m" set FInfo "" ::errorCheck $result \ "after-::t-m-::T1-::T1-before-::t-m-::T1-::T1-::t-m-::T0-::T1" \ "Wrong return result of Filter Example 2 \"t m\" " } c1 destroy for {set i 0} {$i < $n} {incr i} { global InfoTraceResult Object instfilter "" Object InfoTrace InfoTrace proc createInfoTrace cl { $cl instproc infoTraceFilter args { global InfoTraceResult ::set r [next] ::lappend InfoTraceResult [list \ $r-[self]-[self proc]-[self class] \ [my info class]-[self calledproc] \ [self callingproc]-[self callingobject] \ [self callingclass]-[self filterreg]] return $r } $cl instfilter infoTraceFilter } Class ObjectsClass ObjectsClass anObject Class aClass ObjectsClass instproc aProc {} {aClass create anotherObject} InfoTrace createInfoTrace Object set InfoTraceResult "" set r [anObject aProc] if {$i > 0} { ::errorCheck $InfoTraceResult \ "{-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-cleanup aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {-::xotcl::Class::Parameter-infoTraceFilter-::xotcl::Object ::xotcl::Class-searchDefaults aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {0-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-configure aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-init aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-recreate aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-create aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::anObject-infoTraceFilter-::xotcl::Object ::ObjectsClass-aProc run-::filterInfo {-::xotcl::Object instfilter infoTraceFilter}}" \ "FilterInfo InfoTrace: Filter information wrong (b)" } else { ::errorCheck $InfoTraceResult \ "{::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-alloc aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {-::xotcl::Class::Parameter-infoTraceFilter-::xotcl::Object ::xotcl::Class-searchDefaults aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {0-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-configure aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {-::anotherObject-infoTraceFilter-::xotcl::Object ::aClass-init aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::aClass-infoTraceFilter-::xotcl::Object ::xotcl::Class-create aProc-::anObject {::ObjectsClass-::xotcl::Object instfilter infoTraceFilter}} {::anotherObject-::anObject-infoTraceFilter-::xotcl::Object ::ObjectsClass-aProc run-::filterInfo {-::xotcl::Object instfilter infoTraceFilter}}" \ "FilterInfo InfoTrace: Filter information wrong" } } Object instfilter {} global fUplevelResult set fUplevelResult "" Class FilterMix FilterMix instproc calls args { global fUplevelResult set calledproc [uplevel 1 {self calledproc}] set calledclass [uplevel 1 {self calledclass}] append fUplevelResult "-[self class]-[self proc]-$calledproc-$calledclass" } Class FilterCL -instmixin FilterMix FilterCL instproc filterA args { global fUplevelResult append fUplevelResult -[self class]-[self proc]-[self calledproc]-[self calledclass] my calls next } FilterCL instproc fclproc args {} FilterCL instfilter filterA FilterCL fcl fcl fclproc # ::errorCheck $fUplevelResult "-::FilterCL-filterA-configure-::xotcl::Object-::FilterMix-calls-configure-::xotcl::Object-::FilterCL-filterA-init-::xotcl::Object-::FilterMix-calls-init-::xotcl::Object-::FilterCL-filterA-fclproc-::FilterCL-::FilterMix-calls-fclproc-::FilterCL" "Filter/Mixin Info Uplevel Test" } @ TestX nextTest { description {Regression test object testing the next primitive.} } TestX nextTest -proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { global result infoNext set result "" set infoNext "" Class X X instproc n {} { append ::infoNext " [self]+[self class]->[self proc]*<[self next]>" next } Class Y -superclass X Y instproc m {} { append ::infoNext " [self]+[self class]->[self proc]*<[self next]>" next } Y instproc n {} { append ::infoNext " [self]+[self class]->[self proc]*<[self next]>" next } Y y y m y n y proc n {} { append ::infoNext " [self]+[self class]->[self proc]*<[self next]>" next } y n ::errorCheck $infoNext " ::y+::Y->m*<> ::y+::Y->n*<::X instproc n> ::y+::X->n*<> ::y+->n*<::Y instproc n> ::y+::Y->n*<::X instproc n> ::y+::X->n*<>" \ "simple self next test" set infoNext "" set result "" Class A A instproc m arg { global result infoNext set result ${result}-[self]-$arg } Class B -superclass A B instproc m arg { global result infoNext set result ${result}-[self]-$arg append infoNext " 2[self]+[self class]->[self proc]*<[self next]>" next } B b0 -m 1 B b -m "" ::errorCheck $result "-::b0-1-::b0-1-::b--::b-" \ "Next Test A/B -- Wrong result" set result "" Class X X instproc init args { global result infoNext set result ${result}-[self]-$args append infoNext " 1[self]+[self class]->[self proc]*<[self next]>" next } X instproc test {} { global result set result ${result}-[self] } X x -test ::errorCheck $result "-::x-::x-" \ "Next Test X -- Wrong result" ::errorCheck $infoNext " 2::b0+::B->m*<::A instproc m> 2::b+::B->m*<::A instproc m> 1::x+::X->init*<::xotcl::Object instproc init>" \ "self next test 2" X destroy x destroy A destroy B destroy b0 destroy b destroy Class MIX MIX instproc mProc args { global result append result "[self]-[self class]-[self next]" next } Object o -mixin MIX o proc mProc args { global result append result "[self]-[self class]-[self next]" } set result "" o mProc ::errorCheck $result "::o-::MIX-::o proc mProc::o--" \ "Next Test Proc & Mixin" o destroy; MIX destroy } } @ TestX init_params { description { Regression test object testing the parameter instance method, the init dash '-' and constructor calling. } } TestX init_params -proc run {{n 20}} { for {set i 0} {$i < $n} {incr i} { global dashResult set dashResult "" set dashResultEnd "" Class A A instproc t0 {} { global dashResult set dashResult ${dashResult}*[self proc] } A instproc t1 {a} { global dashResult set dashResult ${dashResult}*[self proc]-$a } A instproc t2 {a b} { global dashResult set dashResult ${dashResult}*[self proc]-${a}-$b } A instproc t3 {a b c} { global dashResult set dashResult ${dashResult}*[self proc]-${a}-${b}-$c } A a set dashResultEnd "[A a -t0] $dashResultEnd" A a set dashResultEnd "[A a -t1 1] $dashResultEnd" A a set dashResultEnd "[A a -t2 1 2] $dashResultEnd" A a set dashResultEnd "[A a -t3 1 2 3] $dashResultEnd" A a set dashResultEnd "[A a -t0 -t0 -t3 1 2 3 -t0 -t1 1 -t1 1 -t0] $dashResultEnd" catch {A a t} ::errorCheck $dashResult \ "*t0*t1-1*t2-1-2*t3-1-2-3*t0*t0*t3-1-2-3*t0*t1-1*t1-1*t0" \ "Init Dash Test fails" ::errorCheck $dashResultEnd \ "::a ::a ::a ::a ::a " \ "Init Dash Test fails -- result" Class Foo -parameter {{match -exact}} Foo ff ::errorCheck [ff match] "-exact" "default with dash" } # parameter/defaults test proc ::cmd {a b} { return in-cmd-${a}-${b} } global parameterResult global initResult for {set i 0} {$i < $n} {incr i} { Class O -parameter { {a -default 0} {b -default {[cmd 3 4]}} c d {e -default 3} {Self -default [self]} } O instproc init args { global initResult set initResult ${initResult}-[self]-[self class]-[self proc]--$args next } O instproc show {} { global parameterResult set parameterResult [self] foreach v [lsort [my info vars]] { set parameterResult ${parameterResult}-${v}=<[my set ${v}]> } } Class Meta -superclass Class Meta instproc create args {next; return Meta-create} Meta C -superclass O -parameter {a {b -default ""} {c -default 1}} Class D -parameter {a {c -default 1}} -superclass O # create on class should not be called D instproc create args {next; return D-create} D instproc init args { global initResult set initResult ${initResult}-[self]-[self class]-[self proc]--$args next } D instproc test i { ::errorCheck [my set c]-[my set a] "2-0" "Wrong order of init call" } set parameterResult "" set initResult "" C c0 -show ::errorCheck $parameterResult "::c0-Self=<::c0>-a=<0>-b=<>-c=<1>-e=<3>" \ "C c0 parameter Test failed" if {$i == 0} { ::errorCheck $initResult "-::c0-::O-init--" \ "C c0 parameter init Test failed" } else { ::errorCheck $initResult "-::c0-::O-init--" \ "C c0 parameter init Test failed (b)" } set parameterResult "" set initResult "" set r [C c1 -c 2 -init a b c -a 1 -show] ::errorCheck $parameterResult "::c1-Self=<::c1>-a=<1>-b=<>-c=<2>-e=<3>" \ "C c1 parameter Test failed (b)" ::errorCheck $initResult "-::c1-::O-init--a b c" \ "C c1 parameter init Test failed" set parameterResult "" set initResult "" set r $r-[D d1 -c 2 -init a b c -test $i -a 1 -show] ::errorCheck $parameterResult "::d1-Self=<::d1>-a=<1>-b=-c=<2>-e=<3>" \ "D d1 parameter Test failed" if {$i == 0} { ::errorCheck $initResult "-::d1-::D-init--a b c-::d1-::O-init--a b c" \ "D d1 parameter init Test failed" } else { ::errorCheck $initResult "-::d1-::D-init--a b c-::d1-::O-init--a b c" \ "D d1 parameter init Test failed (b)" } ::errorCheck $r "Meta-create-::d1" "User defined object creation failed" } } @ TestX mixinTest { description { Regression test object testing per-object mixins. } } TestX mixinTest -proc run {{n 10}} { global mixinResult set mixinResult "" Class Agent Agent instproc moveAgent {x y} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } Agent instproc otherProc {} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } Class InteractiveAgent -superclass Agent InteractiveAgent instproc moveAgent {x y} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } Class InteractiveAgent2 -superclass Agent InteractiveAgent2 instproc moveAgent {x y} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } Class InteractiveAgent3 -superclass Agent InteractiveAgent3 instproc moveAgent {x y} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } # Addition-Classes Class MovementLog MovementLog instproc moveAgent {x y} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] my otherProc next } MovementLog instproc otherProc {} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } Class MovementTest MovementTest instproc moveAgent {x y} { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } InteractiveAgent i1; InteractiveAgent i2 i1 mixin MovementLog i2 mixin MovementTest InteractiveAgent2 instmixin {MovementLog MovementTest} InteractiveAgent3 instmixin MovementTest InteractiveAgent2 i3; InteractiveAgent3 i4; ::errorCheck [InteractiveAgent2 info instmixin] "::MovementLog ::MovementTest" "Mixin: info instmixin" i2 moveAgent 1 2 ::errorCheck $mixinResult \ "-::i2-moveAgent-::MovementTest-::i2-moveAgent-::InteractiveAgent-::i2-moveAgent-::Agent" \ "Mixin: 'i2 moveAgent 1 2' failed" set mixinResult "" i1 moveAgent 3 4 ::errorCheck $mixinResult \ "-::i1-moveAgent-::MovementLog-::i1-otherProc-::MovementLog-::i1-otherProc-::Agent-::i1-moveAgent-::InteractiveAgent-::i1-moveAgent-::Agent" \ "Mixin: 'i1 moveAgent 3 4' failed" set mixinResult "" i3 moveAgent 3 4 ::errorCheck $mixinResult \ "-::i3-moveAgent-::MovementLog-::i3-otherProc-::MovementLog-::i3-otherProc-::Agent-::i3-moveAgent-::MovementTest-::i3-moveAgent-::InteractiveAgent2-::i3-moveAgent-::Agent" \ "Instmixin: 'i3 moveAgent 3 4' failed" set mixinResult "" i4 moveAgent 3 4 ::errorCheck $mixinResult \ "-::i4-moveAgent-::MovementTest-::i4-moveAgent-::InteractiveAgent3-::i4-moveAgent-::Agent" \ "Instmixin: 'i4 moveAgent 3 4' failed" i4 mixin {MovementTest MovementLog} i4 proc aaa args {puts TEST} ::errorCheck [i4 info precedence] "::MovementLog ::MovementTest ::InteractiveAgent3 ::Agent ::xotcl::Object" "precedence i4" ::errorCheck [i4 procsearch moveAgent]-[i4 procsearch aaa]-[i4 procsearch set] "::MovementLog instproc moveAgent-::i4 proc aaa-::xotcl::Object instcmd set" "procsearch" Class create A A instproc f1 {} {puts hu} A instforward f2 puts hu A instparametercmd f5 A create a0 a0 proc f3 {} {puts hu} a0 forward f4 puts hu a0 parametercmd f6 puts hu ::errorCheck [a0 procsearch f1] "::A instproc f1" procsearch-1 ::errorCheck [a0 procsearch f2] "::A instforward f2" procsearch-2 ::errorCheck [a0 procsearch f3] "::a0 proc f3" procsearch-3 ::errorCheck [a0 procsearch f4] "::a0 forward f4" procsearch-4 ::errorCheck [a0 procsearch f5] "::A instparametercmd f5" procsearch-4 ::errorCheck [a0 procsearch f6] "::a0 parametercmd f6" procsearch-6 ::errorCheck [a0 procsearch set] "::xotcl::Object instcmd set" procsearch-6 set mixinResult "" i4 moveAgent 5 6 ::errorCheck $mixinResult \ -::i4-moveAgent-::MovementLog-::i4-otherProc-::MovementLog-::i4-otherProc-::Agent-::i4-moveAgent-::MovementTest-::i4-moveAgent-::InteractiveAgent3-::i4-moveAgent-::Agent \ "Instmixin: 'i4 moveAgent 5 6' failed" Class A A instproc test {} { global mixinResult set mixinResult "test" i1 moveAgent 3 4 } A a a test ::errorCheck $mixinResult \ "test-::i1-moveAgent-::MovementLog-::i1-otherProc-::MovementLog-::i1-otherProc-::Agent-::i1-moveAgent-::InteractiveAgent-::i1-moveAgent-::Agent" \ "Mixin: 'a test' failed" i2 mixin {MovementLog MovementTest} set mixinResult "" i2 moveAgent a b ::errorCheck $mixinResult \ "-::i2-moveAgent-::MovementLog-::i2-otherProc-::MovementLog-::i2-otherProc-::Agent-::i2-moveAgent-::MovementTest-::i2-moveAgent-::InteractiveAgent-::i2-moveAgent-::Agent" \ "Mixin: 'i2 moveAgent a b' failed" ::errorCheck "[i2 info mixin]-[i1 info mixin]-[a info mixin]" \ "::MovementLog ::MovementTest-::MovementLog-" \ "Mixin: Info failed" ::errorCheck "[i2 ismixin MovementTest]-[i4 ismixin MovementTest]-[a ismixin MovementTest]-[i3 ismixin MovementTest]-[i4 ismixin MovementTest]-[i4 ismixin MovementLog]-[i3 ismixin YXZ]-[i3 ismixin InteractiveAgent]" \ "1-1-0-1-1-1-0-0" \ "'ismixin test' failed" ::errorCheck "[i2 hasclass MovementTest]-[i4 hasclass MovementTest]-[a hasclass MovementTest]-[i3 hasclass MovementTest]-[i4 hasclass MovementTest]-[i4 hasclass MovementLog]-[i3 hasclass YXZ]-[i3 hasclass InteractiveAgent]-[a hasclass A]-[i3 hasclass Agent]" \ "1-1-0-1-1-1-0-0-1-1" \ "'hasclass test' failed" set mixinResult "" i2 mixin "" i2 moveAgent a b ::errorCheck $mixinResult \ "-::i2-moveAgent-::InteractiveAgent-::i2-moveAgent-::Agent" \ "Mixin: remove failed" set mixinResult "" Class A A instproc destroy args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } A instproc y args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } Class B B instproc destroy args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] next } B instproc y args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] my mixin "" next } B instproc x args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] my destroy } A a -mixin B a destroy A a -mixin B a x A a -mixin B a y ::errorCheck $mixinResult \ "-::a-destroy-::B-::a-destroy-::A-::a-x-::B-::a-destroy-::B-::a-destroy-::A-::a-y-::B-::a-y-::A" \ "Mixin: destroy failed" A instmixin B set mixinResult "" A a2 a2 destroy A a2 a2 x A a2 a2 y ::errorCheck $mixinResult \ "-::a2-destroy-::B-::a2-destroy-::A-::a2-x-::B-::a2-destroy-::B-::a2-destroy-::A-::a2-y-::B-::a2-y-::A" \ "Instmixin: destroy failed" # mixin Test: calls the mixins and a proc of the object set ::mixinResult "" Class A Class B A instproc a {} {set ::mixinResult ${::mixinResult}-[self]-[self class]-[self proc];next} B instproc a {} {set ::mixinResult ${::mixinResult}-[self]-[self class]-[self proc]; next} A d -mixin B d proc a {} {set ::mixinResult ${::mixinResult}-[self]-[self class]-[self proc]; next} d a ::errorCheck $::mixinResult \ "-::d-::B-a-::d--a-::d-::A-a" \ "Mixin: calling of object's proc" set mixinResult "" d mixin {} A instmixin B d a ::errorCheck $::mixinResult \ "-::d-::B-a-::d--a-::d-::A-a" \ "Instmixin: calling of object's proc" # # combining filters with mixins # set ::traceResults "" Class M1 M1 instproc test args { global traceResults lappend traceResults "[self] [self proc] [self class]" next } Class M2 M2 instproc test args { global traceResults lappend traceResults "[self] [self proc] [self class]" next } Class A A instproc test args { global traceResults lappend traceResults "[self] [self proc] [self class]" next } A instproc f1 args { global traceResults lappend traceResults "[self] [self proc] [self class]" next } A instproc f2 args { global traceResults lappend traceResults "[self] [self proc] [self class]" next } A a A instmixin {M1 M2} A instfilter {f1 f2} a test ::errorCheck $::traceResults \ "{::a f1 ::A} {::a f2 ::A} {::a test ::M1} {::a test ::M2} {::a test ::A}" \ "Combining mixins and filters" # mixin recursion test set mixinResult "" Class Computation Computation instproc compute args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] # abstract interface for computations } Class ComputationOutput -superclass Computation Computation instproc compute args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] return $args } Class RecFacultyMixin RecFacultyMixin instproc compute args { global mixinResult set mixinResult ${mixinResult}-[self]-[self proc]-[self class] set n [lindex $args 0] set callingClass - #puts stderr [self class]=[uplevel 1 self class]-[self callingclass] #catch {set callingClass [uplevel 1 self class]} set callingClass [self callingclass] if {$n == 0} { set result 1 } else { set f [my compute [expr {$n - 1}] x] set result [expr {$n * $f}] } if {$callingClass != [self class]} { next $result return $result } else { return $result } } ComputationOutput faculty faculty mixin RecFacultyMixin ::errorCheck [faculty compute 3] 6 \ "Mixin: faculty wrong result" ::errorCheck $mixinResult \ "-::faculty-compute-::RecFacultyMixin-::faculty-compute-::RecFacultyMixin-::faculty-compute-::RecFacultyMixin-::faculty-compute-::RecFacultyMixin-::faculty-compute-::Computation" \ "Mixin: faculty failed" set mixinResult "" ComputationOutput faculty ComputationOutput instmixin RecFacultyMixin ::errorCheck [faculty compute 3] 6 "Mixin: faculty wrong result" ::errorCheck $mixinResult \ "-::faculty-compute-::RecFacultyMixin-::faculty-compute-::RecFacultyMixin-::faculty-compute-::RecFacultyMixin-::faculty-compute-::RecFacultyMixin-::faculty-compute-::Computation" \ "Mixin: faculty failed" set ::mixinResult "" set ::calling "" Class GrObject GrObject instproc draw args { lappend ::mixinResult [list grObject [self] [self proc] [self class]] lappend ::calling [list grObject [self proc]: [self callingobject] [self callingclass] [self callingproc] [self next]] } Class Image -superclass GrObject Image instproc draw args { lappend ::mixinResult [list image [self] [self proc] [self class]] lappend ::calling [list image [self proc]: [self callingobject] [self callingclass] [self callingproc] [self next]] next } Class MenuDecorator MenuDecorator instproc draw args { lappend ::mixinResult [list m1 [self] [self proc] [self class]] lappend ::calling [list m1 [self proc]: [self callingobject] [self callingclass] [self callingproc] [self next]] next } Class ScrollBarDecorator ScrollBarDecorator instproc draw args { lappend ::mixinResult [list m2 [self] [self proc] [self class]] lappend ::calling [list m2 [self proc]: [self callingobject] [self callingclass] [self callingproc] [self next]] next } Image mainImage -mixin {MenuDecorator ScrollBarDecorator} Image zoom -mixin {ScrollBarDecorator} Object instproc f args { if {[self calledproc] ne "filter"} { lappend ::mixinResult [list filter [self] [self proc] [self class]] lappend ::calling [list filter [self proc]: [self callingobject] [self callingclass] [self callingproc] [self calledproc] [self next]] } return [next] } Object instfilter f mainImage draw zoom draw Object instfilter "" ::errorCheck $::calling \ "{filter f: ::mixinTest {} run draw {::MenuDecorator instproc draw}} {m1 draw: ::mixinTest {} run {::ScrollBarDecorator instproc draw}} {m2 draw: ::mixinTest {} run {::Image instproc draw}} {image draw: ::mixinTest {} run {::GrObject instproc draw}} {grObject draw: ::mixinTest {} run {}} {filter f: ::mixinTest {} run draw {::ScrollBarDecorator instproc draw}} {m2 draw: ::mixinTest {} run {::Image instproc draw}} {image draw: ::mixinTest {} run {::GrObject instproc draw}} {grObject draw: ::mixinTest {} run {}} {filter f: ::mixinTest {} run instfilter {::xotcl::Class instforward instfilter}} {filter f: ::xotcl::Object ::xotcl::Class instfilter assign {::xotcl::InterceptorSlot instcmd assign}}" \ "Mixin: Calling-Obj/Cl/Proc failed" ::errorCheck $::mixinResult \ "{filter ::mainImage f ::xotcl::Object} {m1 ::mainImage draw ::MenuDecorator} {m2 ::mainImage draw ::ScrollBarDecorator} {image ::mainImage draw ::Image} {grObject ::mainImage draw ::GrObject} {filter ::zoom f ::xotcl::Object} {m2 ::zoom draw ::ScrollBarDecorator} {image ::zoom draw ::Image} {grObject ::zoom draw ::GrObject} {filter ::xotcl::Object f ::xotcl::Object} {filter ::xotcl::Class::slot::instfilter f ::xotcl::Object}" \ "Mixin: Filter failed" set ::mixinResult "" set ::calling "" Class InfoTrace2 InfoTrace2 instproc infoTraceFilter2 args { lappend ::calling \ self [self] \ "self proc" [self proc] \ "self class" [self class] \ "self calledproc" [self calledproc] \ "self callingproc" [self callingproc] \ "self callingobject" [self callingobject] \ "self callingclass" [self callingclass] \ "self filterreg" [self filterreg] \ "self next" [self next] next } Class CallingObjectsClass CallingObjectsClass create callingObject Class FilterRegClass -superclass InfoTrace2 Class FilteredObjectsClass -superclass FilterRegClass FilteredObjectsClass filteredObject CallingObjectsClass instproc callingProc args { filteredObject set someVar 0 } FilterRegClass instfilter infoTraceFilter2 callingObject callingProc ::errorCheck $::calling \ {self ::filteredObject {self proc} infoTraceFilter2 {self class} ::InfoTrace2 {self calledproc} set {self callingproc} callingProc {self callingobject} ::callingObject {self callingclass} ::CallingObjectsClass {self filterreg} {::FilterRegClass instfilter infoTraceFilter2} {self next} {::xotcl::Object instcmd set}} \ "call stack info" Class M1; Class M2; Class M3; Class M4 Class A; Class B -superclass A; B b A instmixin {M1 M2} B instmixin {M3 M1 M1 M4} b mixin {M1 M1 M4} ::errorCheck [b info mixin -order] "::M3 ::M4 ::M1 ::M2" "Mixin Info: -order option" ::errorCheck [B info instmixin]-[b info mixin] "::M3 ::M1 ::M4-::M1 ::M4" "Mixin Info: no duplicates" B instmixin {} ::errorCheck [b info mixin -order] "::M4 ::M1 ::M2" "Mixin Info: -order option" set ::r "" Class X11 -instproc test {args} { lappend ::r [self class] next } Class X12 -instproc test {args} { lappend ::r [self class] next } Class X -instmixin {X11 X12} -instproc test {args} { lappend ::r [self class] next } Class Y -instmixin X Y create y -test X create x -test ::errorCheck $::r [list ::X11 ::X12 ::X ::X11 ::X12 ::X] \ {transitive mixin} unset ::r # test for MixinRemoveFromMixinStack, MixinRemoveFromCmdPtr, # MixinRemoveOnObjFromCmdPtr Class A A instproc x {} {B destroy; next} Class B B instproc x {} {next} Class C C instproc x {} {next} Object o -mixin {A B C} o proc x {} {return x} ::errorCheck [o x] {x} {mixin destroy on stack} o destroy # testing transitive mixins; should be in both cases the same Class IM Class M Object o -mixin M M instmixin IM ::errorCheck [o info precedence] {::IM ::M ::xotcl::Object} \ {trans. mixin precedence 1} Object o -mixin M ::errorCheck [o info precedence] {::IM ::M ::xotcl::Object} \ {trans. mixin precedence 2} o destroy } @ TestX procsearchTest { description { Regression test for procsearch } } TestX procsearchTest -proc run {{n 10}} { Class M -instproc foo args {puts m;next} Object o -mixin M -proc foo args {puts o;next} ::errorCheck [o procsearch foo] "::M instproc foo" "mixin before proc in procsearch" M destroy o destroy Class CC -instproc foo args {puts CC;next} CC create c -proc foo args {puts c;next} ::errorCheck [c procsearch foo] "::c proc foo" "proc before instproc in procsearch" CC destroy c destroy } @ TestX mixinInheritanceTest { description { Regression test object testing per-object mixin inheritance. } } TestX mixinInheritanceTest -proc run {{n 10}} { for {set i 0} {$i < $n} {incr i} { global mixinResult set mixinResult "" Class A Class B Class C -superclass {A B} Class GeneralMixin Class RefinedMixin1 -superclass GeneralMixin Class RefinedMixin2 -superclass GeneralMixin Class AppMixin1 -superclass {RefinedMixin1 RefinedMixin2} Class AppMixin2 -superclass {RefinedMixin2 RefinedMixin1} Class AppMixin3 -superclass {RefinedMixin1} A instproc aProc args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return $args } B instproc aProc args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return $args } C instproc aProc args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next "$args [self class]"] } GeneralMixin instproc aProc args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next "$args [self class]"] } RefinedMixin1 instproc aProc args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next "$args [self class]"] } RefinedMixin2 instproc aProc args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next "$args [self class]"] } AppMixin1 instproc aProc args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next "$args [self class]"] } AppMixin1 mixinInstance set r [mixinInstance aProc ARGS1 ARGS2] ::errorCheck $mixinResult \ " ::AppMixin1 ::RefinedMixin1 ::RefinedMixin2 ::GeneralMixin" \ "Mixin inheritance: mixinInstance aProc" set mixinResult "" AppMixin3 mixinInstance2 set r [mixinInstance2 aProc ARGS1 ARGS2] ::errorCheck $mixinResult \ " ::RefinedMixin1 ::GeneralMixin" \ "Mixin inheritance: mixinInstance2 aProc" set mixinResult "" A a a mixin AppMixin1 set r [a aProc ARGS1 ARGS2] ::errorCheck $mixinResult \ " ::AppMixin1 ::RefinedMixin1 ::RefinedMixin2 ::GeneralMixin ::A" \ "Mixin inheritance: a aProc" ::errorCheck $r \ "{{{{ARGS1 ARGS2 ::AppMixin1} ::RefinedMixin1} ::RefinedMixin2} ::GeneralMixin}" \ "Mixin inheritance result: a aProc" A a A instmixin AppMixin1 set mixinResult "" set r [a aProc ARGS1 ARGS2] ::errorCheck $mixinResult \ " ::AppMixin1 ::RefinedMixin1 ::RefinedMixin2 ::GeneralMixin ::A" \ "Instmixin inheritance: a aProc" ::errorCheck $r \ "{{{{ARGS1 ARGS2 ::AppMixin1} ::RefinedMixin1} ::RefinedMixin2} ::GeneralMixin}" \ "Instmixin inheritance: a aProc" set mixinResult "" C c c mixin {AppMixin3 AppMixin2} set r [c aProc ARGS1 ARGS2] ::errorCheck $mixinResult \ " ::AppMixin1 ::RefinedMixin1 ::RefinedMixin2 ::GeneralMixin ::C ::A" \ "Mixin/Instmixin inheritance: c aProc" set mixinResult "" A instmixin {} set r [c aProc ARGS1 ARGS2] ::errorCheck $mixinResult \ " ::RefinedMixin2 ::RefinedMixin1 ::GeneralMixin ::C ::A" \ "Mixin/Instmixin inheritance: c aProc" GeneralMixin instproc set args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next] } RefinedMixin1 instproc set args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next] } AppMixin1 instproc set args { global mixinResult; ::set mixinResult "$mixinResult [self class]" return [next] } global setFilterResult set setFilterResult "" Object instproc setFilter args { global setFilterResult ::append setFilterResult \ -[self]-[self calledproc]-[self calledclass] next } Object instfilter setFilter set mixinResult "" set r [c set setVar 111] ::errorCheck $mixinResult \ " ::RefinedMixin1 ::GeneralMixin" \ "Mixin inheritance: c set" # UNKNOWN PROBLEM 2 # ::errorCheck [c setsetVar] 111 "Mixin inheritance: c set - value" ::errorCheck [c set setVar] 111 "Mixin inheritance: c set - value" set mixinResult "" mixinInstance set setVar 222 ::errorCheck $mixinResult \ " ::AppMixin1 ::RefinedMixin1 ::GeneralMixin" \ "Mixin inheritance: mixinInstance set" ::errorCheck [mixinInstance set setVar] 222\ "Mixin inheritance: mixinInstance set - value" ::errorCheck $setFilterResult \ "-::c-set-::xotcl::Object-::c-set-::xotcl::Object-::mixinInstance-set-::AppMixin1-::mixinInstance-set-::AppMixin1" \ "Mixin inheritance: Wrong classes in mixin set test" Object instfilter "" } # Mixin init test global initResult set initResult "" Class A A instproc init args { my mixin B global initResult append initResult [self class]- next } Class C C instproc init args { global initResult append initResult [self class]- next } Class B -superclass C B instproc init args { global initResult append initResult [self class]- next } Class D D instproc init args { global initResult append initResult [self class]- next } A a ::errorCheck $initResult "::A-" "Mixin init 1 failed" set initResult "" # in A mixin changes to B - before D's constructor must # be called A b -mixin D ::errorCheck $initResult "::D-::A-" "Mixin init 2 failed" Class Mix Mix instproc init args { global initResult append initResult [self class]- next } Class Mix1 Mix1 instproc init args { global initResult append initResult [self class]- next } Class Mix2 Mix2 instproc init args { global initResult append initResult [self class]- next } Class A A instproc init args { global initResult append initResult [self class]- next } Class B B instproc init args { my mixin {Mix Mix1} global initResult append initResult [self class]- next } set initResult "" A a a mixin {Mix Mix1} ::errorCheck $initResult ::A- "Mixin init 3 failed" set initResult "" B b ::errorCheck $initResult ::B- "Mixin init 4 failed" set initResult "" B mixin add Mix2 ::errorCheck $initResult "" "Mixin init 5 failed" set initResult "" A mixin {}; A mixin {Mix Mix1} ::errorCheck $initResult "" "Mixin init 6 failed" set initResult "" A a -mixin {Mix} ::errorCheck $initResult "::Mix-::A-" "Mixin init 7 failed" Class Strategy Strategy instproc init args { global initResult append initResult [self class]- next } Class A A instproc strategy {n} { set a [my info mixin] my mixin [concat $n $a] } A instproc init args { global initResult append initResult [self class]- next } Class Mix1 Mix1 instproc init args { global initResult append initResult [self class]- my strategy Strategy next } set initResult "" A a -mixin Mix1 ::errorCheck $initResult ::Mix1-::A- "Mixin init 8 failed" set initResult "" Class X X instproc init args { append ::initResult " [self]: [self class]->[self proc]" next } Class Y -superclass X Y instproc init args { append ::initResult " [self]: [self class]->[self proc]" next } Class U -superclass X U instproc init args { append ::initResult " [self]: [self class]->[self proc]" next } Class V V instproc init args { append ::initResult " [self]: [self class]->[self proc]" next } Class A A instproc init args { append ::initResult " [self]: [self class]->[self proc]" next } Class B -superclass A B instproc init args { append ::initResult " [self]: [self class]->[self proc]" next } A a a mixin X B b b mixin Y A a2 -mixin Y B b2 -mixin X A a3 -mixin {U V} B b3 b3 mixin {U V} A a3 A instmixin X A instmixin {} B instmixin Y B b3 b3 mixin Y ::errorCheck $initResult \ " ::a: ::A->init ::b: ::B->init ::b: ::A->init ::a2: ::Y->init ::a2: ::X->init ::a2: ::A->init ::b2: ::X->init ::b2: ::B->init ::b2: ::A->init ::a3: ::U->init ::a3: ::X->init ::a3: ::V->init ::a3: ::A->init ::b3: ::B->init ::b3: ::A->init ::a3: ::A->init ::b3: ::Y->init ::b3: ::X->init ::b3: ::B->init ::b3: ::A->init" \ "Mixin init 9 failed" } @ TestX copymove { description {Regression test for copy/move methods} } TestX copymove -proc run {{n 10}} { # Composite Class Composite -superclass Class Composite instproc addop {op} { my instvar ops set ops($op) $op } Composite instproc compositeFilter args { set m [self calledproc] set c [lindex [self filterreg] 0] set r [next] if {[$c exists ops($m)]} { foreach child [my info children] { eval [self]::$child $m $args } } return $r } Composite AbstractNode AbstractNode abstract instproc iterate v AbstractNode addop iterate for {set i 0} {$i < $n} {incr i} { # # class copy # Class X Class X::Y Class X::Y::Z -parameter { {param1 1} {param2 2} } #X::Y::Z metadata add {Version Author Nothing} #X::Y::Z metadata Version {0.0.9} #X::Y::Z metadata Author {Uwe} X::Y::Z instproc defaultValueIP {{a defA} {b defB} v} { return } X::Y::Z proc defaultValueP {{c defC} {d defD} v} { return } X::Y::Z instinvar {{7 > 6} { #a comment } } X::Y::Z instproc assProc {} {puts x} {{5 > 4} { #pre }} {{5 > 4} { #post } } X::Y::Z check {pre post instinvar} foreach C {X X::Y X::Y::Z} { $C instproc q {a b c} { return [self]--[self class]--[self proc]--[next]-- } } X::Y::Z z X::Y::Z copy V V v ::errorCheck "[z q 1 2 3]--[X::Y::Z info class]--[X::Y::Z info classparent]" \ "::z--::X::Y::Z--q------::xotcl::Class--::X::Y"\ "class copy z" ::errorCheck "[v q 1 2 3]--[V info class]--[V info classparent]" "::v--::V--q------::xotcl::Class--::"\ "class copy v" ::errorCheck "[::cutSpaces [V info parameter]--[v set param1]--[v set param2]]" \ " {param1 1} {param2 2} --1--2" \ "parameter test" ::errorCheck "[::cutSpaces [V info instinvar]--[V info instpre assProc]--[V info instpost assProc]]"\ "{7 > 6} { #a comment }--{5 > 4} { #pre }--{5 > 4} { #post }"\ "Copy Class Assertions" #::errorCheck "[V info metadata]--[V metadata Author]--[V metadata Version]--[V metadata Nothing]"\ "Version Author Nothing--Uwe--0.0.9--"\ "Copy Metadata" set df1 [V info default defaultValueP v dfv1] set df2 [V info default defaultValueP c dfv2] set df3 [V info instdefault defaultValueIP v dfv3] set df4 [V info instdefault defaultValueIP a dfv4] ::errorCheck "$df1 $dfv1 $df2 $dfv2 $df3 $dfv3 $df4 $dfv4"\ "0 1 defC 0 1 defA"\ "Copy Default Values" # class hierarchy copy Class O X copy O::X O::X x1; O::X::Y y1; O::X::Y::Z z1 ::errorCheck "[x1 q 1 2 3]--[y1 q 1 2 3]--[z1 q 1 2 3]" \ "::x1--::O::X--q------::y1--::O::X::Y--q------::z1--::O::X::Y::Z--q----"\ "class hierarchy copy" # # object copy # X x -set var1 12 -requireNamespace proc ::x::tclProc args {return tclProc} x proc q {a b c} {return [self]--[self class]--[self proc]--[next]--} x copy y ::errorCheck "[::y::tclProc]--[x q 1 2 3]--[y q 1 2 3]" \ "tclProc--::x----q--::x--::X--q--------::y----q--::y--::X--q------"\ "object copy" # object hierarchy copy x copy x::a x copy x::a::z ::errorCheck "[::x::a::tclProc]--[::x::a::z::a::tclProc]" \ "tclProc--tclProc"\ "object hierarchy copy" Class O O x x invar {{7 > 5} { #a comment }} x proc assProc {} {return} {{5 > 3} { #pre }} {{5 > 4} {#post }} x set var1 12 x proc p1 {} {return [self]-p1} x copy y ::errorCheck "[x p1]--[x set var1]--[::x info class]" "::x-p1--12--::O"\ "Simple Copy - Origin" ::errorCheck "[y p1]--[y set var1]--[::y info class]" "::y-p1--12--::O"\ "Simple Copy - Duplicate" ::errorCheck "[::cutSpaces [y info invar]--[y info pre assProc]--[y info post assProc]]"\ "{7 > 5} { #a comment }--{5 > 3} { #pre }--{5 > 4} {#post }"\ "Copy Obj Assertions" # # move test # V destroy X::Y::Z move V V v ::errorCheck "[v q 1 2 3]--[V info class]--[V info classparent]" "::v--::V--q------::xotcl::Class--::"\ "class move v" ::errorCheck "[::cutSpaces [V info parameter]--[v set param1]--[v set param2]]" \ " {param1 1} {param2 2} --1--2" \ "parameter move test" ::errorCheck "[::cutSpaces [V info instinvar]--[V info instpre assProc]--[V info instpost assProc]]"\ "{7 > 6} { #a comment }--{5 > 4} { #pre }--{5 > 4} { #post }"\ "Move Class Assertions" #::errorCheck "[V info metadata]--[V metadata Author]--[V metadata Version]--[V metadata Nothing]"\ "Version Author Nothing--Uwe--0.0.9--"\ "Move Metadata" set df1 [V info default defaultValueP v dfv1] set df2 [V info default defaultValueP c dfv2] set df3 [V info instdefault defaultValueIP v dfv3] set df4 [V info instdefault defaultValueIP a dfv4] ::errorCheck "$df1 $dfv1 $df2 $dfv2 $df3 $dfv3 $df4 $dfv4"\ "0 1 defC 0 1 defA"\ "Move Default Values" ::errorCheck [::info commands X::Y::Z] "" "Moved command still exists" # # copy with filters test # foreach filters {{} compositeFilter} { Composite instfilter $filters AbstractNode instfilter $filters Object commands Class Commands -superclass AbstractNode Class Command -superclass Commands Command instproc init args { my instvar label set label [self] next } Command instproc setlabel {{arg ""}} { my instvar label if {$arg eq ""} { set label } else { set label $arg } } Command instproc setproc {value} { my instvar src set src $value } # prototypes Command commands::cellcmd commands::cellcmd setlabel cell commands::cellcmd setproc {return "coucou" } commands::cellcmd proc x args {return xxx} commands::cellcmd copy toto ::errorCheck [::toto info class] ::Command "Copy with Filter: info class" ::errorCheck [toto set label] cell "Copy with Filter: set var" ::errorCheck [toto x] xxx "Copy with Filter: call proc" ::errorCheck [commands::cellcmd set label] cell \ "Copy with Filter: set var" } Class A Class V Class Z Class B -superclass A Class B1 -superclass {V A Z} A move X ::errorCheck [B info superclass]-[B1 info superclass]-[X info subclass] \ "::X-::V ::X ::Z-::B ::B1" \ "Move of subclass relationship" # # test nonpos args # Class X X proc do0 {arg1 arg2} {puts "$arg1 $arg2"} X proc do1 {-arg1 -arg2} {puts "$arg1 $arg2"} X proc do2 {-arg1 arg2} {puts "$arg1 $arg2"} X proc do3 {arg1 {arg2 d1}} {puts "$arg1 $arg2"} X proc do4 {-arg1 {-arg2 d2}} {puts "$arg1 $arg2"} X proc do5 {{-arg1 d3} {arg2 d4}} {puts "$arg1 $arg2"} X instproc do6 {{-arg1 d3} {arg2 d4}} {puts "$arg1 $arg2"} X copy Y foreach m [lsort [X info procs]] { foreach info {args nonposargs} { set x [X info $info $m] set y [Y info $info $m] ::errorCheck $x $y "copy nonposargs: $x ne $y" } foreach a [X info args $m] { set vx ""; set vy "" set dx [X info default $m $a vx] set dy [Y info default $m $a vy] ::errorCheck $dx $dy "copy nonposargs: hasdefault $dx ne $dy" if {[info exists dx] && [info exists dy]} { ::errorCheck $vx $vy "copy nonposargs: hasdefault value $vx ne $vy" } } } foreach m [lsort [X info instprocs]] { foreach info {instargs instnonposargs} { set x [X info $info $m] set y [Y info $info $m] ::errorCheck $x $y "copy inst nonposargs: $x ne $y" } foreach a [X info instargs $m] { set vx ""; set vy "" set dx [X info instdefault $m $a vx] set dy [Y info instdefault $m $a vy] ::errorCheck $dx $dy "copy inst nonposargs: hasdefault $dx ne $dy" if {[info exists dx] && [info exists dy]} { ::errorCheck $vx $vy "copy inst nonposargs: hasdefault value $vx ne $vy" } } } Object X X proc do0 {arg1 arg2} {puts "$arg1 $arg2"} X proc do1 {-arg1 -arg2} {puts "$arg1 $arg2"} X proc do2 {-arg1 arg2} {puts "$arg1 $arg2"} X proc do3 {arg1 {arg2 d1}} {puts "$arg1 $arg2"} X proc do4 {-arg1 {-arg2 d2}} {puts "$arg1 $arg2"} X proc do5 {{-arg1 d3} {arg2 d4}} {puts "$arg1 $arg2"} X copy Y foreach m [lsort [X info procs]] { foreach info {args nonposargs} { set x [X info $info $m] set y [Y info $info $m] ::errorCheck $x $y "copy nonposargs: $x ne $y" } foreach a [X info args $m] { set vx ""; set vy "" set dx [X info default $m $a vx] set dy [Y info default $m $a vy] ::errorCheck $dx $dy "copy nonposargs: hasdefault $dx ne $dy" if {[info exists dx] && [info exists dy]} { ::errorCheck $vx $vy "copy nonposargs: hasdefault value $vx ne $vy" } } } } } @ TestX recreation { description { Regression test for object recreation/cleanup. } } TestX recreation -proc run {{n 10}} { for {set i 0} {$i < $n} {incr i} { set ::recreateResult "" Class R R instproc recreate args { global recreateResult append recreateResult "*recreate [self] $args* " set r [next] append recreateResult "*recreate [self] <[lindex $args 0]> $r * " return $r } Object instmixin R catch { C destroy c1 destroy } Class C -parameter {a b} C instproc cProc {} {return cProc} C set r 4 C set v 5 C c1 -a 1 c1 proc x {} {return p} c1 set x 3 C c1 -b 2 append ::recreateResult "+[c1 info vars]," append ::recreateResult "[c1 info procs] +" Class C C set w 3 append ::recreateResult "+[C info vars]," append ::recreateResult "[C info instprocs] +" if {$i > 0} { errorCheck [set ::recreateResult] \ "*recreate ::xotcl::Class ::R* *recreate ::xotcl::Class <::R> ::R * *recreate ::C ::c1 -b 2* *recreate ::C <::c1> ::c1 * +b, +*recreate ::xotcl::Class ::C* *recreate ::xotcl::Class <::C> ::C * +w, +" \ "Var/proc recreate delete failed (n)" } else { errorCheck [set ::recreateResult] \ "*recreate ::C ::c1 -b 2* *recreate ::C <::c1> ::c1 * +b, +*recreate ::xotcl::Class ::C* *recreate ::xotcl::Class <::C> ::C * +w, +" \ "Var/proc recreate delete failed (0)" } global recreateMixinResult global recreateFilterResult set recreateMixinResult "" set recreateFilterResult "" Class RecreateObserve foreach ip {create destroy instdestroy init configure recreate cleanup alloc class} { RecreateObserve instproc $ip args { append ::recreateMixinResult " [self]+[self class]->[self proc]" next } } Class Recreated Recreated instproc recreationFilter args { append ::recreateFilterResult " [self]+[self calledclass]->[self calledproc]" next } Recreated instfilter recreationFilter Recreated mixin RecreateObserve Recreated instmixin RecreateObserve Recreated recreateObj Recreated recreateObj recreateObj destroy errorCheck [set ::recreateFilterResult] \ " ::recreateObj+::xotcl::Object->configure ::recreateObj+::xotcl::Object->init ::recreateObj+::xotcl::Object->cleanup ::recreateObj+::xotcl::Object->configure ::recreateObj+::xotcl::Object->init ::recreateObj+::xotcl::Object->destroy" \ "recreateObj - recreateFilterResult" if {$i == 0} { errorCheck [set ::recreateMixinResult] \ " ::Recreated+::RecreateObserve->create ::Recreated+::RecreateObserve->alloc ::recreateObj+::RecreateObserve->configure ::recreateObj+::RecreateObserve->init ::Recreated+::RecreateObserve->create ::Recreated+::RecreateObserve->recreate ::recreateObj+::RecreateObserve->cleanup ::recreateObj+::RecreateObserve->configure ::recreateObj+::RecreateObserve->init ::recreateObj+::RecreateObserve->destroy ::Recreated+::RecreateObserve->instdestroy" \ "recreateObj - recreateMixinResult (0)" } else { errorCheck [set ::recreateMixinResult] \ " ::Recreated+::RecreateObserve->cleanup ::Recreated+::RecreateObserve->create ::Recreated+::RecreateObserve->alloc ::recreateObj+::RecreateObserve->configure ::recreateObj+::RecreateObserve->init ::Recreated+::RecreateObserve->create ::Recreated+::RecreateObserve->recreate ::recreateObj+::RecreateObserve->cleanup ::recreateObj+::RecreateObserve->configure ::recreateObj+::RecreateObserve->init ::recreateObj+::RecreateObserve->destroy ::Recreated+::RecreateObserve->instdestroy" \ "recreateObj - recreateMixinResult (n)" } } set ::cleanupResult "" catch {a destroy} catch {A destroy} catch {X destroy} catch {META destroy} Class A A proc instdestroy args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} A proc recreate args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} A instproc destroy args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} A instproc cleanup args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} A a A a::b errorCheck [set ::cleanupResult] "" "Cleanup Create Failed" A a errorCheck [a info children] "" "Cleanup Object Children Destroy Failed" A a::b errorCheck [set ::cleanupResult] \ " ::A+->recreate ::a+::A->cleanup ::a::b+::A->destroy ::A+->instdestroy" \ "Cleanup a/a::b Failed (n)" a destroy; set ::cleanupResult "" A instproc cleanup args {append ::cleanupResult " [self]+[self class]->[self proc]"} A a A a::b errorCheck [set ::cleanupResult] "" "Cleanup Redefine Create Failed" A a errorCheck [a info children] ::a::b \ "Cleanup Redefine Object Children Survive Failed" A a::b errorCheck [set ::cleanupResult] \ " ::A+->recreate ::a+::A->cleanup ::A+->recreate ::a::b+::A->cleanup" \ "Cleanup Redefine a/a::b Failed" a destroy set ::cleanupResult "" Class META -superclass Class META proc instdestroy args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} META proc recreate args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} META instproc destroy args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} META instproc cleanup args {append ::cleanupResult " [self]+[self class]->[self proc]"; next} META X META X::Y errorCheck [set ::cleanupResult] "" "Class Cleanup Create Failed" META X errorCheck [X info classchildren] "" "Class Cleanup Class Children Destroy Failed" META X::Y errorCheck [set ::cleanupResult] \ " ::META+->recreate ::X+::META->cleanup ::X::Y+::META->destroy ::META+->instdestroy" \ "Class Cleanup X/X::Y Failed" X destroy set ::cleanupResult "" META instproc cleanup args {append ::cleanupResult " [self]+[self class]->[self proc]"} META X META X::Y errorCheck [set ::cleanupResult] "" "Class Cleanup Redefine Create Failed" META X errorCheck [X info classchildren] ::X::Y \ "Class Cleanup Redefine Class Children Survive Failed" META X::Y errorCheck [set ::cleanupResult] \ " ::META+->recreate ::X+::META->cleanup ::META+->recreate ::X::Y+::META->cleanup" \ "Class Cleanup Redefine X/X::Y Failed" X destroy A destroy META destroy unset ::cleanupResult Object instmixin "" # upgrading/downgrading Class B Class C -superclass B C c1 Object o1 -mixin B Object o2 -mixin C ::errorCheck [B info class] "::xotcl::Class" "up/down before 0" ::errorCheck [c1 istype B] 1 "up/down before 1" ::errorCheck [C info superclass] ::B "up/down before 2" ::errorCheck [B info subclass] ::C "up/down before 3" ::errorCheck [o1 info mixin] ::B "up/down before 4" ::errorCheck [o2 info mixin] ::C "up/down before 5" ::errorCheck [B info mixinof] ::o1 "up/down before 6" ::errorCheck [C info mixinof] ::o2 "up/down before 7" ::errorCheck [c1 info precedence] "::C ::B ::xotcl::Object" "up/down before 8" ::errorCheck [o1 info precedence] "::B ::xotcl::Object" "up/down before 9" ::errorCheck [o2 info precedence] "::C ::B ::xotcl::Object" "up/down before 10" ::errorCheck [catch {B class Object}] 1 "don't allow downgrading" Object B ::errorCheck [B info class] "::xotcl::Object" "up/down after 0" ::errorCheck [c1 istype B] 0 "up/down after 1" ::errorCheck [C info superclass] ::xotcl::Object "up/down after 2" ::errorCheck [catch {B info subclass}] 1 "up/down after 3" ::errorCheck [o1 info mixin] "" "up/down after 4" ::errorCheck [o2 info mixin] ::C "up/down after 5" ::errorCheck [catch {B info mixinof}] 1 "up/down after 6" ::errorCheck [C info mixinof] ::o2 "up/down after 7" ::errorCheck [c1 info precedence] "::C ::xotcl::Object" "up/down after 8" ::errorCheck [o1 info precedence] "::xotcl::Object" "up/down after 9" ::errorCheck [o2 info precedence] "::C ::xotcl::Object" "up/down after 10" ::errorCheck [B info class] "::xotcl::Object" "up/down after 0x" B class Object ::errorCheck [catch {B class Object}] 0 "don't complain when same level" ::errorCheck [catch {B class Class}] 1 "don't allow upgrading" } @ TestX smallScripts { description { Regression test object testing arbitrary features. } } TestX smallScripts proc ::up1 {} { return [uplevel 1 self] } proc ::up3 {} { return [uplevel 3 self] } proc ::up2 {} { return [up3] } smallScripts proc run {{n 20}} { catch {Object o; o r} errMsg ::errorCheck $errMsg "::o: unable to dispatch method 'r'" "Unknown Test" # uplevel test for {set i 0} {$i < $n} {incr i} { Object o o proc u2 {} {return [::up2]} o proc u1 {} {return [::up1]} Class SM SM instproc init args { ::errorCheck [o u1] "::o" "FAILED - UpLevel Test 1" ::errorCheck [o u2] "::s" "FAILED - UpLevel Test 2" } SM s } for {set i 1} {$i < $n} {incr i} { Class A A a set oname1 [Object autoname ooo] set oname2 [Object autoname -instance OOO] A autoname -reset AAA set names [A autoname AAA] a autoname -reset aaa lappend names [a autoname aaa] lappend names [a autoname aaa] ::errorCheck $names "AAA1 aaa1 aaa2" "Autoname creation" ::errorCheck $oname1 "ooo$i" "Autoname Object 1" ::errorCheck $oname2 "oOO$i" "Autoname Object 2" ::errorCheck [xotcl::Object set __autonames(ooo)] $i \ "Autoname Object Count" } Class P; P p P instproc x {} { my instvar "x(1) t" return $t } p set x(1) rrr ::errorCheck [p x] rrr "Array member alias, no ns" Object o o proc x {} { my instvar "x(1) t" return $t } o set x(1) rrr ::errorCheck [o x] rrr "Array member alias, with ns" Object o o proc x args {puts r} ::errorCheck [o info body x] "puts r" "Info Body" if {$::tcl_version < "8.6"} { ::errorCheck [info body o::x] "puts r" "Info Body" } Object o o proc a {} { my lappend table(i) xxx } ::errorCheck [o a]-[o set table(i)] "xxx-xxx" "Array instvar create" Class A A instproc myProc args {} Class Mix1 Mix1 instproc myProcMix1 args {} Class Mix2 Mix2 instproc myProcMix2 args {} Class B -superclass A -instmixin Mix1 B instproc myProc2 args {} B b -mixin Mix2 b proc objproc args {} ::errorCheck [b info procs] objproc "info procs" ::errorCheck [B info instprocs] myProc2 "info instprocs" ::errorCheck [lsort [b info methods]] "__next abstract append array autoname check class cleanup configure contains copy defaultmethod destroy eval exists extractConfigureArg f filter filterguard filtersearch forward hasclass incr info infoTraceFilter init instvar invar isclass ismetaclass ismixin isobject istype lappend method mixin mixinguard move myProc myProc2 myProcMix1 myProcMix2 noinit objproc parametercmd proc procsearch requireNamespace self set setFilter signature subst trace unset uplevel upvar volatile vwait" "b info methods" ::errorCheck [lsort [b info methods -nocmds]] "abstract contains copy defaultmethod extractConfigureArg f hasclass infoTraceFilter init method move myProc myProc2 myProcMix1 myProcMix2 objproc self setFilter signature" "b info methods -nocmds" ::errorCheck [lsort [b info methods -noprocs]] "__next append array autoname check class cleanup configure destroy eval exists filter filterguard filtersearch forward incr info instvar invar isclass ismetaclass ismixin isobject istype lappend mixin mixinguard noinit parametercmd proc procsearch requireNamespace set subst trace unset uplevel upvar volatile vwait" "b info methods -noprocs" ::errorCheck [lsort [b info methods -nocmds -nomixins]] "abstract contains copy defaultmethod extractConfigureArg f hasclass infoTraceFilter init method move myProc myProc2 objproc self setFilter signature" "b info methods -nocmds -nomixins" ::errorCheck [b info methods -nocmds -noprocs] "" "b info methods -nocmds -noprocs" ::errorCheck [lsort [B info methods -nocmds]] "abstract allinstances contains copy defaultmethod extractConfigureArg f hasclass infoTraceFilter init method move parameter self setFilter signature uses" "B info methods -nocmds" namespace eval a { proc o args {return o} } namespace eval a::b { proc b args {return b} } Object a a requireNamespace set r [a::b::b] Object a::b a::b proc x args { return x } set r "$r-[a::b x]-[a o]" ::errorCheck $r b-x-o "Tcl Namespace should survive requireNamespace" xotcl::interp create in set ::r [in eval { namespace import -force xotcl::* Object o}] xotcl::interp delete in ::errorCheck $::r ::o "XOTcl slave interpreter " Object o -requireNamespace o set r 1 after 100 {o set r 3} o vwait r ::errorCheck [o set r] 3 "Vwait test" Class NS Class NS::Main NS::Main proc m1 {} { my m2 } NS::Main proc m2 {} { namespace eval :: Object toplevelObj } NS::Main m1 ::errorCheck [::toplevelObj set a 1] 1 "toplevel object allocated in ns" namespace eval foo { Class Foo Foo instproc blah {} {puts jou} Foo proc bar {} {puts bar} } namespace delete foo ::errorCheck [Object isobject ::foo::Foo] 0 "Namespace delete under object" # destroy test set x [Object create x] x destroy ::errorCheck [catch {$x set a 1}] 1 "Reference to destroyed object still valid" Object create x -volatile unset x ::errorCheck [catch {x destroy}] 1 "Object should not exist anymore" Object create x -volatile x destroy ::errorCheck [catch {unset x}] 1 "Variable should not exist anymore" } @ TestX objectReferences { description { Regression test for object and class references in tcl_objs } } TestX objectReferences -proc run {{n 20}} { my proc ok01 {} { Class AAA AAA destroy Class AAA } my proc ok02 {} { Class ::AAA AAA destroy Class AAA } my proc ok03 {} { Class ::AAA ::AAA destroy Class AAA } my proc ok04 {} { Class ::AAA ::AAA destroy Class ::AAA } my proc ok05 {} { set c [Class AAA] $c destroy Class AAA } my proc ok06 {} { set c [Class ::AAA] $c destroy Class AAA } my proc ok07 {} { set c [Class ::AAA] $c destroy Class ::AAA } my proc ok08 {} { set c [Class ::AAA] $c destroy Class $c } my proc ok09 {} { [Class AAA] destroy Class AAA } my proc ok10 {} { [Class ::AAA] destroy Class AAA } my proc ok11 {} { [Class ::AAA] destroy Class ::AAA } for {set i 1} {$i < 20} {incr i} { # "reference to xotcl object in instvar" Class LexxTreeMounter Class LexxTree LexxTreeMounter proc new {args} { if {[LexxTree exists LexxTreeMounter]} { set o [LexxTree set LexxTreeMounter] } else { set o [my create [my autoname [self]]] } $o incr C(refcnt) return $o } LexxTreeMounter instproc init {args} { my instvar C set C(refcnt) 0 if {[LexxTree exists LexxTreeMounter] == 0} { LexxTree set LexxTreeMounter [self] } next } set x [LexxTreeMounter new] set x [LexxTreeMounter new] ::errorCheck [llength [LexxTreeMounter info instances]] 1 singleton # "Global reference to xotcl object" set ::v [Object ::a] set ::w [Object ::b] set ::z(1) [Object ::c] unset ::v # "Class creation and Class destroys, after 2nd round procs contain xotcl-object references" foreach m [lsort [my info procs ok*]] {my $m} ::errorCheck [my isobject AAA] 1 classdestroys } catch {UnknownClass destroy} set ::utest "" Class proc __unknown args { lappend ::utest $args set x [Class $args] set r [$x] #puts r=$r return $r } Class O -superclass UnknownClass ::errorCheck $::utest ::UnknownClass "__unknown 1" Object o ::errorCheck [o mixin XX1] ::XX1 "__unknown XX1" namespace eval "" { Object o ::errorCheck [o mixin XX2] ::XX2 "__unknown XX2" } namespace eval "::" { Object o ::errorCheck [o mixin XX3] ::XX3 "__unknown XX3" } # this version of unknown creates gobal objects Class proc __unknown {name} { #puts "unkown called with $name" set name ::[namespace tail $name] set x [Class $name] set r [$x] #puts "... created $r" return $r } Object o ::errorCheck [o mixin XY1] ::XY1 " __unknown XY1" namespace eval "" { Object o ::errorCheck [o mixin XY2] ::XY2 " __unknown XY2" } namespace eval :: { Object o ::errorCheck [o mixin XY3] ::XY3 " __unknown XY3" } Class C namespace eval ::tmp { Object o -mixin C ::errorCheck [o mixin XY4] ::XY4 " __unknown XY4" } ::errorCheck [lsort [UnknownClass info info]] {args body children class classchildren classparent commands default filter filterguard forward heritage info instances instbody instcommands instdefault instfilter instfilterguard instforward instinvar instmixin instmixinof instpost instpre instprocs invar methods mixin mixinof parameter parent post pre precedence procs subclass superclass vars} "info info" # clear unknown handler to avoid strange results later Class proc __unknown "" "" ::errorCheck [Class info instances *Unk*] ::UnknownClass "match in info instances" ::errorCheck [Class info instances Unk*] "::UnknownClass" "no match in info instances" ::errorCheck [Class info instances Unk] "" "no match in info instances (no metachars)" ::errorCheck [Class info class] ::xotcl::Class "info class of Class" ::errorCheck [Class info precedence ::xotcl::Object] ::xotcl::Object "info class of Class Object" Class C Class D -superclass C Class E -superclass D -parameter {{x 1}} E instproc t {a b {c 1}} {return ok} E proc p {a b {c 1}} {return ok} E instproc q {} {return [self proc]} ::errorCheck [C info subclass D] ::D "transitive subclass 0" ::errorCheck [C info subclass E] "" "transitive subclass 0a" ::errorCheck [C info subclass -closure E] ::E "transitive subclass 1" ::errorCheck [Object info subclass -closure E] ::E "transitive subclass 2" ::errorCheck [D info subclass -closure C] "" "transitive subclass 3" ::errorCheck [E info heritage] "::D ::C ::xotcl::Object" "heritage" ::errorCheck [E info instargs t] "a b c" "instargs" ::errorCheck [E info instdefault t c x] 1 "instdefault" ::errorCheck [E info args p] "a b c" "args" ::errorCheck [E info default p c x] 1 "default" ::errorCheck [E configure [list -p -x -y]] 0 "list params 1" ::errorCheck [E e1 [list -t -1 -e -3]] ::e1 "list params 2" ::errorCheck [e1 x] 1 "instparameter cmd 1" ::errorCheck [e1 x 2] 2 "instparameter cmd 2" ::errorCheck [e1 x] 2 "instparameter cmd 3" ::errorCheck [e1 parametercmd y] "" "parametercmd 1" ::errorCheck [e1 y 3] 3 "parametercmd 2" ::errorCheck [e1 y] 3 "parametercmd 3" ::errorCheck [e1 forward regexp -objscope] "" "forward 1" ::errorCheck [e1 regexp (y) xyz _ X] "1" "forward 2" ::errorCheck [e1 exists X] "1" "forward 3" ::errorCheck [e1 q] q "self proc" ::errorCheck [E info commands] {p slot} "class commands" ::errorCheck [E info instcommands] "t x q" "class instcommands" ::errorCheck [E info instbody t] "return ok" "class info instbody" Object o Object o::abc Object o::bcd Object o::cde namespace eval ns1 {Class C; namespace export C} o eval {namespace import ::ns1::*} ::errorCheck [o info children] "::o::cde ::o::bcd ::o::abc" "info children 1" ::errorCheck [o info children *cd*] "::o::cde ::o::bcd" "info children 2" ::errorCheck [o info children ::o::cde] ::o::cde "info children 3" ::errorCheck [o info children ::o::def] "" "info children 4" Object new -childof o ::errorCheck [llength [o info children]] 4 "info children 5" ::errorCheck [Object isobject o] 1 "is object 1" ::errorCheck [Object isobject ox] 0 "is object 2" Class M -superclass Class ::errorCheck [Object ismetaclass M] 1 "is metaclass 1" ::errorCheck [Object ismetaclass C] 0 "is metaclass 0" Class X ::errorCheck [Object ismetaclass X] 0 "is metaclass 0" ::errorCheck [X isclass] 1 "is isclass 1" ::errorCheck [Class info instances X] ::X "is an instance of Class" ::errorCheck [catch {X class Object}] 1 "turn class into an object (error)" Class Y -superclass X Object o1 -mixin Y ::errorCheck [o1 info precedence] "::Y ::X ::xotcl::Object" "normal mixin precedence" Object X ;# turn class X into Object X (via destroy/create) ::errorCheck [o1 info precedence] "::Y ::xotcl::Object" "reduced mixin precedence" X destroy Y destroy o1 destroy Class M -superclass Class M create m1 ::errorCheck [Object ismetaclass M] 1 "is metaclass 1" ::errorCheck [M isclass] 1 "is isclass 1" ::errorCheck [Class info instances M] ::M "is an instance of Class" ::errorCheck [m1 info class] ::M "m1 is an instance of the meta-class" ::errorCheck [m1 isclass] 1 "m1 is isclass 1" ::errorCheck [m1 info class] ::M "m1 is of class ::M" Object M ;# make object from metaclass ::errorCheck [Object ismetaclass M] 0 "is metaclass 0" ::errorCheck [M isclass] 0 "is isclass 0" ::errorCheck [Class info instances M] "" "is not an instance of Class" ::errorCheck [m1 info class] ::xotcl::Class "m1 is now an instance of Class" ::errorCheck [m1 isclass] 1 "m1 is isclass 1" ::errorCheck [m1 info class] ::xotcl::Class "m1 is of class ::xotcl::Class" M destroy # to be completed XXX Class C -parameter {number name} C instproc test {} { my instvar {number x} name return [list $name $x] } C c -name koen -number 25 ::errorCheck [c test] "koen 25" "instvar with alias" # Class C Class D -superclass C Class D1 D instmixin D1 D d1 ::errorCheck [d1 info precedence] "::D1 ::D ::C ::xotcl::Object" "d1 info precedence" ::errorCheck [d1 info precedence *] "::D1 ::D ::C ::xotcl::Object" "d1 info precedence *" ::errorCheck [d1 info precedence ::D*] "::D1 ::D" "d1 info precedence pattern" ::errorCheck [d1 info precedence -intrinsic] "::D ::C ::xotcl::Object" "d1 info precedence -intrinsic" ::errorCheck [d1 info precedence -intrinsic *] "::D ::C ::xotcl::Object" "d1 info precedence -intrinsic *" ::errorCheck [d1 info precedence -intrinsic ::D*] "::D" "d1 info precedence -intrinsic pattern" d1 destroy D destroy D1 destroy } @ TestX condMixins { description { Regression test for conditional mixins } } TestX create condMixins -proc show {c obj} { set ::context $c set r [list] foreach x [list \ [list $obj info methods salary] \ [list $obj info methods -incontext salary] \ [list $obj info methods driv*] \ [list $obj info methods -incontext driv*] \ ] { lappend r "$::context: $x => [lsort [eval $x]]" } return $r } condMixins proc run {{n 20}} { Object instproc signature {} {return "[self] [my info class] ([my age] years)"} Class Person -parameter {id name age} Class Payroll-aspect -parameter salary Payroll-aspect instproc print {} {puts "[my signature]: [my salary]"} Class Driver-aspect -parameter driving-license Payroll-aspect instproc print {} {puts "[my signature]: [my driving-license]"} Person instmixin {{Payroll-aspect -guard {[string equal $::context "payrollApp"]}}} Person jim -mixin {{Driver-aspect -guard {[string equal $::context "shipmentApp"]}}} set ::context payrollApp ::errorCheck [lsort [jim info methods]] "__next abstract age append array autoname check class cleanup configure contains copy defaultmethod destroy driving-license eval exists extractConfigureArg filter filterguard filtersearch forward hasclass id incr info init instvar invar isclass ismetaclass ismixin isobject istype lappend method mixin mixinguard move name noinit parametercmd print proc procsearch requireNamespace salary self set signature subst trace unset uplevel upvar volatile vwait" "condmixin all methods" ::errorCheck "[lsort [jim info methods -incontext]]" "__next abstract age append array autoname check class cleanup configure contains copy defaultmethod destroy eval exists extractConfigureArg filter filterguard filtersearch forward hasclass id incr info init instvar invar isclass ismetaclass ismixin isobject istype lappend method mixin mixinguard move name noinit parametercmd print proc procsearch requireNamespace salary self set signature subst trace unset uplevel upvar volatile vwait" "all methods in context" ::errorCheck [my show payrollApp jim] "{payrollApp: jim info methods salary => salary} {payrollApp: jim info methods -incontext salary => salary} {payrollApp: jim info methods driv* => driving-license} {payrollApp: jim info methods -incontext driv* => }" "payrollApp jim" ::errorCheck [my show shipmentApp jim] "{shipmentApp: jim info methods salary => salary} {shipmentApp: jim info methods -incontext salary => } {shipmentApp: jim info methods driv* => driving-license} {shipmentApp: jim info methods -incontext driv* => driving-license}" "shipmentApp jim" } @ TestX volatileObjects { description { Regression test for volatile objects } } TestX create volatileObjects volatileObjects proc inscope {} { set r 0 set y 0 set z 0 set c [C new -volatile] catch {incr r [$c test]} catch {set y [$c y]} catch {set z [$c z]} if {[catch {set u [$c u]} err]} {puts stderr $err} return $r-[llength [C info instances]]-$y-$z-$u } volatileObjects proc run {{n 20}} { Class create ::xotcl::_creator -instproc create {args} { set result [next] return $result } Class instproc f args { #puts stderr "*****F [self calledproc]" return [next] } Class C -parameter {{x 0}} C instproc f args { #puts stderr "*****C [self calledproc]" return [next] } C instproc test {} { my incr x } C instproc y {} { my instvar x; incr x } C instproc z {} { my set x 10 } C instproc u {} { upvar [self callinglevel] z b; info exists b } Class create ::xotcl::I -instproc instvar args { #puts [self proc] next } -instproc set args { #puts [self proc] next } -instproc u args { #puts [self proc] next } ::errorCheck [llength [C info instances]] 0 "foreign instances" ::errorCheck [my inscope] 1-1-2-10-1 "volatile objects in scope" ::errorCheck [llength [C info instances]] 0 "instances survived scope" Class instmixin ::xotcl::_creator ::errorCheck [my inscope] 1-1-2-10-1 "volatile objects in scope through mixin" ::errorCheck [llength [C info instances]] 0 \ "instances survived scope through mixin" Class instfilter f ::errorCheck [my inscope] 1-1-2-10-1 \ "volatile objects in scope through mixin + filter" ::errorCheck [llength [C info instances]] 0 \ "instances survived scope through mixin + filter" Class instmixin {} Class instfilter f ::errorCheck [my inscope] 1-1-2-10-1 \ "volatile objects in scope through filter" ::errorCheck [llength [C info instances]] 0 \ "instances survived scope through filter" Class instfilter {} C instmixin ::xotcl::I ::errorCheck [my inscope] 1-1-2-10-1 \ "instvar overload in scope through mixin" C instfilter f ::errorCheck [my inscope] 1-1-2-10-1 \ "instvar overload in scope through mixin and filter" C instfilter {} Class instproc f {} {} } TestX create uplevelCmds uplevelCmds proc upproc {} { lappend ::result [list \ self=[self] \ up1=[uplevel 1 self] \ up2=[uplevel 2 self] \ up3=[uplevel 3 self] ] } uplevelCmds proc run {{n 20}} { Object o1 -proc m {} { set ::result [list] lappend ::result [list \ self=[self] \ up1=[uplevel 1 self] \ up2=[uplevel 2 self] \ up3=[uplevel 3 self] ] uplevelCmds::upproc return $::result } Object o2 -proc m {} { o1 m } Object o3 -proc m {} { o2 m } Object o4 -proc m {} { o3 m } ::errorCheck [o4 m] \ "{self=::o1 up1=::o2 up2=::o3 up3=::o4} {self=::o1 up1=::o1 up2=::o2 up3=::o3}" \ "uplevel self" o4 m proc showstack {} { set l [info level] for {set i $l} {$i>0} {incr i -1} { set vars [uplevel \#$i info vars] upvar \#$i what w if {![info exists w]} {set w ""} puts "$i: $w[info level $i] vars=$vars" } } Class C C instproc u0 {} { upvar [self callinglevel] x y; incr y return [uplevel [self callinglevel] {incr x 1}] } C instproc u1 {} { upvar [self callinglevel] x y; incr y set r [uplevel [self callinglevel] {incr x 1}] set z [uplevel [self activelevel] incr z] return $z-$r } C instproc p0 {y} { set x $y set r [my u0] return $r-$x } C instproc p1 {y} { set z 0 set x $y set r [my u1] return $r-$x } Class D -superclass C D instproc u0 {} { upvar [self callinglevel] x y; incr y return [uplevel [self callinglevel] {incr x 1}] } D instproc u1 {} { set z [uplevel [self activelevel] incr z] set r [next] return $z-$r } Class M M instproc u1 {} { set z [uplevel [self activelevel] incr z] set r [next] return $z-$r } Object instproc f args { next } D create d1 errorCheck [d1 p0 1] 3-3 "simple uplevel" errorCheck [d1 p1 1] 2-2-3-3 "uplevel through next in class hierarchy + activelevel" D instmixin M errorCheck [d1 p1 1] 1-3-3-3-3 "uplevel through mixin and class hierarchy + activelevel" Object instfilter f errorCheck [d1 p1 1] 1-3-3-3-3 "uplevel through filter, mixin and class hierarchy + activelevel" Object instfilter "" D instmixin {} # now again the same tests with upvar and uplevel methods C instproc u0 {} { my upvar [self callinglevel] x y; incr y return [my uplevel {incr x 1}] } C instproc u1 {} { my upvar [self callinglevel] x y; incr y set r [my uplevel {incr x 1}] set z [my uplevel [self activelevel] incr z] return $z-$r } D instproc u0 {} { my upvar [self callinglevel] x y; incr y return [my uplevel {incr x 1}] } Class M M instproc u1 {} { set z [my uplevel [self activelevel] incr z] set r [next] return $z-$r } errorCheck [d1 p0 1] 3-3 "upvar method: simple uplevel" errorCheck [d1 p1 1] 2-2-3-3 \ "upvar method: uplevel through next in class hierarchy + activelevel" D instmixin M errorCheck [d1 p1 1] 1-3-3-3-3 \ "upvar method: uplevel through mixin and class hierarchy + activelevel" Object instfilter f errorCheck [d1 p1 1] 1-3-3-3-3 \ "upvar method: uplevel through filter, mixin and class hierarchy + activelevel" Object instfilter "" D instmixin {} # now again the same tests with upvar and uplevel methods with default levels C instproc u0 {} { my upvar x y; incr y return [my uplevel {incr x 1}] } C instproc u1 {} { my upvar x y; incr y set r [my uplevel {incr x 1}] set z [my uplevel [self activelevel] incr z] return $z-$r } D instproc u0 {} { my upvar x y; incr y return [my uplevel {incr x 1}] } Class M M instproc u1 {} { set z [my uplevel [self activelevel] incr z] set r [next] return $z-$r } errorCheck [d1 p0 1] 3-3 "upvar method: simple uplevel (dl)" errorCheck [d1 p1 1] 2-2-3-3 \ "upvar method: uplevel through next in class hierarchy + activelevel (dl)" D instmixin M errorCheck [d1 p1 1] 1-3-3-3-3 \ "upvar method: uplevel through mixin and class hierarchy + activelevel (dl)" Object instfilter f errorCheck [d1 p1 1] 1-3-3-3-3 \ "upvar method: uplevel through filter, mixin and class hierarchy + activelevel (dl)" Object instfilter "" D instmixin {} C instproc selftest args { return [self class]/[self isnextcall]-[next] } D instproc selftest args { return [self class]/[self isnextcall]-[next] } errorCheck [d1 selftest] "::D/0-::C/1-" \ "self isnextcall" Object instproc each {objName body} { #puts " *** level = [info level] self callinglevel = [self callinglevel]" uplevel [self callinglevel] [list foreach $objName [lsort [[self] info children]] $body] } Class TestB Class TestA TestA instproc init {args} { next TestB [self]::b1 TestB [self]::b2 TestB [self]::b3 } Class Test Test instproc init {args} { next TestA [self]::a1 TestA [self]::a2 TestA [self]::a3 } Test instproc loop1 {} { set i 0 [self] each a { incr i #puts "$a" } #puts "Total = $i" return $i } Test instproc loop2 {} { set i 0 [self] each a { incr i #puts "$a" $a each b { incr i #puts " $b" } } #puts "Total = $i" return $i } Object instproc f args {next} Test t errorCheck [t loop1] 3 "uplevel eval loop" errorCheck [t loop2] 12 "nested uplevel eval loop" t filter f errorCheck [t loop1] 3 "uplevel eval loop" errorCheck [t loop2] 12 "nested uplevel eval loop" t destroy } TestX create namespaceCommands -proc run {{n 20}} { errorCheck [catch { namespace eval foo { Class m Object o -mixin m } }] 0 "mixin resolved from namespace" Class create ::xotcl::_creator -instproc create {args} { set result [next] return $result } errorCheck [catch { namespace eval bar { Class A namespace export A } namespace eval foo { Class M -superclass Class namespace import ::bar::* Class B -superclass A -instmixin M Class instmixin ::xotcl::_creator Class C -superclass A -instmixin B Class instmixin "" } } error] 0 "mixin and Class resolve and import into namespace\n$error" } TestX create metaClassAsMixin -proc run {{n 20}} { Class create A -instmixin Class Class create B -superclass A B create b1 errorCheck [A ismetaclass]-[B ismetaclass]-[b1 ismetaclass]-[b1 isclass] \ "1-1-0-1" "metaclass through mixin" } TestX create nonposargs -proc run {{n 20}} { Object o o set result "" o proc test1 {-x:switch y} { my append result "x=$x y=$y, " } o test1 1 o test1 -x 1 o proc test2 {{-x:switch true} y} { my append result "x=$x y=$y, " } o test2 2 o test2 -x 2 o proc test3 {{-x:switch false} y} { my append result "x=$x y=$y, " } o test3 3 o test3 -x 3 errorCheck [o set result] \ "x=0 y=1, x=1 y=1, x=true y=2, x=0 y=2, x=false y=3, x=1 y=3, " \ "nonpos args switch" Object o o proc x {a b} { return "$a $b" } o proc x {} {a b} { return "$a $b" } o proc y {-x {-a {1 2 3}}} {a b} { return "$args" } o proc z1 {-x:required {-a {1 2 3}}} {a args} { return "$x -- $args" } o proc z2 {-x:required {-a {1 }} {-b {1 2}}} {args} {return "$x -- $args -- $a -- $b"} o proc z3 {-b:boolean} {arg} { return "$b $arg" } Object colorchecker colorchecker proc color {var value} { lappend ::r "color <$var> <$value>" } colorchecker proc reddish {var value} { lappend ::r "reddish <$var> <$value>" } o proc z4 {{{-b: required, checkobj colorchecker,color, reddish, checkobj xotcl::nonposArgs,required} red} {{-c: required }}} {arg} { lappend ::r "$b $arg" return "$b $arg" } o proc z5 {-pos args} { return [list $pos $args] } Class P P instproc x {a b} { return "$a $b" } P instproc z2 {-x:required {-a 1} {-b {1 2}}} {args} {return "$x -- $args -- $a -- $b"} P instproc z3 {-x:required {-a 1} {-b {1 2}}} {a b c} { return "$x -- $args -- $a -- $b" } P p errorCheck [o x 1 2] "1 2" "Ordinary Method" errorCheck [p x 3 4] "3 4" "Ordinary Method (2)" catch { o y 4 56 5 } m errorCheck $m {unknown argument '5' for method 'y': valid arguments -x {-a {1 2 3}} a b} "wrong \# check 1" catch { o y } m errorCheck $m "wrong # args for method 'y': valid arguments -x {-a {1 2 3}} a b" "wrong \# check 2" catch { o y -x 1 } m errorCheck $m "wrong # args for method 'y': valid arguments -x {-a {1 2 3}} a b" "wrong \# check 3" catch { o z1 a 1 2 3 } m errorCheck $m "required arg: 'x' missing" "required missing" errorCheck [o z1 -x 1 a 1 2 3] "1 -- 1 2 3" "invocation 1" errorCheck [o z2 -x 2 a 1 2 3] "2 -- a 1 2 3 -- 1 -- 1 2" "invocation 2" catch { o y -x 1 -a 2 2 3 } m errorCheck $m "can't read \"args\": no such variable" "args unset?" errorCheck [o z2 -a 2 -x 1 -b 3 a b c] \ "1 -- a b c -- 2 -- 3" "invocation 3" errorCheck [p z2 -x 1 -a 2 -b 3 a b c] \ "1 -- a b c -- 2 -- 3" "invocation 4" errorCheck [o z3 -b true -- -b] "true -b" "dash dash" errorCheck [o z5 -pos 1 a b] "1 {a b}" "nonpos with given args" errorCheck [o z5 -pos 1 a] "1 a" "nonpos with given args" errorCheck [o z5 -pos 1] "1 {}" "nonpos without given args" catch { o z3 -b abc -- -b } m errorCheck $m "non-positional argument: 'b' with value 'abc' is not of type boolean" "not boolean" set ::r "" o z4 -c 1 1 errorCheck $::r "{color } {reddish } {red 1}" \ "multiple check options + checkobject" errorCheck [o info body z2] {return "$x -- $args -- $a -- $b"} "info body 1" errorCheck [P info instbody z2] {return "$x -- $args -- $a -- $b"} "info instbody z2" errorCheck [o info args z4] {arg} "info args" errorCheck [o info nonposargs z4] "{{-b:required,checkobj colorchecker,color,reddish,checkobj xotcl::nonposArgs,required} red} -c:required" "info nonposargs 1" errorCheck [o info nonposargs x] {} "info nonposargs 2" errorCheck [P info instargs z3] {a b c} "info instargs" errorCheck [P info instnonposargs z3] {-x:required {-a 1} {-b {1 2}}} "info instnonposargs 1" errorCheck [P info instnonposargs x] {} "info instnonposargs 2" Object o o proc foo {{-a apple}} {{b banana}} { return [list [info locals] a: $a b: $b] } o proc foo2 {{-a apple}} {{b banana} {c apple}} { return [list [info locals] a: $a b: $b c: $c] } o proc foo3 {{-a apple}} {x y {b banana} {c apple}} { return [list [info locals] x: $x y: $y a: $a b: $b c: $c] } errorCheck [o foo] [list {a b} a: apple b: banana] \ "non pos + default values 1" errorCheck [o foo -a ack] [list {a b} a: ack b: banana] \ "non pos + default values 2" errorCheck [o foo bar] [list {a b} a: apple b: bar] \ "non pos + default values 3" errorCheck [o foo -a ack bar] [list {a b} a: ack b: bar] \ "non pos + default values 4" errorCheck [o foo2 -a ack] [list {a b c} a: ack b: banana c: apple] \ "non pos + default values 5" errorCheck [ o foo3 -a ack 1 2] [list {x y a b c} x: 1 y: 2 \ a: ack b: banana c: apple] \ "non pos + default values 6" Object o o proc foo {{-foo 1}} {} { #puts "foo: $foo" } o foo o foo -foo 0 catch {o foo -foo} msg errorCheck $msg "Non positional arg '-foo': value missing" "Empty non-pos arg" Object oa oa proc foo {{-a A}} {b} { #puts "$a $b" } oa foo "B" oa foo "-" oa foo "---" catch {oa foo "--"} msg errorCheck $msg "wrong # args for method 'foo': valid arguments {-a A} b" "Non-pos arg: double dash alone" Class C C create c1 C instproc m2 { {-flag:boolean false} } {x y {z 15}} { return $flag-$z } c1 proc m14 { {-flag:boolean false} } {x y {z 15}} { return $flag-$z } errorCheck [list [c1 m14 1 2 3] [c1 info args m14] \ [c1 info default m14 z e] [set e]] \ "false-3 {x y z} 1 15" \ "Defaults proc" errorCheck [list [c1 m2 1 2 3] [C info instargs m2]] \ "false-3 {x y z}" \ "info instargs" errorCheck [list [C info instdefault m2 x d] [C info instdefault m2 z d] [set d]] \ "0 1 15" \ "Defaults for instproc" catch {C info instdefault m2 xxx e} msg errorCheck $msg "method 'm2' doesn't have an argument 'xxx'" \ "Defaults instproc error" C instproc m3 { {-flag:boolean} } {x y z} { return hu3 } errorCheck [c1 m3 1 2 3] "hu3" "Defaults instproc no flag" Object o o proc f1 {{-x:boolean true} a } { if {![info exists a]} {error "pos arg a does not exist"} if {$x ne "true"} {error "x $x ne true"} if {$a ne "x"} {error "a $a ne x"} if {[info exists args]} {error "args still exists"} } o proc f2 {{-x:boolean true} {a x}} { if {![info exists a]} {error "pos arg a does not exist"} if {$x ne "false"} {error "x $x ne false"} if {$a ne "x"} {error "a $a ne x"} if {[info exists args]} {error "args still exists"} } o proc f3 {{-x:boolean true} } { if {$x ne "true"} {error "x $x ne true"} if {[info exists args]} {error "args still exists"} } o proc p0 {{-x 1} a} { #puts "--- [self proc] x=$x [info exists a]" if {![info exists a]} {error "pos arg a does not exist"} if {$a != 1} {error "a $a != 1"} if {$x != 1} {error "x $x != 1"} if {[info exists args]} {error "args still exists"} } o proc p1 {{-x 1} a args} { #puts "--- [self proc] x=$x [info exists a] args=$args" if {![info exists a]} {error "pos arg a does not exist"} if {$a != 1} {error "a $a != 1"} if {$x != 1} {error "x $x != 1"} if {$args ne ""} {error "args $args ne {}"} } o proc p2 {{-x 1} args} { if {$x != 1} {error "x $x != 1"} if {$args ne ""} {error "args $args ne {}"} } o proc p3 {{-x 1} args} { if {$x != 1} {error "x $x != 1"} if {$args ne "a b c"} {error "args $args ne {}"} } o proc p4 {{-x 1} args} { if {$x != 2} {error "x $x != 2"} if {$args ne "a b c"} {error "args $args ne {a b c}"} } o proc p5 {{-x 1} a args} { #puts "--- [self proc] x=$x [info exists a] args=$args" if {![info exists a]} {error "pos arg a does not exist"} if {$a != 1} {error "a $a != 1"} if {$x != 1} {error "x $x != 1"} if {$args ne "a b c"} {error "args $args ne {a b c}"} } o proc p6 {{-x 1} a args} { #puts "--- [self proc] x=$x [info exists a] args=$args" if {![info exists a]} {error "pos arg a does not exist"} if {$a != 1} {error "a $a != 1"} if {$x != 2} {error "x $x != 2"} if {$args ne "a b c"} {error "args $args ne {a b c}"} } o proc p7 {{-x 1} a args} { #puts "--- [self proc] x=$x [info exists a] args=$args" if {![info exists a]} {error "pos arg a does not exist"} if {$a != 1} {error "a $a != 1"} if {$x != 2} {error "x $x != 2"} if {$args ne ""} {error "args $args ne {}"} } o proc p8 {{-x 1} {a 1} args} { #puts "--- [self proc] x=$x [info exists a] args=$args" if {![info exists a]} {error "pos arg a does not exist"} if {$a != 1} {error "a $a != 1"} if {$x != 2} {error "x $x != 2"} if {$args ne ""} {error "args $args ne {}"} } errorCheck [catch {o f1 x}] 0 nonpos-1 errorCheck [catch {o f1 -y 1}] 1 nonpos-2 errorCheck [catch {o f1 -x false}] 1 nonpos-3 errorCheck [catch {o f2 -x false}] 0 nonpos-4 errorCheck [catch {o f3}] 0 nonpos-5 errorCheck [catch {o f3 -x true -y 1}] 1 nonpos-6 errorCheck [catch {o f3-y 1}] 1 nonpos-7 errorCheck [catch {o p0 1}] 0 nonpos-8 errorCheck [catch {o p1 1}] 0 nonpos-9 errorCheck [catch {o p1 }] 1 nonpos-10 errorCheck [catch {o p2 }] 0 nonpos-11 errorCheck [catch {o p3 a b c}] 0 nonpos-12 errorCheck [catch {o p4 -x 2 a b c}] 0 nonpos-13 errorCheck [catch {o p5 1 a b c}] 0 nonpos-14 errorCheck [catch {o p7 -x 2 1}] 0 nonpos-15 errorCheck [catch {o p7 -x 2 }] 1 nonpos-16 errorCheck [catch {o p8 -x 2 }] 0 nonpos-17 o destroy Class X X instproc ListOfStringsOption {{-default "murr6"} {-cb {}} name} { if {$cb eq {}} { set cb "::set ::$name " } ;# global variable eval $cb \$default } ::X create x1 ::x1 ListOfStringsOption uu errorCheck [set ::uu] murr6 murr6 ::x1 destroy X destroy } TestX copymove2 -proc run {{n 10}} { # Composite Class Composite -superclass Class Composite instproc addop {op} { my instvar ops set ops($op) $op } Composite instproc compositeFilter args { set m [self calledproc] set c [lindex [self filterreg] 0] set r [next] if {[$c exists ops($m)]} { foreach child [my info children] { eval [self]::$child $m $args } } return $r } Composite AbstractNode AbstractNode abstract instproc iterate v AbstractNode addop iterate for {set i 0} {$i < $n} {incr i} { # # class copy # foreach filters {{} compositeFilter} { Composite instfilter $filters AbstractNode instfilter $filters Object commands Class Commands -superclass AbstractNode Class Command -superclass Commands Command instproc init args { my instvar label set label [self] next } Command instproc setlabel {{arg ""}} { my instvar label if {$arg eq ""} { set label } else { set label $arg } } Command instproc setproc {value} { my instvar src set src $value } # prototypes Command commands::cellcmd commands::cellcmd copy toto } } } TestX proc run {} { foreach test [lsort [TestX info instances]] { puts stderr "$test: start" $test run } } puts "XOTcl - Test" puts "Time used: [time {TestX run} 1]" # toplevel tests ################################################# Class instmixin {} C instmixin {} set o [C new -volatile];errorCheck [Object isobject $o] 1 "topLevel, check object 1 - $o" Class instmixin ::xotcl::_creator set o [C new -volatile];errorCheck [Object isobject $o] 1 "topLevel, check object 2 - $o" C instmixin ::xotcl::I set o [C new -volatile];errorCheck [Object isobject $o] 1 "topLevel, check object 3 - $o" foreach i [C info instances] {$i destroy} proc x {} { Class instmixin {} C instmixin {} set c0 [llength [C info instances]] set o [C new -volatile]; errorCheck [Object isobject $o] 1 "x, check object" Class instmixin ::xotcl::_creator set o [C new -volatile]; errorCheck [Object isobject $o] 1 "x, check object" C instmixin ::xotcl::I set o [C new -volatile]; errorCheck [Object isobject $o] 1 "x, check object" set c1 [llength [C info instances]] errorCheck [expr {$c1 - $c0 != 3}] 0 "exit x, three more objects" } x errorCheck [expr {[llength [C info instances]] > 0}] 0 "top, all volatile object gone" proc x1 {} { set c0 [llength [C info instances]] set o [C new -volatile]; errorCheck [Object isobject $o] 1 "x1, check object" x set o [C new -volatile]; errorCheck [Object isobject $o] 1 "x1, check object" set c1 [llength [C info instances]] errorCheck [expr {$c1 - $c0 != 2}] 0 "exit x1, two more objects" } x1 errorCheck [expr {[llength [C info instances]] > 0}] 0 "top, volatile objects gone" Object o o proc test {} { x1; errorCheck [expr {[llength [C info instances]] > 0}] 0 "x1 from o" } o test puts "PASSED ::topLevelCommands" ./xotcl-1.6.8/tests/._UNIVERSAL.test000755 000765 000024 00000000430 12161610267 017452 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/UNIVERSAL.test000755 000765 000024 00000003157 12161610267 017246 0ustar00neumannstaff000000 000000 #if {[set ::tcl_platform(platform)] == "windows"} {lappend auto_path .} package require XOTcl 1; namespace import -force xotcl::* set pkgdir [file dir [info script]]/.. lappend auto_path $pkgdir package require -exact xotcl::test 1.38 set tclsh [info nameofexecutable] set dir [file dir [info script]] set univApps $dir/../apps/actiweb/univ set startCmd "$tclsh $univApps/UNIVERSAL.xotcl \ -instanceFile $univApps/UNIVERSAL.rdf \ -cssFile UNIVERSAL.css \ -root $dir/../apps/actiweb/univ \ -pkgdir $pkgdir" puts stderr "starting $startCmd" set PIPE [open "|$startCmd"] package require -exact xotcl::comm::httpAccess 1.0 proc printError msg {puts stderr !!!$msg!!!} Class T -superclass Test -parameter { {count 1} {errorReport { puts "\tcontent-length: \[r0::sink set contentLength\]\n\ \tstatus-code: \[\[r0 set token\] set responseCode\]\n\[r0 getContent]" }}} T new -msg "Load homepage frame von univ ... " \ -setResult {expr [r0::sink set contentLength] == 358} \ -cmd [list SimpleRequest r0 -url http://localhost:8095/ ] T new -msg "Load Catalog ... " \ -setResult {expr [r0::sink set contentLength] == 1744} \ -cmd [list SimpleRequest r0 -url http://localhost:8095/univ+catalog ] T new -msg "Detail Page ... " \ -setResult {expr [r0::sink set contentLength] == 2327} \ -cmd [list SimpleRequest r0 -url http://localhost:8095/univ+details+http://nm.wu-wien.ac.at/Lehre/oo1/] T new -msg "terminate" -cmd [list SimpleRequest r0 -url http://localhost:8095/receiver::exit] \ -setResult {set x 1} \ -post {catch {close $::PIPE}; exit} after 1000 {Test run} vwait forever ./xotcl-1.6.8/tests/._varresolutiontest.xotcl000644 000765 000024 00000000430 12161600406 022057 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/varresolutiontest.xotcl000644 000765 000024 00000006635 12161600406 021657 0ustar00neumannstaff000000 000000 # testing var resolution for namespace-shadowed objects package require XOTcl 1 package require xotcl::test 1 namespace import -force xotcl::* proc ? {cmd expected {iterations 1000}} { set t [Test new \ -cmd $cmd \ -expected $expected \ -count $iterations] $t run } ########################################### # Basic tests for var resolution under # per-object namespaces ... ########################################### set ::globalVar 1 Object o -requireNamespace ? {o info vars} "" ? {info exists ::globalVar} 1 ? {set ::globalVar} 1 ? {o exists globalVar} 0 ? {o array exists globalVar} 0 o array set globalVar {1 2} ? {o exists globalVar} 1 ? {o info vars} globalVar ? {o array exists globalVar} 1 ? {set ::globalVar} 1 ? {o set globalVar(1)} 2 o destroy unset ::globalVar ########################################### # scopes ########################################### Object o -eval { my requireNamespace global z my instvar y set x 1 set y 2 set z 3 set [self]::X 4 } set ::o::Y 5 ? {info exists ::z} 1 ? {set ::z} 3 ? {lsort [o info vars]} {X Y y} ? {o exists x} 0 ? {o exists y} 1 ? {o exists z} 0 ? {o exists X} 1 ? {o exists Y} 1 ? {o set y} 2 o destroy unset ::z ########################################### # mix & match namespace and object interfaces ########################################### Object o -requireNamespace o set x 1 ? {namespace eval ::o set x} 1 ? {::o set x} 1 ? {namespace eval ::o set x 3} 3 ? {::o set x} 3 ? {namespace eval ::o info exists x} 1 ? {::o unset x} "" 1 ? {namespace eval ::o info exists x} 0 o lappend y 3 ? {namespace eval ::o llength y} 1 ? {namespace eval ::o unset y} "" 1 ? {::o exists y} 0 o destroy ########################################### # array-specific tests ########################################### Object o -requireNamespace ? {o array exists a} 0 ? {namespace eval ::o array exists a} 0 o array set a {1 2 3 4 5 6} ? {o array exists a} 1 ? {namespace eval ::o array exists a} 1 ? {namespace eval ::o array names a} [::o array names a] ? {namespace eval ::o array size a} [::o array size a] ? {o set a(1) 7} 7 ? {namespace eval ::o array get a 1} {1 7} ? {namespace eval ::o set a(1) 2} 2 ? {o array get a 1} {1 2} ? {::o unset a} "" 1 ? {::o array unset a} "" ? {o array exists a} 0 ? {namespace eval ::o array exists a} 0 o destroy ########################################### # tests on namespace-qualified var names ########################################### Object o -requireNamespace Object o::oo -requireNamespace ? {::o set ::x 1} 1 ? {info exists ::x} [set ::x] ? {catch {unset ::x}} 0 1 ? {::o set ::o::x 1} 1 ? {o exists x} [::o set ::o::x] ? {namespace eval ::o unset x} "" 1 ? {o exists x} 0 # Note, relatively qualified var names (not prefixed with ::*) # are always resolved relative to the per-object namespace ? {catch {::o set o::x 1} msg} 1 ? {::o set oo::x 1} 1 ? {o::oo exists x} [::o set oo::x] ? {o unset oo::x} "" 1 ? {o::oo exists x} 0 o destroy ########################################### # tests on namespace-qualified on objects # without namespaces ########################################### # the tests below fail. We could consider # to require namespaces on the fly in the future Object o #? {::o set ::o::x 1} 1 #? {o exists x} [::o set ::o::x] #? {namespace eval ::o unset x} "" 1 #? {o exists x} 0 #? {::o set o::x 1} 1 #? {o exists x} [::o set o::x] #? {namespace eval ::o unset x} "" 1 #? {o exists x} 0 o destroy./xotcl-1.6.8/tests/._xocomm.test000755 000765 000024 00000000430 12161602637 017406 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/xocomm.test000755 000765 000024 00000006430 12161602637 017177 0ustar00neumannstaff000000 000000 #!../../xotcl-0.9.4/xotclsh # $Id: xocomm.test,v 1.4 2005/09/09 21:09:01 neumann Exp $ package require XOTcl 1; namespace import -force xotcl::* lappend auto_path [file dirname [info script]]/.. package require xotcl::test 1 @ @File { description { This is a webclient used as a regression test. When it is started it launches an xotcl-Web server as partner process. It tests currently the basic functionality of:

    • GET and PUT requests
    • Basic Access Control
    } } array set opt {-startServer 1} array set opt $argv set xotclsh [info nameofexecutable] set dir [file dir [info script]] set serverScript $dir/../apps/comm/webserver.xotcl set startCmd "$xotclsh $serverScript -root $dir/../doc -pkgdir $dir/.." puts $startCmd if {$opt(-startServer)} { set PIPE [open "| $startCmd"] } else { puts $startCmd } package require xotcl::comm::httpAccess 1 package require -exact xotcl::comm::ftp 1.0 package require xotcl::trace #::xotcl::package verbose 1 #::xotcl::package require xotcl::comm::httpAccess #::xotcl::package require xotcl::comm::ftp #::xotcl::package require xotcl::trace set hostport localhost:8086 set protectedhostport localhost:9096 set slowURL "http://quote.yahoo.com/q?s=^DJI&d=1d" set ftpURL "ftp://mohegan.wi-inf.uni-essen.de/welcome.msg" proc printError msg {puts stderr !!!$msg!!!} Object userPwd userPwd proc user {u} { my set user $u if {[set ::tcl_platform(platform)] == "windows"} { my set user unknown } } userPwd proc show {realm userVar pwVar} { upvar $userVar u $pwVar pw set u [my set user] set pw test return 1 } Test parameter {{errorReport { puts "\tcontent-length: \[r0::sink set contentLength\]\n\ \tstatus-code: \[\[r0 set token\] set responseCode\]" }}} Test new -msg "Trying to load image logo-100.jpg ... " -count 1 \ -verbose 1 \ -pre "puts starting..." \ -setResult {expr {[r0::sink set contentLength] == 1706}} \ -cmd [list SimpleRequest r0 -url http://$hostport/logo-100.jpg] \ Test new -msg "Trying to PUT a file on web-server ... " -count 1 \ -setResult {expr [[r0 set token] set responseCode] == 201} \ -pre [list file delete -force $dir/../doc/junk.junk] \ -cmd [list SimpleRequest r0 \ -url http://$hostport/junk.junk \ -method PUT \ -data "this is a test\n" \ -contentType plain/text] Test new -msg "And download it again ... " -count 1 \ -setResult {expr [r0 getContentLength] == 15} \ -post {file delete -force ../doc/junk.junk} \ -cmd [list SimpleRequest r0 -url http://$hostport/junk.junk] Test new -msg "Get protected resource ... " -count 1 \ -setResult {expr [r0 getContentLength] > 500} \ -cmd [list SimpleRequest r0 -url http://$protectedhostport/ ] #Test new -msg "Try an FTP request $ftpURL ... " -count 1 \ -setResult {expr [r0 getContentLength] > 100} \ -cmd [list SimpleRequest r0 -url $ftpURL] #Test new -msg "Try timeout with slow URL $slowURL ... " -count 1 \ -setResult {expr {[[r0 set token] set errormsg] == {timeout exceeded}}} \ -cmd [list SimpleRequest r0 -url $slowURL -timeout 100] Test new -msg terminate -count 1 \ -setResult {set x 1} \ -cmd [list SimpleRequest r0 -url http://$protectedhostport/exit] \ -post exit after 1000 {Test run} catch {vwait forever} ./xotcl-1.6.8/tests/._xoRDF.test000755 000765 000024 00000000430 12161600406 017056 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/tests/xoRDF.test000755 000765 000024 00000211153 12161600406 016647 0ustar00neumannstaff000000 000000 #!../../src/xotclsh # $Id: xoRDF.test,v 1.5 2007/08/14 16:38:27 neumann Exp $ # package require XOTcl 1; namespace import -force xotcl::* lappend auto_path [file dir [info script]]/.. #package require xotcl::test #package require package;package verbose 1 package require xotcl::rdf::parser package require xotcl::rdf::recreatorVisitor package require xotcl::rdf::triple proc errorCheck {expected result msg} { set expected [string trim $expected \n] set result [string trim $result \n] foreach e [split $expected \n] r [split $result \n] { set e [string trim $e] set r [string trim $r] if {$e != $r} { puts stderr "FAILED: $msg\nGot: '$r'\nExpected: '$e'" puts stderr "Full Result:\n$result" puts stderr "RAW Triples:" foreach t [lsort [tripleVisitor::db getTriples]] { puts -nonewline stderr [$t dump] } exit -1 return } } } Class TestVisitor -superclass NodeTreeVisitor TestVisitor instproc visit objName { my append result [string trim [$objName print]] \n } TestVisitor instproc interpretNodeTree {node} { my set result "" $node accept [self] return [my set result] } TestVisitor testVisitor RDFRecreatorVisitor reVisitor TripleVisitor tripleVisitor tripleVisitor proc interpret {parser topNode {asBag 1}} { set result "" my descriptionAsBag $asBag my reset my interpretNodeTree $topNode return [[self]::db prettyTriples] # foreach t [lsort [[self]::db getTriples]] { # append result [string trim [$t dump]]\n # } # return $result } RDFParser rp rp proc time {cmd time} { upvar $time ms regexp {^(-?[0-9]+) } [::time {set r [eval $cmd]}] _ ms return $r } rp proc test {name text nodeResult tripleResult {descriptionAsBagResult ""}} { my reset foreach time {nodeTime recreateTime tripleTime} { if {![my exists $time]} {my set $time 0} } my parse $text set r [rp time [list testVisitor interpretNodeTree [self]::topNode1] ct] regsub -all "[self]::topNode1" $r "" r ::errorCheck $nodeResult $r "RDF Node Creation: $name" #set r [time [list reVisitor interpretNodeTree [self]::topNode1] rt] #::errorCheck $recreateResult $r "RDF Recreation: $name" set r [rp time [list tripleVisitor interpret rp [self]::topNode1 0] tt] ::errorCheck $tripleResult $r "RDF Triples: $name" if {$descriptionAsBagResult != ""} { set r [tripleVisitor interpret rp [self]::topNode1 1] ::errorCheck $descriptionAsBagResult $r "RDF Triples -- Description as Bag: $name" } # test recreation by recreating XML text and by parsing # and testing it again set recreatedText [rp time [list reVisitor interpretNodeTree [self]::topNode1] rt] [self]::topNode1 destroy my reset my parse $recreatedText #puts "RECREATED: \n$recreatedText" # test recreated node tree set r [testVisitor interpretNodeTree [self]::topNode1] regsub -all "[self]::topNode1" $r "" r ::errorCheck $nodeResult $r "RDF Node Recreation: $name" set r [tripleVisitor interpret rp [self]::topNode1 0] ::errorCheck $tripleResult $r "RDF Triple Recreation: $name" my incr nodeTime $ct my incr recreateTime $rt my incr tripleTime $tt puts "PASSED: $name ($ct + $rt + $tt)" } ############################################################################## rp test "Namespace" { xyz dfg } { ::xotcl::rdf::parser::RDFTag- --- RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- Description ATTR: ID = nsd ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:ABC PCDATA: xyz ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- fromXYZ PCDATA: dfg } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator nsd nsd http://description.org/schema/ABC xyz nsd http://xyz.com/fromXYZ dfg } ############################################################################## rp test descriptionNestedNS { Ora Lassila } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator PCDATA: Ora Lassila } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator Ora Lassila } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator Ora Lassila =================== unreferenced: rdfdoc#id1 #type #Bag rdfdoc#id1 #_1 rdfdoc#id2 rdfdoc#id2 #predicate http://description.org/schema/Creator rdfdoc#id2 #subject http://www.w3.org/Home/Lassila rdfdoc#id2 #object Ora Lassila rdfdoc#id2 #type #Statement } ############################################################################## rp test NSDescription { Ora Lassila } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator PCDATA: Ora Lassila } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator Ora Lassila } ############################################################################## rp test PropertyAttr { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator PCDATA: Ora Lassila } { http://www.w3.org/Home/Lassila s:Creator Ora Lassila } ############################################################################## rp test properties { World Wide Web Consortium W3C Home Page 1998-10-03T02:27 } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Publisher PCDATA: World Wide Web Consortium ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- s:Title PCDATA: W3C Home Page ::xotcl::rdf::parser::RDFProperty-::res1::prop3 --- s:Date PCDATA: 1998-10-03T02:27 } { http://www.w3.org s:Publisher World Wide Web Consortium http://www.w3.org s:Title W3C Home Page http://www.w3.org s:Date 1998-10-03T02:27 } ############################################################################## rp test propertyAttr2 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Publisher PCDATA: World Wide Web Consortium ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- s:Title PCDATA: W3C Home Page ::xotcl::rdf::parser::RDFProperty-::res1::prop3 --- s:Date PCDATA: 1998-10-03T02:27 } { http://www.w3.org s:Publisher World Wide Web Consortium http://www.w3.org s:Title W3C Home Page http://www.w3.org s:Date 1998-10-03T02:27 } ############################################################################## rp test bag1 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://mycollege.edu/courses/6.001 ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:students ::xotcl::rdf::parser::RDFBag-::res1::prop1::res1 --- rdf:Bag TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop1 --- rdf:li ATTR: resource = http://mycollege.edu/students/Amy MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop2 --- rdf:li ATTR: resource = http://mycollege.edu/students/Tim MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop3 --- rdf:li ATTR: resource = http://mycollege.edu/students/John MEMBER-INDEX: rdf:_3 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop4 --- rdf:li ATTR: resource = http://mycollege.edu/students/Mary MEMBER-INDEX: rdf:_4 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop5 --- rdf:li ATTR: resource = http://mycollege.edu/students/Sue MEMBER-INDEX: rdf:_5 } { http://mycollege.edu/courses/6.001 s:students rdfdoc#id2 rdfdoc#id2 #type #Bag rdfdoc#id2 #_1 http://mycollege.edu/students/Amy rdfdoc#id2 #_2 http://mycollege.edu/students/Tim rdfdoc#id2 #_3 http://mycollege.edu/students/John rdfdoc#id2 #_4 http://mycollege.edu/students/Mary rdfdoc#id2 #_5 http://mycollege.edu/students/Sue } ############################################################################## rp test bagGivenAsType1 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://mycollege.edu/courses/6.001 ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:students ::xotcl::rdf::parser::RDFBag-::res1::prop1::res1 --- rdf:Bag TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop1 --- rdf:li ATTR: resource = http://mycollege.edu/students/Amy MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop2 --- rdf:li ATTR: resource = http://mycollege.edu/students/Tim MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop3 --- rdf:li ATTR: resource = http://mycollege.edu/students/John MEMBER-INDEX: rdf:_3 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop4 --- rdf:li ATTR: resource = http://mycollege.edu/students/Mary MEMBER-INDEX: rdf:_4 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop5 --- rdf:li ATTR: resource = http://mycollege.edu/students/Sue MEMBER-INDEX: rdf:_5 } { http://mycollege.edu/courses/6.001 s:students rdfdoc#id2 rdfdoc#id2 #type #Bag rdfdoc#id2 #_1 http://mycollege.edu/students/Amy rdfdoc#id2 #_2 http://mycollege.edu/students/Tim rdfdoc#id2 #_3 http://mycollege.edu/students/John rdfdoc#id2 #_4 http://mycollege.edu/students/Mary rdfdoc#id2 #_5 http://mycollege.edu/students/Sue } ############################################################################## rp test bagGivenAsType2 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://mycollege.edu/courses/6.001 ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:students ::xotcl::rdf::parser::RDFBag-::res1::prop1::res1 --- rdf:Bag TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop1 --- rdf:li ATTR: resource = http://mycollege.edu/students/Amy MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop2 --- rdf:li ATTR: resource = http://mycollege.edu/students/Tim MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop3 --- rdf:li ATTR: resource = http://mycollege.edu/students/John MEMBER-INDEX: rdf:_3 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop4 --- rdf:li ATTR: resource = http://mycollege.edu/students/Mary MEMBER-INDEX: rdf:_4 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop5 --- rdf:li ATTR: resource = http://mycollege.edu/students/Sue MEMBER-INDEX: rdf:_5 } { http://mycollege.edu/courses/6.001 s:students rdfdoc#id2 rdfdoc#id2 #type #Bag rdfdoc#id2 #_1 http://mycollege.edu/students/Amy rdfdoc#id2 #_2 http://mycollege.edu/students/Tim rdfdoc#id2 #_3 http://mycollege.edu/students/John rdfdoc#id2 #_4 http://mycollege.edu/students/Mary rdfdoc#id2 #_5 http://mycollege.edu/students/Sue } ############################################################################## rp test bagAndAltGivenAsType { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://mycollege.edu/courses/6.001 ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:students ::xotcl::rdf::parser::RDFAlt-::res1::prop1::res1 --- rdf:Alt TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Alt http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop1 --- rdf:li ATTR: resource = http://mycollege.edu/students/Amy MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop2 --- rdf:li ATTR: resource = http://mycollege.edu/students/Tim MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop3 --- rdf:li ATTR: resource = http://mycollege.edu/students/John MEMBER-INDEX: rdf:_3 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop4 --- rdf:li ATTR: resource = http://mycollege.edu/students/Mary MEMBER-INDEX: rdf:_4 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop5 --- rdf:li ATTR: resource = http://mycollege.edu/students/Sue MEMBER-INDEX: rdf:_5 } { http://mycollege.edu/courses/6.001 s:students rdfdoc#id2 rdfdoc#id2 #type #Alt rdfdoc#id2 #type #Bag rdfdoc#id2 #_1 http://mycollege.edu/students/Amy rdfdoc#id2 #_2 http://mycollege.edu/students/Tim rdfdoc#id2 #_3 http://mycollege.edu/students/John rdfdoc#id2 #_4 http://mycollege.edu/students/Mary rdfdoc#id2 #_5 http://mycollege.edu/students/Sue } ############################################################################## rp test alt1 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://x.org/packages/X11 ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:DistributionSite ::xotcl::rdf::parser::RDFAlt-::res1::prop1::res1 --- rdf:Alt TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Alt ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop1 --- rdf:li ATTR: resource = ftp://ftp.x.org MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop2 --- rdf:li ATTR: resource = ftp://ftp.cs.purdue.edu MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop3 --- rdf:li ATTR: resource = ftp://ftp.eu.net MEMBER-INDEX: rdf:_3 } { http://x.org/packages/X11 s:DistributionSite rdfdoc#id2 rdfdoc#id2 #type #Alt rdfdoc#id2 #_1 ftp://ftp.x.org rdfdoc#id2 #_2 ftp://ftp.cs.purdue.edu rdfdoc#id2 #_3 ftp://ftp.eu.net } ############################################################################## rp test bag2 { Ora Lassila } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFBag-::res1 --- rdf:Bag ATTR: ID = pages TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop1 --- rdf:li ATTR: resource = http://foo.org/foo.html MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop2 --- rdf:li ATTR: resource = http://bar.org/bar.html MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFDescription-::res2 --- rdf:Description ATTR: about = #pages ::xotcl::rdf::parser::RDFProperty-::res2::prop1 --- s:Creator PCDATA: Ora Lassila } { =================== unreferenced: rdfdoc#pages #type #Bag rdfdoc#pages #_1 http://foo.org/foo.html rdfdoc#pages #_2 http://bar.org/bar.html rdfdoc#pages s:Creator Ora Lassila } ############################################################################## rp test aboutEach { (c) 1998, The Foo Organization (c) 1998, The Foo Organization } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: aboutEachPrefix = http://foo.org/doc ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Copyright PCDATA: (c) 1998, The Foo Organization ::xotcl::rdf::parser::RDFDescription-::res2 --- rdf:Description ATTR: aboutEach = #docpages ::xotcl::rdf::parser::RDFProperty-::res2::prop1 --- s:Copyright PCDATA: (c) 1998, The Foo Organization ::xotcl::rdf::parser::RDFBag-::res3 --- rdf:Bag ATTR: ID = docpages TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res3::prop1 --- rdf:li ATTR: resource = http://foo.org/doc/page1 MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res3::prop2 --- rdf:li ATTR: resource = http://foo.org/doc/page2 MEMBER-INDEX: rdf:_2 } { http://foo.org/doc/page1 http://description.org/schema/Copyright (c) 1998, The Foo Organization http://foo.org/doc/page2 http://description.org/schema/Copyright (c) 1998, The Foo Organization =================== unreferenced: rdfdoc#docpages #type #Bag rdfdoc#docpages #_1 http://foo.org/doc/page1 rdfdoc#docpages #_2 http://foo.org/doc/page2 } ############################################################################## rp test "BagID on List" { Me } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: aboutEach = #docpages ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:somebag ::xotcl::rdf::parser::RDFBag-::res1::prop1::res1 --- rdf:Bag TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop1 --- rdf:li ATTR: resource = http://foo.org/foo.html MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop2 --- rdf:li ATTR: resource = http://bar.org/bar.html MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- s:Creator PCDATA: Me ::xotcl::rdf::parser::RDFBag-::res2 --- rdf:Bag ATTR: ID = docpages TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res2::prop1 --- rdf:li ATTR: resource = http://foo.org/doc/page1 MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res2::prop2 --- rdf:li ATTR: resource = http://foo.org/doc/page2 MEMBER-INDEX: rdf:_2 } { http://foo.org/doc/page1 http://description.org/schema/somebag rdfdoc#id2 rdfdoc#id2 #type #Bag rdfdoc#id2 #_1 http://foo.org/foo.html rdfdoc#id2 #_2 http://bar.org/bar.html http://foo.org/doc/page1 http://description.org/schema/Creator Me http://foo.org/doc/page2 http://description.org/schema/somebag rdfdoc#id2 http://foo.org/doc/page2 http://description.org/schema/Creator Me =================== unreferenced: rdfdoc#docpages #type #Bag rdfdoc#docpages #_1 http://foo.org/doc/page1 rdfdoc#docpages #_2 http://foo.org/doc/page2 } ############################################################################## rp test "Sharing Values" { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFSeq-::res1 --- rdf:Seq ATTR: ID = JSPapersByDate TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq ::xotcl::rdf::parser::RDFMember-::res1::prop1 --- rdf:li ATTR: resource = http://www.dogworld.com/Aug96.doc MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop2 --- rdf:li ATTR: resource = http://www.webnuts.net/Jan97.html MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res1::prop3 --- rdf:li ATTR: resource = http://www.carchat.com/Sept97.html MEMBER-INDEX: rdf:_3 ::xotcl::rdf::parser::RDFSeq-::res2 --- rdf:Seq ATTR: ID = JSPapersBySubj TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq ::xotcl::rdf::parser::RDFMember-::res2::prop1 --- rdf:li ATTR: resource = http://www.carchat.com/Sept97.html MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res2::prop2 --- rdf:li ATTR: resource = http://www.dogworld.com/Aug96.doc MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res2::prop3 --- rdf:li ATTR: resource = http://www.webnuts.net/Jan97.html MEMBER-INDEX: rdf:_3 } { =================== unreferenced: rdfdoc#JSPapersByDate #type #Seq rdfdoc#JSPapersByDate #_1 http://www.dogworld.com/Aug96.doc rdfdoc#JSPapersByDate #_2 http://www.webnuts.net/Jan97.html rdfdoc#JSPapersByDate #_3 http://www.carchat.com/Sept97.html rdfdoc#JSPapersBySubj #type #Seq rdfdoc#JSPapersBySubj #_1 http://www.carchat.com/Sept97.html rdfdoc#JSPapersBySubj #_2 http://www.dogworld.com/Aug96.doc rdfdoc#JSPapersBySubj #_3 http://www.webnuts.net/Jan97.html } ############################################################################## rp test "aggregates" { Mary Andrew Jacky Crystal The Coolest Web Page Il Pagio di Web Fuba } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.foo.com/cool.html ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- dc:Creator ::xotcl::rdf::parser::RDFSeq-::res1::prop1::res1 --- rdf:Seq ATTR: ID = CreatorsAlphabeticalBySurname TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop1 --- rdf:li PCDATA: Mary Andrew MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop1::res1::prop2 --- rdf:li PCDATA: Jacky Crystal MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- dc:Identifier ::xotcl::rdf::parser::RDFBag-::res1::prop2::res1 --- rdf:Bag ATTR: ID = MirroredSites TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop2::res1::prop1 --- rdf:li ATTR: rdf:resource = http://www.foo.com.au/cool.html MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop2::res1::prop2 --- rdf:li ATTR: rdf:resource = http://www.foo.com.it/cool.html MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFProperty-::res1::prop3 --- dc:Title ::xotcl::rdf::parser::RDFAlt-::res1::prop3::res1 --- rdf:Alt TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Alt ::xotcl::rdf::parser::RDFMember-::res1::prop3::res1::prop1 --- rdf:li ATTR: xml:lang = en PCDATA: The Coolest Web Page MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop3::res1::prop2 --- rdf:li ATTR: xml:lang = it PCDATA: Il Pagio di Web Fuba MEMBER-INDEX: rdf:_2 } { http://www.foo.com/cool.html http://purl.org/metadata/dublin_core#Creator rdfdoc#CreatorsAlphabeticalBySurname rdfdoc#CreatorsAlphabeticalBySurname #type #Seq rdfdoc#CreatorsAlphabeticalBySurname #_1 Mary Andrew rdfdoc#CreatorsAlphabeticalBySurname #_2 Jacky Crystal http://www.foo.com/cool.html http://purl.org/metadata/dublin_core#Identifier rdfdoc#MirroredSites rdfdoc#MirroredSites #type #Bag rdfdoc#MirroredSites #_1 http://www.foo.com.au/cool.html rdfdoc#MirroredSites #_2 http://www.foo.com.it/cool.html http://www.foo.com/cool.html http://purl.org/metadata/dublin_core#Title rdfdoc#id4 rdfdoc#id4 #type #Alt rdfdoc#id4 #_1 The Coolest Web Page rdfdoc#id4 #_2 Il Pagio di Web Fuba } ############################################################################## rp test "bagReification" { literal, well-formed tag xyz } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFBag-::res1 --- rdf:Bag TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop1 --- rdf:li ATTR: parseType = Literal PCDATA: literal, well-formed tag MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res1::prop2 --- rdf:li MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFDescription-::res1::prop2::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop1 --- s:x PCDATA: xyz } { =================== unreferenced: rdfdoc#id1 #type #Bag rdfdoc#id1 #_1 literal, well-formed tag rdfdoc#id1 #_2 rdfdoc#id2 rdfdoc#id2 http://description.org/schema/x xyz } # the following reification is done by SirPac, but it does not seem necessary # (uncomment reify property in RDFTriple, if needed #{ #=================== unreferenced: # rdfdoc#id1 #type #Bag # rdfdoc#id1 #_1 # literal, well-formed tag # # rdfdoc#id1 #_2 rdfdoc#id2 # rdfdoc#id2 http://description.org/schema/x xyz # rdfdoc#id3 #predicate http://description.org/schema/x # rdfdoc#id3 #subject rdfdoc#id2 # rdfdoc#id3 #object xyz # rdfdoc#id3 #type #Statement #} ############################################################################## rp test "parseLiteral" { xyz xyz literal, well-formed tag literal, well-formed tag xyz } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://mycollege.edu/ ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:students ATTR: parseType = Literal PCDATA: xyz ::xotcl::rdf::parser::RDFDescription-::res2 --- rdf:Description ATTR: about = http://mycollege.edu/ ::xotcl::rdf::parser::RDFProperty-::res2::prop1 --- s:students ATTR: parseType = Literal PCDATA: xyz ::xotcl::rdf::parser::RDFBag-::res3 --- rdf:Bag TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res3::prop1 --- rdf:li ATTR: parseType = Literal PCDATA: literal, well-formed tag MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFMember-::res3::prop2 --- rdf:li ATTR: parseType = AllOtherMustbeLiteral PCDATA: literal, well-formed tag MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFMember-::res3::prop3 --- rdf:li MEMBER-INDEX: rdf:_3 ::xotcl::rdf::parser::RDFDescription-::res3::prop3::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res3::prop3::res1::prop1 --- s:x PCDATA: xyz } { http://mycollege.edu/ http://description.org/schema/students xyz http://mycollege.edu/ http://description.org/schema/students xyz =================== unreferenced: rdfdoc#id3 #type #Bag rdfdoc#id3 #_1 literal, well-formed tag rdfdoc#id3 #_2 literal, well-formed tag rdfdoc#id3 #_3 rdfdoc#id4 rdfdoc#id4 http://description.org/schema/x xyz } ############################################################################## rp test typedNode1 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.xyz.com TYPES: http://purl.org/dc/elements/1.0/typed ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- DC:Creator ATTR: rdf:resource = http://www.xyz.com/homepage/ } { http://www.xyz.com http://purl.org/dc/elements/1.0/Creator http://www.xyz.com/homepage/ http://www.xyz.com #type http://purl.org/dc/elements/1.0/typed } ################################################################### ## UWE: im wiedererzeugten XML/RDF fehlt m.M. das parseType="Resosurce" rp test nestedProperty { } { ::xotcl::rdf::parser::RDFTag- --- RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- Description ATTR: about = http://www.webnuts.net/Jan97.html ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- dc:Subject ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- value PCDATA: 020 - Library Science ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- l:Classification PCDATA: Dewey Decimal Code } { http://www.webnuts.net/Jan97.html http://purl.org/metadata/dublin_core#Subject rdfdoc#id2 rdfdoc#id2 #value 020 - Library Science rdfdoc#id2 http://mycorp.com/schemas/my-schema#Classification Dewey Decimal Code } rp test nestedProperty2 { 020 - Library Science Dewey Decimal Code } { ::xotcl::rdf::parser::RDFTag- --- RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- Description ATTR: about = http://www.webnuts.net/Jan97.html ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- dc:Subject ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- value PCDATA: 020 - Library Science ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- l:Classification PCDATA: Dewey Decimal Code } { http://www.webnuts.net/Jan97.html http://purl.org/metadata/dublin_core#Subject rdfdoc#id2 rdfdoc#id2 #value 020 - Library Science rdfdoc#id2 http://mycorp.com/schemas/my-schema#Classification Dewey Decimal Code } rp test nestedProperty3 { 020 - Library Science Dewey Decimal Code } { ::xotcl::rdf::parser::RDFTag- --- RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- Description ATTR: about = http://www.webnuts.net/Jan97.html ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- dc:Subject ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- value PCDATA: 020 - Library Science ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- l:Classification PCDATA: Dewey Decimal Code } { http://www.webnuts.net/Jan97.html http://purl.org/metadata/dublin_core#Subject rdfdoc#id2 rdfdoc#id2 #value 020 - Library Science rdfdoc#id2 http://mycorp.com/schemas/my-schema#Classification Dewey Decimal Code } rp test nestedProperty4 { 020 - Library Science en Dewey Decimal Code } { ::xotcl::rdf::parser::RDFTag- --- RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- Description ATTR: about = http://www.webnuts.net/Jan97.html ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- dc:Subject ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- value PCDATA: 020 - Library Science ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- l:Classification ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1::prop2::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2::res1::prop1 --- l:lang PCDATA: en ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2::res1::prop2 --- l:string PCDATA: Dewey Decimal Code } { http://www.webnuts.net/Jan97.html http://purl.org/metadata/dublin_core#Subject rdfdoc#id2 rdfdoc#id2 #value 020 - Library Science rdfdoc#id2 http://mycorp.com/schemas/my-schema#Classification rdfdoc#id3 rdfdoc#id3 http://mycorp.com/schemas/my-schema#lang en rdfdoc#id3 http://mycorp.com/schemas/my-schema#string Dewey Decimal Code } rp test thirdAbbrev1 { Ora Lassila lassila@w3.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ATTR: about = http://www.w3.org/staffId/85740 TYPES: http://description.org/schema/Person ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- s:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator http://www.w3.org/staffId/85740 http://www.w3.org/staffId/85740 http://description.org/schema/Name Ora Lassila http://www.w3.org/staffId/85740 http://description.org/schema/Email lassila@w3.org http://www.w3.org/staffId/85740 #type http://description.org/schema/Person } rp test thirdAbbrev2 { Ora Lassila lassila@w3.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description TYPES: http://description.org/schema/Person ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- s:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator rdfdoc#id2 rdfdoc#id2 http://description.org/schema/Name Ora Lassila rdfdoc#id2 http://description.org/schema/Email lassila@w3.org rdfdoc#id2 #type http://description.org/schema/Person } rp test thirdAbbrev3 { Ora Lassila lassila@w3.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ATTR: about = http://www.w3.org/staffId/85740 TYPES: http://description.org/schema/Person ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- s:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator http://www.w3.org/staffId/85740 http://www.w3.org/staffId/85740 http://description.org/schema/Name Ora Lassila http://www.w3.org/staffId/85740 http://description.org/schema/Email lassila@w3.org http://www.w3.org/staffId/85740 #type http://description.org/schema/Person } rp test thirdAbbrev4 { Ora Lassila lassila@w3.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description TYPES: http://description.org/schema/Person ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- s:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator rdfdoc#id2 rdfdoc#id2 http://description.org/schema/Name Ora Lassila rdfdoc#id2 http://description.org/schema/Email lassila@w3.org rdfdoc#id2 #type http://description.org/schema/Person } rp test secondAbbrev1 { Ora Lassila lassila@w3.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ATTR: about = http://www.w3.org/staffId/85740 ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- s:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator http://www.w3.org/staffId/85740 http://www.w3.org/staffId/85740 http://description.org/schema/Name Ora Lassila http://www.w3.org/staffId/85740 http://description.org/schema/Email lassila@w3.org } rp test secondAbbrev2 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ATTR: about = http://www.w3.org/staffId/85740 ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- s:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator http://www.w3.org/staffId/85740 http://www.w3.org/staffId/85740 http://description.org/schema/Name Ora Lassila http://www.w3.org/staffId/85740 http://description.org/schema/Email lassila@w3.org } rp test secondAbbrev3 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- s:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- s:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://description.org/schema/Creator rdfdoc#id2 rdfdoc#id2 http://description.org/schema/Name Ora Lassila rdfdoc#id2 http://description.org/schema/Email lassila@w3.org } ################################################################### rp test resource1 { Ora Lassila lassila@w3.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ATTR: rdf:resource = http://www.w3.org/staffId/85740 ::xotcl::rdf::parser::RDFDescription-::res2 --- rdf:Description ATTR: about = http://www.w3.org/staffId/85740 ::xotcl::rdf::parser::RDFProperty-::res2::prop1 --- v:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res2::prop2 --- v:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://schema.org/Creator http://www.w3.org/staffId/85740 http://www.w3.org/staffId/85740 v:Name Ora Lassila http://www.w3.org/staffId/85740 v:Email lassila@w3.org } ################################################################### rp test resource2 { Ora Lassila lassila@w3.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.w3.org/Home/Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Creator ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ATTR: about = http://www.w3.org/staffId/85740 ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- v:Name PCDATA: Ora Lassila ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- v:Email PCDATA: lassila@w3.org } { http://www.w3.org/Home/Lassila http://schema.org/Creator http://www.w3.org/staffId/85740 http://www.w3.org/staffId/85740 v:Name Ora Lassila http://www.w3.org/staffId/85740 v:Email lassila@w3.org } ################################################################### rp test typedNode1 { Uwe Zdun uwe@xotcl.org } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://www.xotcl.org/uwe TYPES: http://description.org/schema/Person ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- s:Name PCDATA: Uwe Zdun ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- s:Email PCDATA: uwe@xotcl.org } { http://www.xotcl.org/uwe http://description.org/schema/Name Uwe Zdun http://www.xotcl.org/uwe http://description.org/schema/Email uwe@xotcl.org http://www.xotcl.org/uwe #type http://description.org/schema/Person } rp test typedNode2 { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: rdf:about = http://www.xotcl.org/uwe TYPES: http://description.org/schema/Person ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- Name PCDATA: Uwe Zdun ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- Email PCDATA: uwe@xotcl.org } { http://www.xotcl.org/uwe http://description.org/schema/Name Uwe Zdun http://www.xotcl.org/uwe http://description.org/schema/Email uwe@xotcl.org http://www.xotcl.org/uwe #type http://description.org/schema/Person } ################################################################### rp test complexListItems { en Object Oriented Design and System Development en Introduction to the concepts of object-oriented programing de Einführung in die Konzepte objekt-orientierter Programmierung } { ::xotcl::rdf::parser::RDFTag- --- RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://nm.wu-wien.ac.at/Lehre/oo1/ ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- gen:Title ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- xml:lang PCDATA: en ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- gen:String PCDATA: Object Oriented Design and System Development ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- gen:Description ::xotcl::rdf::parser::RDFBag-::res1::prop2::res1 --- rdf:Bag TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag ::xotcl::rdf::parser::RDFMember-::res1::prop2::res1::prop1 --- rdf:li MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFDescription-::res1::prop2::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop1::res1::prop1 --- xml:lang PCDATA: en ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop1::res1::prop2 --- gen:String PCDATA: Introduction to the concepts of object-oriented programing ::xotcl::rdf::parser::RDFMember-::res1::prop2::res1::prop2 --- rdf:li MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFDescription-::res1::prop2::res1::prop2::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop2::res1::prop1 --- xml:lang PCDATA: de ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop2::res1::prop2 --- gen:String PCDATA: Einführung in die Konzepte objekt-orientierter Programmierung } { http://nm.wu-wien.ac.at/Lehre/oo1/ http://universal.org/metadata/ims#Title rdfdoc#id2 rdfdoc#id2 xml:lang en rdfdoc#id2 http://universal.org/metadata/ims#String Object Oriented Design and System Development http://nm.wu-wien.ac.at/Lehre/oo1/ http://universal.org/metadata/ims#Description rdfdoc#id3 rdfdoc#id3 #type #Bag rdfdoc#id3 #_1 rdfdoc#id4 rdfdoc#id4 xml:lang en rdfdoc#id4 http://universal.org/metadata/ims#String Introduction to the concepts of object-oriented programing rdfdoc#id3 #_2 rdfdoc#id5 rdfdoc#id5 xml:lang de rdfdoc#id5 http://universal.org/metadata/ims#String Einführung in die Konzepte objekt-orientierter Programmierung } ################################################################### rp test complexListItems2 { en Object Oriented Design and System Development en Introduction to the concepts of object-oriented programing de Einführung in die Konzepte objekt-orientierter Programmierung } { ::xotcl::rdf::parser::RDFTag- --- RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = http://nm.wu-wien.ac.at/Lehre/oo1/ ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- gen:Title ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- xml:lang PCDATA: en ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- gen:String PCDATA: Object Oriented Design and System Development ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- gen:Description ::xotcl::rdf::parser::RDFSeq-::res1::prop2::res1 --- rdf:Seq TYPES: http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq ::xotcl::rdf::parser::RDFMember-::res1::prop2::res1::prop1 --- rdf:li MEMBER-INDEX: rdf:_1 ::xotcl::rdf::parser::RDFDescription-::res1::prop2::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop1::res1::prop1 --- cls:entry ::xotcl::rdf::parser::RDFDescription-::res1::prop2::res1::prop1::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop1::res1::prop1::res1::prop1 --- gen:language PCDATA: en ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop1::res1::prop1::res1::prop2 --- gen:String PCDATA: Introduction to the concepts of object-oriented programing ::xotcl::rdf::parser::RDFMember-::res1::prop2::res1::prop2 --- rdf:li MEMBER-INDEX: rdf:_2 ::xotcl::rdf::parser::RDFDescription-::res1::prop2::res1::prop2::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop2::res1::prop1 --- xml:lang PCDATA: de ::xotcl::rdf::parser::RDFProperty-::res1::prop2::res1::prop2::res1::prop2 --- gen:String PCDATA: Einführung in die Konzepte objekt-orientierter Programmierung } { http://nm.wu-wien.ac.at/Lehre/oo1/ http://universal.org/metadata/ims#Title rdfdoc#id2 rdfdoc#id2 xml:lang en rdfdoc#id2 http://universal.org/metadata/ims#String Object Oriented Design and System Development http://nm.wu-wien.ac.at/Lehre/oo1/ http://universal.org/metadata/ims#Description rdfdoc#id3 rdfdoc#id3 #type #Seq rdfdoc#id3 #_1 rdfdoc#id4 rdfdoc#id4 cls:entry rdfdoc#id5 rdfdoc#id5 http://universal.org/metadata/ims#language en rdfdoc#id5 http://universal.org/metadata/ims#String Introduction to the concepts of object-oriented programing rdfdoc#id3 #_2 rdfdoc#id6 rdfdoc#id6 xml:lang de rdfdoc#id6 http://universal.org/metadata/ims#String Einführung in die Konzepte objekt-orientierter Programmierung } ################################################################### rp test dmoz { Computers } { ::xotcl::rdf::parser::RDFTag- --- r:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- r:Description ATTR: r:ID = Top/Computers TYPES: http://dmoz.org/rdf/Topic ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- tag ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- r:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- catid PCDATA: 4 ::xotcl::rdf::parser::RDFProperty-::res1::prop2 --- d:Title PCDATA: Computers ::xotcl::rdf::parser::RDFProperty-::res1::prop3 --- link ATTR: r:resource = http://www.cs.tcd.ie/FME/ ::xotcl::rdf::parser::RDFProperty-::res1::prop4 --- link ATTR: r:resource = http://pages.whowhere.com/computers/pnyhlen/Timeline.html } { Top/Computers http://dmoz.org/rdf/tag rdfdoc#id2 rdfdoc#id2 http://dmoz.org/rdf/catid 4 Top/Computers http://purl.org/dc/elements/1.0/Title Computers Top/Computers http://dmoz.org/rdf/link http://www.cs.tcd.ie/FME/ Top/Computers http://dmoz.org/rdf/link http://pages.whowhere.com/computers/pnyhlen/Timeline.html Top/Computers #type http://dmoz.org/rdf/Topic } ############################################################################## rp test "IDforNestedDescription" { } { ::xotcl::rdf::parser::RDFTag- --- rdf:RDF ::xotcl::rdf::parser::RDFDescription-::res1 --- rdf:Description ATTR: about = page ::xotcl::rdf::parser::RDFProperty-::res1::prop1 --- g2k:area ATTR: rdf:ID = b14711 ::xotcl::rdf::parser::RDFDescription-::res1::prop1::res1 --- rdf:Description ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop1 --- g2k:term PCDATA: Hessen ::xotcl::rdf::parser::RDFProperty-::res1::prop1::res1::prop2 --- g2k:type PCDATA: Land } { b14711 http://g2k-schema#term Hessen b14711 http://g2k-schema#type Land page http://g2k-schema#area b14711 } puts "FINISHED TEST! ([rp set nodeTime] + [rp set recreateTime] + [rp set tripleTime] = [expr {[rp set nodeTime] + [rp set recreateTime] + [rp set tripleTime]}])" ./xotcl-1.6.8/unix/._pkgIndex.unix.in000644 000765 000024 00000000430 12161600406 020074 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/unix/pkgIndex.unix.in000644 000765 000024 00000000145 12161600406 017662 0ustar00neumannstaff000000 000000 package ifneeded XOTcl @PACKAGE_VERSION@ [list load \ [file join $dir @PKG_LIB_FILE@] XOTcl] ./xotcl-1.6.8/unix/._tclAppInit.c000644 000765 000024 00000000430 12327644373 017243 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/unix/tclAppInit.c000644 000765 000024 00000011771 12327644373 017040 0ustar00neumannstaff000000 000000 /* * tclAppInit.c -- * * Provides a default version of the main program and Tcl_AppInit * procedure for Tcl applications (without Tk). * * Copyright (c) 1993 The Regents of the University of California. * Copyright (c) 1994-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include "tcl.h" #include #ifdef TCL_TEST #include "tclInt.h" extern int Procbodytest_Init _ANSI_ARGS_((Tcl_Interp *interp)); extern int Procbodytest_SafeInit _ANSI_ARGS_((Tcl_Interp *interp)); extern int TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp)); extern int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); #ifdef TCL_THREADS extern int TclThread_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif #endif /* TCL_TEST */ #ifdef TCL_XT_TEST extern void XtToolkitInitialize _ANSI_ARGS_((void)); extern int Tclxttest_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* *---------------------------------------------------------------------- * * main -- * * This is the main program for the application. * * Results: * None: Tcl_Main never returns here, so this procedure never * returns either. * * Side effects: * Whatever the application does. * *---------------------------------------------------------------------- */ int main(argc, argv) int argc; /* Number of command-line arguments. */ char **argv; /* Values of command-line arguments. */ { /* * The following #if block allows you to change the AppInit * function by using a #define of TCL_LOCAL_APPINIT instead * of rewriting this entire file. The #if checks for that * #define and uses Tcl_AppInit if it doesn't exist. */ #ifndef TCL_LOCAL_APPINIT #define TCL_LOCAL_APPINIT Tcl_AppInit #endif extern int TCL_LOCAL_APPINIT _ANSI_ARGS_((Tcl_Interp *interp)); /* * The following #if block allows you to change how Tcl finds the startup * script, prime the library or encoding paths, fiddle with the argv, * etc., without needing to rewrite Tcl_Main() */ #ifdef TCL_LOCAL_MAIN_HOOK extern int TCL_LOCAL_MAIN_HOOK _ANSI_ARGS_((int *argc, char ***argv)); #endif #ifdef TCL_XT_TEST XtToolkitInitialize(); #endif #ifdef TCL_LOCAL_MAIN_HOOK TCL_LOCAL_MAIN_HOOK(&argc, &argv); #endif Tcl_Main(argc, argv, TCL_LOCAL_APPINIT); return 0; /* Needed only to prevent compiler warning. */ } /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in the interp's result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(interp) Tcl_Interp *interp; /* Interpreter for application. */ { if ((Tcl_Init)(interp) == TCL_ERROR) { return TCL_ERROR; } #ifdef TCL_TEST #ifdef TCL_XT_TEST if (Tclxttest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #endif if (Tcltest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "Tcltest", Tcltest_Init, (Tcl_PackageInitProc *) NULL); if (TclObjTest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #ifdef TCL_THREADS if (TclThread_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #endif if (Procbodytest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "procbodytest", Procbodytest_Init, Procbodytest_SafeInit); #endif /* TCL_TEST */ /* * Call the init procedures for included packages. Each call should * look like this: * * if (Mod_Init(interp) == TCL_ERROR) { * return TCL_ERROR; * } * * where "Mod" is the name of the module. */ if (Xotcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "XOTcl", Xotcl_Init, 0); if (Tcl_Import(interp, Tcl_GetGlobalNamespace(interp), "::xotcl::*", /* allowOverwrite */ 1) != TCL_OK) { return TCL_ERROR; } /* * Call Tcl_CreateCommand for application-specific commands, if * they weren't already created by the init procedures called above. */ /* * Specify a user-specific startup file to invoke if the application * is run interactively. Typically the startup file is "~/.apprc" * where "app" is the name of the application. If this line is deleted * then no user-specific startup file will be run under any conditions. */ #ifdef DJGPP Tcl_SetVar(interp, "tcl_rcFileName", "~/tclsh.rc", TCL_GLOBAL_ONLY); #else Tcl_SetVar(interp, "tcl_rcFileName", "~/.tclshrc", TCL_GLOBAL_ONLY); #endif return TCL_OK; } ./xotcl-1.6.8/unix/._tkAppInit.c000644 000765 000024 00000000430 12326515672 017075 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/unix/tkAppInit.c000644 000765 000024 00000004343 12326515672 016667 0ustar00neumannstaff000000 000000 /* * tkAppInit.c -- * * Provides a default version of the Tcl_AppInit procedure for * use in wish and similar Tk-based applications. * * Copyright (c) 1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #include "tk.h" #include "locale.h" #include /* *---------------------------------------------------------------------- * * main -- * * This is the main program for the application. * * Results: * None: Tk_Main never returns here, so this procedure never * returns either. * * Side effects: * Whatever the application does. * *---------------------------------------------------------------------- */ int main(argc, argv) int argc; /* Number of command-line arguments. */ char **argv; /* Values of command-line arguments. */ { Tk_Main(argc, argv, Tcl_AppInit); return 0; /* Needed only to prevent compiler warning. */ } /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in interp->result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(interp) Tcl_Interp *interp; /* Interpreter for application. */ { if ((Tcl_Init)(interp) == TCL_ERROR) { return TCL_ERROR; } if (Tk_Init(interp) == TCL_ERROR) { return TCL_ERROR; } if (Xotcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); Tcl_StaticPackage(interp, "XOTcl", Xotcl_Init, 0); if (Tcl_Import(interp, Tcl_GetGlobalNamespace(interp), "::xotcl::*", /* allowOverwrite */ 1) != TCL_OK) { return TCL_ERROR; } Tcl_SetVar(interp, "tcl_rcFileName", "~/.wishrc", TCL_GLOBAL_ONLY); return TCL_OK; } ./xotcl-1.6.8/unix/._xotcl.spec.in000644 000765 000024 00000000430 12161600406 017423 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/unix/xotcl.spec.in000644 000765 000024 00000003321 12161600406 017210 0ustar00neumannstaff000000 000000 Summary: Object Oriented Extension for Tcl Name: xotcl Version: @PACKAGE_VERSION@ Release: 0 License: bsd style open source Group: Development/Languages Source: http://www.xotcl.org/xotcl-@PACKAGE_VERSION@.tar.gz URL: http://www.xotcl.org Packager: Gustaf.Neumann@wu-wien.ac.at Distribution: Fedorea Core 7 Requires: tcl Prefix: /usr BuildRoot: %{_tmppath}/%{name}-root BuildRequires: autoconf %description XOTcl is an object-oriented scripting language based on MIT's OTcl. This packages provides a pre-packaged tcl-shell (xotclsh) and tk-shell (xowish) together with the Tcl-extension (libxotcl.so) which can be loaded to any Tcl-application. Furthermore it includes several xotcl-based packages for e.g. HTTP client and server, XML, RDF, persistent object store, mobile code system, etc. For more details consult http://www.xotcl.org %prep %setup -q -n xotcl-@PACKAGE_VERSION@ %build autoconf # ./configure --with-tcl=/usr/lib --with-all --prefix=@prefix@ --exec-prefix=@prefix@ ./configure --with-tcl=/usr/lib --with-all --prefix=/usr --exec-prefix=/usr # make CFLAGS_DEFAULT='-O3 -mcpu=i686 -Wall -fomit-frame-pointer' make CFLAGS_DEFAULT='-O3 -Wall -fomit-frame-pointer' %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install rm -f $RPM_BUILD_ROOT/usr/lib/libxotcl@PACKAGE_VERSION@.so ln -s xotcl@PACKAGE_VERSION@/libxotcl@PACKAGE_VERSION@.so $RPM_BUILD_ROOT/usr/lib %files %defattr(-, root, root) %doc doc %_bindir/xotclsh %_bindir/xowish %_prefix/lib/xotcl@PACKAGE_VERSION@ %_prefix/lib/libxotcl@PACKAGE_VERSION@.so %_prefix/lib/xotclexpat* %_prefix/lib/xotclgdbm* %_prefix/lib/xotclsdbm* %_prefix/lib/xotclConfig.sh %_includedir/xotcl.h %_includedir/xotclInt.h %_includedir/xotclDecls.h %_includedir/xotclIntDecls.h./xotcl-1.6.8/win/._configs.vc000755 000765 000024 00000000430 12161600406 016610 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/configs.vc000755 000765 000024 00000006022 12161600406 016376 0ustar00neumannstaff000000 000000 # # Config file for MS Visual CC compile with nmake; only edit in this file # # are we using MSVC++ version 5 or 6 ? MSDEV_VER = 6 # Where is MSVC++ located? MSDEVROOT = c:\progra~1\Micros~3\ # Where is Tcl and Tk? Which Version? #TCLMAJOR = 8 #TCLMINOR = 3 #TCLPATCHLEVEL = .5 TCLMAJOR = 8 TCLMINOR = 4 TCLPATCHLEVEL = .13 TCLROOT = c:\work\tcl\tcl$(TCLMAJOR).$(TCLMINOR)$(TCLPATCHLEVEL) TKROOT = c:\tk$(TCLMAJOR).$(TCLMINOR)$(TCLPATCHLEVEL) TCL_VERSION = $(TCLMAJOR)$(TCLMINOR) TCL_DOTVERSION = $(TCLMAJOR).$(TCLMINOR) # Where will we install XOTcl? Usually use the installWin.tcl script INSTALLDIR = c:/progra~1/tcl # machine setting, pick from: # ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH4 # Or set to IA64 to rearrange everything to use the Intel IA64 SDK. # MACHINE = IX86 !if "$(MACHINE)" == "IA64" vcvars = "c:\ia64sdk17\vcvars32.bat" !elseif $(MSDEV_VER) == 5 vcvars = "$(MSDEVROOT)\vc\bin\vcvars32.bat" !elseif $(MSDEV_VER) == 6 vcvars = "$(MSDEVROOT)\vc98\bin\vcvars32.bat" !endif # the VCC tools names rc32 = rc cc32 = cl link32 = link lib32 = lib cvtres32 = cvtres # # XOTCL VERSION SETTINGS (do not edit) # XOTCL_MAJOR_VERSION=1 XOTCL_MINOR_VERSION=5 XOTCL_RELEASE_LEVEL=.0 MAJOR_VERSION=$(XOTCL_MAJOR_VERSION) MINOR_VERSION=$(XOTCL_MINOR_VERSION) PATCHLEVEL=$(XOTCL_RELEASE_LEVEL) XOTCL_VERSION= $(MAJOR_VERSION).$(MINOR_VERSION) FULLVERSION= $(MAJOR_VERSION).$(MINOR_VERSION)$(PATCHLEVEL) NODOT_VERSION= $(MAJOR_VERSION)$(MINOR_VERSION) INST_XOLIBPKG = \"$(INSTALLDIR)/lib/xotcl$(MAJOR_VERSION).$(MINOR_VERSION)\" XOTCLVERSION = \"$(XOTCL_VERSION)\" PACKAGE_VERSION = \"$(FULLVERSION)\" XOTCLPATCHLEVEL= \"$(PATCHLEVEL)\" ## command line rules !ifndef HAVE_RULES HAVE_RULES = 1 # Set DEBUG to 1 to compile with symbols. !ifndef DEBUG DEBUG = 0 !endif # Set STATIC_BUILD to 1 to make a static library rather # than a dll. !ifndef STATIC_BUILD STATIC_BUILD = 0 !endif # Set USE_TCL_STUBS to 0 to disable Stubs support. Stubs # will work fine even with static libraries, but you may # disable it if you want to. # !ifndef USE_TCL_STUBS !if $(STATIC_BUILD) == 0 USE_TCL_STUBS = 1 !else USE_TCL_STUBS = 0 !endif !endif # no stubs support in Tcl 8.0 !if $(TCLMAJOR) == 8 !if $(TCLMINOR) == 0 USE_TCL_STUBS = 0 !endif !endif # Set NOMSVCRT to 1 to use libcmt(d).lib instead of the # dynamic run-time. # !ifndef NOMSVCRT !if $(STATIC_BUILD) NOMSVCRT = 1 !else NOMSVCRT = 0 !endif !endif !if $(STATIC_BUILD) == 0 && $(NOMSVCRT) == 1 !error "The static runtime in a loadable (dll) extension is a useless configuration that will cause abnormal and unnecessary code bloat." !endif !endif #!ifndef HAVE_RULES _NMAKE_VER = $(_NMAKE_VER:6.00.8168.0=600) !IF "$(MACHINE)" == "IA64" TOOLS32 = c:\ia64sdk17 TOOLS32_rc = c:\ia64sdk17 !ELSE TOOLS32 = $(MSDEVROOT)\Vc98 TOOLS32_rc = $(MSDEVROOT)\Common\MsDev98 !ENDIF cc32 = "$(TOOLS32)\bin\cl.exe" link32 = "$(TOOLS32)\bin\link.exe" rc32 = "$(TOOLS32_rc)\bin\rc.exe" include32 = -I"$(TOOLS32)\include" libpath32 = /LIBPATH:"$(TOOLS32)\lib" lib32 = "$(TOOLS32)\bin\lib.exe" ./xotcl-1.6.8/win/._dllBase.txt000644 000765 000024 00000000430 12161600406 016732 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/dllBase.txt000644 000765 000024 00000002065 12161600406 016523 0ustar00neumannstaff000000 000000 ; ; This file defines the virtual base addresses for the Dynamic Link Libraries ; that are part of the XOTcl system. The first token on a line is the key (or ; name of the DLL) and the second token is the virtual base address, in hexidecimal. ; The third token is the maximum size of the DLL image file, including symbols. ; ; Using a specified "prefered load address" should speed loading time by avoiding ; relocations (NT supported only). It is assumed extension authors will contribute ; their modules to this grand-master list. You can use the dumpbin utility with ; the /headers option to get the "size of image" data (already in hex). If the ; maximum size is too small a linker warning will occur. Modules can overlap when ; they're mutually exclusive. This info is placed in the DLL's PE header by the ; linker with the `-base:@$(XOTCL_DIR)\win\dllBase.txt,` option. ; ; RCS: @(#) $$ .\Release\libxotcl1.1.dll 0x67000000 0x00020000 .\Release\libxotclsdbm1.1.dll 0x67020000 0x00010000 .\Release\libxotclexpat1.1.dll 0x67030000 0x00020000 ./xotcl-1.6.8/win/._dllEntryPoint.c000644 000765 000024 00000000430 12161600406 017576 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/dllEntryPoint.c000644 000765 000024 00000002321 12161600406 017362 0ustar00neumannstaff000000 000000 /* * dllEntryPoint.c -- * * This file implements the Dll entry point as needed by Windows. */ #define WIN32_LEAN_AND_MEAN #include #ifdef _MSC_VER /* Only do this when MSVC++ is compiling us. */ # define DllEntryPoint DllMain # if defined(USE_TCL_STUBS) && (!defined(_MT) || !defined(_DLL) || defined(_DEBUG)) /* * This fixes a bug with how the Stubs library was compiled. * The requirement for msvcrt.lib from tclstubXX.lib should * be removed. */ # pragma comment(linker, "-nodefaultlib:msvcrt.lib") # endif #endif /* *---------------------------------------------------------------------- * * DllEntryPoint -- * * This wrapper function is used by Windows to invoke the * initialization code for the DLL. If we are compiling * with Visual C++, this routine will be renamed to DllMain. * * Results: * Returns TRUE; * * Side effects: * None. * *---------------------------------------------------------------------- */ #ifndef STATIC_BUILD BOOL APIENTRY DllEntryPoint(hInst, reason, reserved) HINSTANCE hInst; /* Library instance handle. */ DWORD reason; /* Reason this function is being called. */ LPVOID reserved; /* Not used. */ { return TRUE; } #endif./xotcl-1.6.8/win/._installWin.tcl000755 000765 000024 00000000430 12161600406 017456 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/installWin.tcl000755 000765 000024 00000007073 12161600406 017253 0ustar00neumannstaff000000 000000 # $Id: installWin.tcl,v 1.1 2004/05/23 22:50:39 neumann Exp $ if {$::argc > 0} { set DESTINATION [lindex $argv 0] } else { # if now argument is given -> set to default set DESTINATION "/Progra~1/Tcl" } puts "Installing to Directory: $DESTINATION" #rename file tcl_file #proc file args { # puts stderr "...$args" # eval ::tcl_file $args #} # # find out the XOTcl version # cd .. set xotclDir . set buildDir $xotclDir/win/Release cd $buildDir set xotcllib [lindex [glob -nocomplain libxotcl*.dll] 0] cd ../.. regexp {^libxotcl([0-9]\.[0-9]).dll$} $xotcllib _ xotclVersion puts "XOTcl Version is $xotclVersion" set MAKEXOTCL $xotclDir/library/lib/make.xotcl # # copy binaries # file mkdir $DESTINATION/bin set bin "xotclsh.exe xowish.exe" foreach b $bin { if {[file exists $buildDir/$b]} { puts "Copying $b" file copy -force $buildDir/$b $DESTINATION/bin } elseif {[file exists $xotclDir/$b]} { puts "Copying $b" file copy -force $xotclDir/$b $DESTINATION/bin } } # # copy libraries # file mkdir $DESTINATION/include set includes "xotcl.h xotclInt.h xotclDecls.h xotclIntDecls.h" foreach i $includes { puts "Copying $i" file copy -force $xotclDir/generic/$i $DESTINATION/include } # # create the XOTcl library directory # puts "Creating XOTcl Lib Dir" file mkdir $DESTINATION/lib file mkdir $DESTINATION/lib/xotcl$xotclVersion # # copy the dll # set b libxotcl${xotclVersion}.dll if {[file exists $buildDir/$b]} { puts "Copying $b" file copy -force $buildDir/$b $DESTINATION/lib } elseif {[file exists $xotclDir/$b]} { puts "Copying $b" file copy -force $xotclDir/$b $DESTINATION/lib } # # create a pkgindex file for xotcl in the library directoy # #file mkdir $DESTINATION/lib/xotcl$xotclVersion/libxotcl puts "Creating pkgindex files for xotcl in the library directory" #set pkgIndex "package ifneeded XOTcl $xotclVersion \[list load \[file join \$dir ../../../bin \"libxotcl${xotclVersion}.dll\"\] XOTcl\]" #set F [open $DESTINATION/lib/xotcl$xotclVersion/libxotcl/pkgIndex.tcl w] #puts $F $pkgIndex #puts $F "\n" #close $F ## and one in the xotcl- directory set pkgIndex "package ifneeded XOTcl $xotclVersion \[list load \[file join \$dir ../../ \"libxotcl${xotclVersion}.dll\"\] XOTcl\]" file mkdir $DESTINATION/lib/xotcl$xotclVersion/xotcl set F [open $DESTINATION/lib/xotcl$xotclVersion/xotcl/pkgIndex.tcl w] puts $F $pkgIndex puts $F "\n" close $F proc copyDir {dir dest} { puts "Copying directory: $dir" set files [glob -nocomplain $dir/*] foreach f $files { doDir $f $dest } } proc doDir {f dest} { if {[file isdirectory $f]} { file mkdir $dest/$f copyDir $f $dest } else { file copy -force $f $dest/$f } } cd library foreach f [glob -nocomplain *] { doDir $f $DESTINATION/lib/xotcl$xotclVersion } cd .. set pwd [pwd] puts "Indexing the packages" set shell [info nameofexecutable] #puts "SHELL=$shell" cd $DESTINATION/lib/xotcl$xotclVersion if {[catch {exec $shell $pwd/$MAKEXOTCL -target $DESTINATION/lib/xotcl$xotclVersion -all} errMsg]} { puts " ... resulting message: $errMsg\n" } else { puts " ... Package Indexing SUCCEEDED\n" } puts stderr "***************************************************" puts stderr "INSTALLATION COMPLETE." puts stderr "\nIn order to use XOTcl set PATH to " puts stderr " '$DESTINATION/bin' and" puts stderr "set TCLLIBPATH to " puts stderr " '$DESTINATION/lib/xotcl$xotclVersion'" puts stderr "***************************************************" ./xotcl-1.6.8/win/._Makefile.vc000644 000765 000024 00000000430 12161600406 016672 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/Makefile.vc000644 000765 000024 00000026700 12161600406 016465 0ustar00neumannstaff000000 000000 ###################################################################### # # Microsoft Visual C++ makefile for XOTcl # # do not edit in this file, edit "configs.vc" # ###################################################################### !include "configs.vc" BINROOT = . ROOT = .. NAMEPREFIX = lib NAME = xotcl STUBSUFFIX = stub XOTCL_DIR = .. XOTCL_BUILD_DIR = ..\win SDBM_DIR = ..\library\store\XOTclSdbm EXPAT_DIR = ..\library\xml\TclExpat-1.1 MAKE_XOTCL = .\library\lib\make.xotcl MAKECMD = nmake.exe -nologo /$(MAKEFLAGS) -f makefile.vc ######################################################################## lflags = /NODEFAULTLIB /NOLOGO /MACHINE:$(MACHINE) $(libpath32) conlflags = $(lflags) -subsystem:console -entry:mainCRTStartup guilflags = $(lflags) -subsystem:windows -entry:WinMainCRTStartup !IF "$(MACHINE)" == "PPC" libc = libc$(DBGX).lib libcdll = crtdll$(DBGX).lib !ELSE libc = libc$(DBGX).lib oldnames.lib libcdll = msvcrt$(DBGX).lib oldnames.lib !ENDIF baselibs = kernel32.lib $(optlibs) advapi32.lib user32.lib winlibs = $(baselibs) gdi32.lib comdlg32.lib winspool.lib guilibs = $(libc) $(winlibs) conlibs = $(libc) $(baselibs) guilibsdll = $(libcdll) $(winlibs) conlibsdll = $(libcdll) $(baselibs) ######################################################################## !if $(DEBUG) TMPNAME = Debug DBGX = d !else TMPNAME = Release DBGX = !endif TMP_DIR = $(BINROOT)\$(TMPNAME) !ifndef OUT_DIR OUT_DIR = $(TMP_DIR) !endif !if $(STATIC_BUILD) XOTCLOUTNAME = $(NAMEPREFIX)$(NAME)$(XOTCL_VERSION)$(DBGX) XOTCLTARGET = "$(OUT_DIR)\$(XOTCLOUTNAME).lib" !else XOTCLOUTNAME = $(NAMEPREFIX)$(NAME)$(XOTCL_VERSION)$(DBGX) XOTCLIMPLIB = "$(OUT_DIR)\$(XOTCLOUTNAME).lib" XOTCLTARGET = "$(OUT_DIR)\$(XOTCLOUTNAME).dll" !endif TCLSTUBLIB = "$(TCLROOT)\win\Release\tclstub$(TCL_VERSION).lib" TCLIMPLIB = "$(TCLROOT)\win\$(OUT_DIR)\tcl$(TCL_VERSION)$(DBGX).lib" TKIMPLIB = "$(TKROOT)\win\$(OUT_DIR)\tk$(TCL_VERSION)$(DBGX).lib" TCLSH = "$(TCLROOT)\win\$(OUT_DIR)\tclsh$(TCL_VERSION)$(DBGX).exe" XOTCLSTUBLIBNAME = $(NAMEPREFIX)$(NAME)$(STUBSUFFIX)$(XOTCL_VERSION)$(DBGX).lib XOTCLSTUBLIB = "$(OUT_DIR)\$(XOTCLSTUBLIBNAME)" LIB_INSTALL_DIR = $(INSTALLDIR)\lib BIN_INSTALL_DIR = $(INSTALLDIR)\bin SCRIPT_INSTALL_DIR = $(INSTALLDIR)\lib\xotcl$(XOTCL_DOTVERSION) INCLUDE_INSTALL_DIR = $(INSTALLDIR)\include XOTCLOBJS_STUB = $(TMP_DIR)\xotclStubInit.obj COMPILE_XOTCL_STUBS = -DCOMPILE_XOTCL_STUBS=1 !if $(TCLMAJOR) == 8 !if $(TCLMINOR) == 0 XOTCLOBJS_STUB = "" COMPILE_XOTCL_STUBS="" !endif !endif XOTCLOBJS = $(XOTCLOBJS_STUB) \ $(TMP_DIR)\xotcl.obj \ $(TMP_DIR)\xotclError.obj \ $(TMP_DIR)\xotclMetaData.obj \ $(TMP_DIR)\xotclObjectData.obj \ $(TMP_DIR)\xotclProfile.obj \ $(TMP_DIR)\xotclTrace.obj \ $(TMP_DIR)\xotclShadow.obj \ $(TMP_DIR)\xotclUtil.obj \ $(TMP_DIR)\aolstub.obj \ !if $(STATIC_BUILD) == 0 $(TMP_DIR)\dllEntryPoint.obj \ $(TMP_DIR)\dllResource.obj \ !endif XOTCLSHOBJS = $(TMP_DIR)\xotclAppInit.obj XOWISHOBJS = $(TMP_DIR)\winMain.obj XOTCLSTUBOBJS = \ $(TMP_DIR)\xotclStubLib.obj WINDIR = $(ROOT)\win GENERICDIR = $(ROOT)\generic RCDIR = $(ROOT)\win\rc ###################################################################### # Link flags ###################################################################### !if $(DEBUG) ldebug = -debug:full -debugtype:cv !else ldebug = -release !endif # declarations common to all linker options lcommon = -nologo -link50compat -machine:$(MACHINE) XOTCL_LFLAGS = $(lcommon) $(ldebug) -subsystem:windows -dll !if $(USE_TCL_STUBS) == 0 XOTCL_LLIBS = $(TCLIMPLIB) !else XOTCL_LLIBS = $(TCLSTUBLIB) !endif ###################################################################### # Compile flags ###################################################################### !if !$(DEBUG) # This cranks the optimization level to maximize speed cdebug = -O2 -Gs !else if "$(MACHINE)" == "IA64" cdebug = -Od -Zi !else cdebug = -Z7 -Od -WX DBGX = d !endif !if $(STATIC_BUILD) cdll = !else cdll = -GD !endif # declarations common to all compiler options ccommon = -nologo -c -W3 -YX \ !if $(STATIC_BUILD) && $(NOMSVCRT) crt = -MT$(DBGX) !else crt = -MD$(DBGX) !endif TCL_INCLUDES = -I"$(TCLROOT)\generic" TK_INCLUDES = -I"$(TKROOT)\generic" -I$(TKROOT)\win -I$(TKROOT)\xlib XOTCL_INCLUDES = -I$(WINDIR) -I$(GENERICDIR) XOTCL_DEFINES = -DBUILD_$(NAME) -DTCL_THREADS=1 \ -DXOLIBPKG=$(INST_XOLIBPKG) \ -DXOTCLVERSION=$(XOTCLVERSION) \ -DPACKAGE_VERSION=$(PACKAGE_VERSION) \ -DXOTCLPATCHLEVEL=$(XOTCLPATCHLEVEL) \ -D__WIN32__ -DVISUAL_CC $(COMPILE_XOTCL_STUBS) XOTCL_EXE_CFLAGS = $(ccommon) $(cdebug) $(crt) $(cdll) $(XOTCL_INCLUDES) \ $(XOTCL_DEFINES) $(TCL_INCLUDES) $(TK_INCLUDES) !if $(USE_TCL_STUBS) XOTCL_CFLAGS = $(XOTCL_EXE_CFLAGS) -DUSE_TCL_STUBS !else XOTCL_CFLAGS = $(XOTCL_EXE_CFLAGS) !endif ###################################################################### # Project specific targets ###################################################################### all : libs packages end #xotcl : xotclsh xowish libs : setup $(XOTCLTARGET) $(XOTCLSTUBLIB) ./pkgIndex.tcl cd $(SDBM_DIR) $(MAKECMD) cd ..\.. cd $(EXPAT_DIR) $(MAKECMD) cd ..\..\..\win end: @echo ************************************************************ @echo * @echo * Make completed. @echo * @echo * In order to test XOTcl, invoke: @echo * @echo * nmake -fmakefile.vc test @echo * @echo * In order install XOTcl, invoke the installWin.tcl @echo * installation script, like: @echo * @echo * tclsh83 installWin.tcl c:\Progra~1 @echo * @echo * or: @echo * @echo * nmake -fmakefile.vc install @echo * @echo * To run XOTcl from the local directory, set the environment @echo * variable TCLLIBPATH to the toplevel directory of xotcl and @echo * execute tclsh: @echo * @echo * set TCLLIBPATH=$(ROOT) @echo * tclsh83 @echo * package require XOTcl; namespace import -force xotcl::* @echo * @echo ************************************************************ packages : libs cd ..\library set TCLLIBPATH=$(ROOT) $(TCLSH) ..\$(MAKE_XOTCL) -target $(INST_XOLIBPKG) -all cd ..\win install : all set TCLLIBPATH=$(ROOT) $(TCLSH) .\installWin.tcl test : $(TCLSH) set TCLLIBPATH=$(ROOT) $(TCLSH) $(ROOT)\tests\speedtest.xotcl $(TCLSH) $(ROOT)\tests\testx.xotcl $(TCLSH) $(ROOT)\tests\testo.xotcl $(TCLSH) $(ROOT)\tests\forwardtest.xotcl $(TCLSH) $(ROOT)\tests\actiweb.test $(TCLSH) $(ROOT)\tests\persistence.test $(TCLSH) $(ROOT)\tests\xoRDF.test $(TCLSH) $(ROOT)\tests\xocomm.test tar : distclean cd .. tar cvfz xotcl-$(FULLVERSION).tar.gz xotcl-$(FULLVERSION)/* cd xotcl-$(FULLVERSION) ./pkgIndex.tcl : $(XOTCLTARGET) echo package ifneeded XOTcl $(XOTCL_VERSION) [list load [file join $$dir $(TMPNAME)/$(XOTCLOUTNAME).dll] XOTcl] > \ ".\pkgIndex.tcl" setup : @$(vcvars) > nul @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) &\ echo Created directory '$(TMP_DIR)' @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) &\ echo Created directory '$(OUT_DIR)' $(XOTCLTARGET) : $(XOTCLOBJS) !if $(STATIC_BUILD) $(lib32) -nologo -machine:$(MACHINE) -out:$@ @<< !else $(link32) $(XOTCL_LFLAGS) -base:@$(XOTCL_DIR)\win\dllBase.txt,$@ -out:$@ $(XOTCL_LLIBS) @<< !endif $(XOTCLOBJS) << #!if $(DEBUG) == 0 $(XOTCLSTUBLIB) : $(XOTCLSTUBOBJS) $(lib32) -nologo -out:$@ $(XOTCLSTUBOBJS) #!else #$(XOTCLSTUBLIB) : #!endif #install : all # if not exist "$(INSTALLDIR)" mkdir "$(INSTALLDIR)" # if not exist "$(BIN_INSTALL_DIR)" mkdir "$(BIN_INSTALL_DIR)" # if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)" # if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)" # if not exist "$(INCLUDE_INSTALL_DIR)" mkdir "$(INCLUDE_INSTALL_DIR)" # copy $(XOTCLTARGET) "$(SCRIPT_INSTALL_DIR)" # -copy $(XOTCLSTUBLIB) "$(LIB_INSTALL_DIR)" # copy $(ROOT)\generic\xotcl.h "$(INCLUDE_INSTALL_DIR)" # copy $(ROOT)\generic\xotclDecls.h "$(INCLUDE_INSTALL_DIR)" # copy $(ROOT)\library\*.* "$(SCRIPT_INSTALL_DIR)" # echo package ifneeded XOTcl $(XOTCL_DOTVERSION) [list load [file join $$dir ../../bin $(XOTCLOUTNAME).dll] XOTcl] > \ # "$(SCRIPT_INSTALL_DIR)\pkgIndex.tcl" ###################################################################### # Regenerate the stubs files. ###################################################################### genstubs: $(TCLSH) $(TCLROOT)\tools\genStubs.tcl $(GENERICDIR) \ $(GENERICDIR)\xotcl.decls $(GENERICDIR)\xotclInt.decls ###################################################################### # Special case object file targets ###################################################################### # The following object is part of the stub library and should not # be built as DLL objects but none of the symbols should be exported $(TMP_DIR)\xotclStubLib.obj : $(GENERICDIR)\xotclStubLib.c $(cc32) -DSTATIC_BUILD $(XOTCL_EXE_CFLAGS) -Zl -Fo$@ $? $(TMP_DIR)\dllResource.obj : $(TMP_DIR)\xotcl.res $(cvtres32) -nologo -machine:$(MACHINE) -out:$@ $? predefined : $(GENERICDIR)\predefined.xotcl cd $(GENERICDIR) $(TCLSH) mk_predefined.xotcl > predefined.h cd ..\win ###################################################################### # Inference rules. Use batch-mode when supported. ###################################################################### $(TMP_DIR)\xotclAppInit.obj : $(GENERICDIR)\xotclAppInit.c $(cc32) $(XOTCL_EXE_CFLAGS) -Fo$@ $? $(TMP_DIR)\findXOTcl.obj : $(GENERICDIR)\findXOTcl.c $(cc32) $(XOTCL_EXE_CFLAGS) -Fo$@ $? $(TMP_DIR)\winMain.obj : $(WINDIR)\winMain.c $(cc32) $(XOTCL_EXE_CFLAGS) -Fo$@ $? !if $(_NMAKE_VER) < 162 {$(WINDIR)}.c{$(TMP_DIR)}.obj : !else {$(WINDIR)}.c{$(TMP_DIR)}.obj :: !endif $(cc32) -DDLL_BUILD $(XOTCL_CFLAGS) -Fo$(TMP_DIR)\ @<< $< << !if $(_NMAKE_VER) < 162 {$(GENERICDIR)}.c{$(TMP_DIR)}.obj : !else {$(GENERICDIR)}.c{$(TMP_DIR)}.obj :: !endif $(cc32) -DDLL_BUILD $(XOTCL_CFLAGS) -Fo$(TMP_DIR)\ @<< $< << XOTCL_VERSION_DEFINES = \ -DXOTCL_MAJOR_VERSION=$(XOTCL_MAJOR_VERSION) \ -DXOTCL_MINOR_VERSION=$(XOTCL_MINOR_VERSION) \ -DXOTCL_VERSION=\"$(XOTCL_VERSION)\" {$(RCDIR)}.rc{$(TMP_DIR)}.res : $(rc32) -fo $@ -DDEBUG=$(DEBUG) $(XOTCL_VERSION_DEFINES) $(XOTCL_INCLUDES) $(TCL_INCLUDES) $(XOTCL_DEFINES) $< ###################################################################### # Clean up ###################################################################### tidy : -del $(TMP_DIR)\*.pch -del $(TMP_DIR)\*.obj -del $(TMP_DIR)\*.res -del .\*.pdb -del .\*.pch cd $(SDBM_DIR) $(MAKECMD) tidy cd ..\.. cd $(EXPAT_DIR) $(MAKECMD) tidy cd ..\..\..\win clean : -del $(TMP_DIR)\*.pch -del $(TMP_DIR)\*.obj -del $(TMP_DIR)\*.res -del .\*.pdb -del .\*.pch -del $(OUT_DIR)\*.exp -del $(OUT_DIR)\*.lib -del $(OUT_DIR)\*.dll -del ..\*.exp -del ..\*.lib -del ..\xotclsh.exe -del ..\xowish.exe cd $(SDBM_DIR) $(MAKECMD) clean cd ..\.. cd $(EXPAT_DIR) $(MAKECMD) clean cd ..\..\..\win distclean : clean -rmdir $(OUT_DIR) -rmdir $(TMP_DIR) cd $(SDBM_DIR) $(MAKECMD) distclean cd ..\.. cd $(EXPAT_DIR) $(MAKECMD) distclean cd ..\..\..\win # # tar # tar : distclean cd ..\.. tar cvfz xotcl-$(FULLVERSION).tar.gz xotcl-$(FULLVERSION)/* cd xotcl-$(FULLVERSION)\win # # XOTcl Shells # ../xotclsh.exe: $(XOTCLSHOBJS) $(TCLIMPLIB) $(TMP_DIR)\xotcl.res $(link32) $(ldebug) $(conlflags) $(TMP_DIR)\xotcl.res -stack:2300000 \ -out:$@ $(conlibsdll) $(TCLIMPLIB) $(XOTCLSHOBJS) ../xowish.exe: $(XOWISHOBJS) $(TCLIMPLIB) $(TKIMPLIB) $(TMP_DIR)\xotcl.res $(link32) $(ldebug) $(guilflags) $(TMP_DIR)\xotcl.res -out:$@ \ $(guilibsdll) $(TCLIMPLIB) $(TKIMPLIB) $(XOTCLLIB) $(XOWISHOBJS) xotclsh: ../xotclsh.exe xowish: ../xowish.exe xotclshells: xotclsh xowish ./xotcl-1.6.8/win/._pkgIndex.win000644 000765 000024 00000000430 12161600406 017113 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/pkgIndex.win000644 000765 000024 00000000136 12161600406 016701 0ustar00neumannstaff000000 000000 package ifneeded XOTcl 1.1 [list load \ [file join $dir ../../bin xotcl1.1.dll] XOTcl] ./xotcl-1.6.8/win/._pkgIndex.win.in000644 000765 000024 00000000430 12161600406 017520 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/pkgIndex.win.in000644 000765 000024 00000000152 12161600406 017304 0ustar00neumannstaff000000 000000 package ifneeded XOTcl @VERSION@ [list load \ [file join $dir ../../bin xotcl@VERSION@.dll] XOTcl] ./xotcl-1.6.8/win/rc/._xotcl.rc000644 000765 000024 00000000430 12161600406 016706 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/rc/xotcl.rc000644 000765 000024 00000002410 12161600406 016471 0ustar00neumannstaff000000 000000 // // Version resource script. // #include #define RESOURCE_INCLUDED #include // // build-up the name suffix that defines the type of build this is. // #if DEBUG == 1 #define SUFFIX_DEBUG "d" #else #define SUFFIX_DEBUG "" #endif #define SUFFIX SUFFIX_DEBUG VS_VERSION_INFO VERSIONINFO FILEVERSION XOTCL_MAJOR_VERSION ,XOTCL_MINOR_VERSION ,0 , 0 PRODUCTVERSION XOTCL_MAJOR_VERSION ,XOTCL_MINOR_VERSION ,0 , 0 FILEFLAGSMASK 0x3fL #if DEBUG == 1 FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0x0L #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "XOTcl language extension for Tcl\0" VALUE "Authors", "Gustaf Neumann and Uwe Zdun\0" VALUE "OriginalFilename", "xotcl" STRINGIFY(JOIN(XOTCL_MAJOR_VERSION,XOTCL_MINOR_VERSION)) SUFFIX ".dll\0" VALUE "CompanyName", "Vienna University of Economics and Business Administration, University of Essen\0" VALUE "FileVersion", XOTCL_VERSION VALUE "LegalCopyright", "Copyright \251 1999-2008\0" VALUE "ProductName", "XOTcl " XOTCL_VERSION " for Windows\0" VALUE "ProductVersion", XOTCL_VERSION END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END ./xotcl-1.6.8/win/._winMain.c000644 000765 000024 00000000430 12161600406 016371 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/win/winMain.c000644 000765 000024 00000024672 12161600406 016172 0ustar00neumannstaff000000 000000 /* * winMain.c -- * * Main entry point for wish and other Tk-based applications. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright (c) 1998-1999 by Scriptics Corporation. * * See the file "tcl-license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * */ #include #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN #include #include #if defined(VISUAL_CC) # include "xotcl.h" #else # include #endif #include "tkInt.h" /* * The following declarations refer to internal Tk routines. These * interfaces are available for use, but are not supported. */ #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<2 EXTERN void TkConsoleCreate(void); EXTERN int TkConsoleInit(Tcl_Interp *interp); #endif /* * Forward declarations for procedures defined later in this file: */ static void setargv _ANSI_ARGS_((int *argcPtr, char ***argvPtr)); static void WishPanic _ANSI_ARGS_(TCL_VARARGS(CONST char *,format)); #ifdef TK_TEST extern int Tktest_Init(Tcl_Interp *interp); #endif /* TK_TEST */ #ifdef TCL_TEST extern int TclObjTest_Init _ANSI_ARGS_((Tcl_Interp *interp)); extern int Tcltest_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* TCL_TEST */ static BOOL consoleRequired = TRUE; /* *---------------------------------------------------------------------- * * WinMain -- * * Main entry point from Windows. * * Results: * Returns false if initialization fails, otherwise it never * returns. * * Side effects: * Just about anything, since from here we call arbitrary Tcl code. * *---------------------------------------------------------------------- */ int APIENTRY WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow) HINSTANCE hInstance; HINSTANCE hPrevInstance; LPSTR lpszCmdLine; int nCmdShow; { char **argv; int argc; #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<2 char buffer[MAX_PATH+1]; char *p; #endif Tcl_SetPanicProc(WishPanic); /* * Set up the default locale to be standard "C" locale so parsing * is performed correctly. */ setlocale(LC_ALL, "C"); #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION>1 setargv(&argc, &argv); #endif /* * Increase the application queue size from default value of 8. * At the default value, cross application SendMessage of WM_KILLFOCUS * will fail because the handler will not be able to do a PostMessage! * This is only needed for Windows 3.x, since NT dynamically expands * the queue. */ SetMessageQueue(64); /* * Create the console channels and install them as the standard * channels. All I/O will be discarded until Tk_CreateConsoleWindow is * called to attach the console to a text widget. */ #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<2 TkConsoleCreate(); setargv(&argc, &argv); /* * Replace argv[0] with full pathname of executable, and forward * slashes substituted for backslashes. */ GetModuleFileName(NULL, buffer, sizeof(buffer)); argv[0] = buffer; for (p = buffer; *p != '\0'; p++) { if (*p == '\\') { *p = '/'; } } #endif consoleRequired = TRUE; Tk_Main(argc, argv, Tcl_AppInit); return 1; } /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in the interp's result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(interp) Tcl_Interp *interp; /* Interpreter for application. */ { if (Tcl_Init(interp) == TCL_ERROR) { goto error; } if (Tk_Init(interp) == TCL_ERROR) { goto error; } Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); /* if (Xotcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "XOTcl", Xotcl_Init, 0); */ if (Tcl_PkgRequire(interp, "XOTcl", XOTCLVERSION, 1) == NULL) { return TCL_ERROR; } /* * This is xotclsh, so import all xotcl commands by * default into the global namespace. */ if (Tcl_Import(interp, Tcl_GetGlobalNamespace(interp), "::xotcl::*", /* allowOverwrite */ 1) != TCL_OK) { return TCL_ERROR; } /* * Initialize the console only if we are running as an interactive * application. */ #if TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION<2 if (TkConsoleInit(interp) == TCL_ERROR) { goto error; } #else if (consoleRequired) { if (Tk_CreateConsoleWindow(interp) == TCL_ERROR) { goto error; } } #endif #ifdef TCL_TEST if (Tcltest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } Tcl_StaticPackage(interp, "Tcltest", Tcltest_Init, (Tcl_PackageInitProc *) NULL); if (TclObjTest_Init(interp) == TCL_ERROR) { return TCL_ERROR; } #endif /* TCL_TEST */ #ifdef TK_TEST if (Tktest_Init(interp) == TCL_ERROR) { goto error; } Tcl_StaticPackage(interp, "Tktest", Tktest_Init, (Tcl_PackageInitProc *) NULL); #endif /* TK_TEST */ Tcl_SetVar(interp, "tcl_rcFileName", "~/wishrc.tcl", TCL_GLOBAL_ONLY); return TCL_OK; error: WishPanic(Tcl_GetStringResult(interp)); return TCL_ERROR; } /* *---------------------------------------------------------------------- * * WishPanic -- * * Display a message and exit. * * Results: * None. * * Side effects: * Exits the program. * *---------------------------------------------------------------------- */ void WishPanic TCL_VARARGS_DEF(CONST char *,arg1) { va_list argList; char buf[1024]; CONST char *format; format = TCL_VARARGS_START(CONST char *,arg1,argList); vsprintf(buf, format, argList); MessageBeep(MB_ICONEXCLAMATION); MessageBox(NULL, buf, "Fatal Error in Wish", MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND); #ifdef _MSC_VER DebugBreak(); #endif ExitProcess(1); } /* *------------------------------------------------------------------------- * * setargv -- * * Parse the Windows command line string into argc/argv. Done here * because we don't trust the builtin argument parser in crt0. * Windows applications are responsible for breaking their command * line into arguments. * * 2N backslashes + quote -> N backslashes + begin quoted string * 2N + 1 backslashes + quote -> literal * N backslashes + non-quote -> literal * quote + quote in a quoted string -> single quote * quote + quote not in quoted string -> empty string * quote -> begin quoted string * * Results: * Fills argcPtr with the number of arguments and argvPtr with the * array of arguments. * * Side effects: * Memory allocated. * *-------------------------------------------------------------------------- */ static void setargv(argcPtr, argvPtr) int *argcPtr; /* Filled with number of argument strings. */ char ***argvPtr; /* Filled with argument strings (malloc'd). */ { char *cmdLine, *p, *arg, *argSpace; char **argv; int argc, size, inquote, copy, slashes; cmdLine = GetCommandLine(); /* INTL: BUG */ /* * Precompute an overly pessimistic guess at the number of arguments * in the command line by counting non-space spans. */ size = 2; for (p = cmdLine; *p != '\0'; p++) { if ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ size++; while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ p++; } if (*p == '\0') { break; } } } argSpace = (char *) Tcl_Alloc( (unsigned) (size * sizeof(char *) + strlen(cmdLine) + 1)); argv = (char **) argSpace; argSpace += size * sizeof(char *); size--; p = cmdLine; for (argc = 0; argc < size; argc++) { argv[argc] = arg = argSpace; while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ p++; } if (*p == '\0') { break; } inquote = 0; slashes = 0; while (1) { copy = 1; while (*p == '\\') { slashes++; p++; } if (*p == '"') { if ((slashes & 1) == 0) { copy = 0; if ((inquote) && (p[1] == '"')) { p++; copy = 1; } else { inquote = !inquote; } } slashes >>= 1; } while (slashes) { *arg = '\\'; arg++; slashes--; } if ((*p == '\0') || (!inquote && ((*p == ' ') || (*p == '\t')))) { /* INTL: ISO space. */ break; } if (copy != 0) { *arg = *p; arg++; } p++; } *arg = '\0'; argSpace = arg + 1; } argv[argc] = NULL; *argcPtr = argc; *argvPtr = argv; } /* *---------------------------------------------------------------------- * * main -- * * Main entry point from the console. * * Results: * None: Tk_Main never returns here, so this procedure never * returns either. * * Side effects: * Whatever the applications does. * *---------------------------------------------------------------------- */ int main(int argc, char **argv) { Tcl_SetPanicProc(WishPanic); /* * Set up the default locale to be standard "C" locale so parsing * is performed correctly. */ setlocale(LC_ALL, "C"); /* * Increase the application queue size from default value of 8. * At the default value, cross application SendMessage of WM_KILLFOCUS * will fail because the handler will not be able to do a PostMessage! * This is only needed for Windows 3.x, since NT dynamically expands * the queue. */ SetMessageQueue(64); /* * Create the console channels and install them as the standard * channels. All I/O will be discarded until Tk_CreateConsoleWindow is * called to attach the console to a text widget. */ consoleRequired = FALSE; Tk_Main(argc, argv, Tcl_AppInit); return 0; } ./xotcl-1.6.8/._xotcl.m4000644 000765 000024 00000000430 12326777353 015444 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/xotcl.m4000644 000765 000024 00000007632 12326777353 015242 0ustar00neumannstaff000000 000000 # xotcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (C) 1999-2007 Uwe Zdun # Copyright (C) 1999-2014 Gustaf Neumann # # See the file "tcl-license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #------------------------------------------------------------------------ # SC_PATH_XOTCLCONFIG -- # # Locate the xotclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-xotcl=... # # Defines the following vars: # XOTCL_BIN_DIR Full path to the directory containing # the xotclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN(SC_PATH_XOTCLCONFIG, [ # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_xotcl}" = x ; then # we reset no_xotcl in case something fails here no_xotcl=true AC_ARG_WITH(xotcl, [ --with-xotcl directory containing xotcl configuration (xotclConfig.sh)], with_xotclconfig=${withval}) AC_MSG_CHECKING([for XOTcl configuration]) AC_CACHE_VAL(ac_cv_c_xotclconfig,[ # First check to see if --with-xotcl was specified. if test x"${with_xotclconfig}" != x ; then if test -f "${with_xotclconfig}/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd ${with_xotclconfig}; pwd)` else AC_MSG_ERROR([${with_xotclconfig} directory doesn't contain xotclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_xotclconfig}" = x ; then for i in \ ${srcdir}/../xotcl \ `ls -dr ${srcdir}/../xotcl-* 2>/dev/null` \ ${srcdir}/../../xotcl \ `ls -dr ${srcdir}/../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../xotcl \ `ls -dr ${srcdir}/../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../xotcl \ `ls -dr ${srcdir}/../../../../xotcl-* 2>/dev/null` \ ${srcdir}/../../../../../xotcl \ `ls -dr ${srcdir}/../../../../../xotcl-* 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_xotclconfig}" = x ; then for i in `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` ; do if test -f "$i/xotclConfig.sh" ; then ac_cv_c_xotclconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_xotclconfig}" = x ; then XOTCL_BIN_DIR="# no XOTcl configs found" AC_MSG_WARN(Can't find XOTcl configuration definitions) exit 0 else no_xotcl= XOTCL_BIN_DIR=${ac_cv_c_xotclconfig} AC_MSG_RESULT(found $XOTCL_BIN_DIR/xotclConfig.sh) fi fi ]) #------------------------------------------------------------------------ # SC_LOAD_XOTCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # XOTCL_BIN_DIR # # Results: # # Subst the vars: # #------------------------------------------------------------------------ AC_DEFUN(SC_LOAD_XOTCLCONFIG, [ AC_MSG_CHECKING([for existence of $XOTCL_BIN_DIR/xotclConfig.sh]) if test -f "$XOTCL_BIN_DIR/xotclConfig.sh" ; then AC_MSG_RESULT([loading]) . $XOTCL_BIN_DIR/xotclConfig.sh else AC_MSG_RESULT([file not found]) fi # # The eval is required to do the TCL_DBGX substitution in the # TCL_LIB_FILE variable # AC_SUBST(XOTCL_VERSION) AC_SUBST(XOTCL_MAJOR_VERSION) AC_SUBST(XOTCL_MINOR_VERSION) AC_SUBST(XOTCL_RELEASE_LEVEL) AC_SUBST(XOTCL_LIB_FILE) AC_SUBST(XOTCL_BUILD_LIB_SPEC) AC_SUBST(XOTCL_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_FILE) AC_SUBST(XOTCL_BUILD_STUB_LIB_SPEC) AC_SUBST(XOTCL_STUB_LIB_SPEC) AC_SUBST(XOTCL_SRC_DIR) ]) ./xotcl-1.6.8/._xotclConfig.sh.in000644 000765 000024 00000000430 12161600406 017246 0ustar00neumannstaff000000 000000 Mac OS X  2æATTR˜€˜€com.apple.acl.text!#acl 1 user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000059:_spotlight:89:allow,inherited:read,execute,readattr,readextattr,readsecurity ./xotcl-1.6.8/xotclConfig.sh.in000644 000765 000024 00000005167 12161600406 017045 0ustar00neumannstaff000000 000000 # xotclConfig.sh -- # # This shell script (for sh) is generated automatically by XOTcl's # configure script. It will create shell variables for most of # the configuration options discovered by the configure script. # This script is intended to be included by the configure scripts # for XOTcl extensions so that they don't have to figure this all # out for themselves. This file does not duplicate information # already provided by tclConfig.sh, so you may need to use that # file in addition to this one. # # The information in this file is specific to a single platform. # XOTcl's version number. XOTCL_VERSION='@XOTCL_VERSION@' XOTCL_MAJOR_VERSION='@XOTCL_MAJOR_VERSION@' XOTCL_MINOR_VERSION='@XOTCL_MINOR_VERSION@' XOTCL_RELEASE_LEVEL='@XOTCL_RELEASE_LEVEL@' # String to pass to compiles to pick up includes during build # (i.e., assuming nothing has been installed) XOTCL_BUILD_INCLUDE_DIR='@XOTCL_BUILD_INCLUDE_DIR@' XOTCL_BUILD_INCLUDE_SPEC="-I${XOTCL_BUILD_INCLUDE_DIR}" # String to pass to compiles to pick up the XOTcl includes from their # installed directory. XOTCL_INCLUDE_DIR="@pkgincludedir@" XOTCL_INCLUDE_SPEC="-I$XOTCL_INCLUDE_DIR" # The name of the XOTcl library (may be either a .a file or a shared library): XOTCL_LIB_FILE=@PKG_LIB_FILE@ # String to pass to linker to pick up the XOTcl library from its # build directory. XOTCL_BUILD_LIB_SPEC='@XOTCL_BUILD_LIB_SPEC@' # String to pass to linker to pick up the XOTcl library from its # installed directory. XOTCL_LIB_SPEC='@XOTCL_LIB_SPEC@' # The name of the XOTcl stub library (a .a file): # XOTCL_STUB_LIB_FILE=@PKG_STUB_LIB_FILE@ # String to pass to linker to pick up the XOTcl stub library from its # build directory. XOTCL_BUILD_STUB_LIB_SPEC='@XOTCL_BUILD_STUB_LIB_SPEC@' # String to pass to linker to pick up the XOTcl stub library from its # installed directory. XOTCL_STUB_LIB_SPEC='@XOTCL_STUB_LIB_SPEC@' # Name of the xotcl stub library with full path in build and install directory XOTCL_BUILD_STUB_LIB_PATH='@XOTCL_BUILD_STUB_LIB_PATH@' XOTCL_STUB_LIB_PATH='@XOTCL_STUB_LIB_PATH@' # Location of the top-level source directories from which XOTcl # was built. This is the directory that contains generic, unix, etc. # If XOTcl was compiled in a different place than the directory # containing the source files, this points to the location of the sources, # not the location where XOTcl was compiled. XOTCL_SRC_DIR='@XOTCL_SRC_DIR@' # shared and unshared library suffix XOTCL_SHARED_LIB_SUFFIX=@SHARED_LIB_SUFFIX@ XOTCL_UNSHARED_LIB_SUFFIX=@UNSHARED_LIB_SUFFIX@ # the shell in whose installation dirs the xotcl package is installed XOTCL_COMPATIBLE_TCLSH=@XOTCL_COMPATIBLE_TCLSH@