#!/bin/sh
# the next line restarts using wish   -*-tcl-*- \
exec tclsh "$0" ${1+"$@"}

# BUT : tester Parsarg_Pop :
# 
# à faire : Tester **tous** les exemples de la doc
# 
########################################################################
# Procédures d'extraction de parametres d'une liste. 
#
# Voir doc dans le fichier déclarant la procédure Parsarg_Pop
########################################################################



proc main {} {
global test
  
  # # # # ## ATTENTION BUG Darwin : [info script] => "" !!! NON CA MARCHE !!?!!
  # # # # puts "\n\[info script\]=[info script]\n"
  # # # # return
  # # set pistDir [file dir [file dir [pwd]]]
  # # lappend ::auto_path $pistDir
 
  # # # lappend auto_path $pistDir $pistDir/xtcl-0.2
  # # package require xtcl 
  # # package require shell 
  # # package require parsarg 
  
  pist_requireAll
  
  report -t debut
  # source [file join $test(setup) ..  poparg.tcl]
  
  test_1
  
  report -t fin

}

########################################################################
proc test_1 {} {
    
    set args {-flag1 -opt2 val2 --  -opt3 val3 argum1 argum2}
    
    report "\n# Variables d'entrée"
    report -v  arga opt3_value args




    report  ""
    report  {todo : set bool [Parsarg_Pop -opt2 arga(-opt2)]}
    set bool [Parsarg_Pop -opt2 arga(-opt2)]
    report -v args bool arga(-opt2)


    report  ""
    report  {todo : set bool [Parsarg_Pop -opt3 opt3_value]}
    set bool [Parsarg_Pop -opt3 opt3_value]
    report -v args bool opt3_value

    report  ""
    report  {todo : set bool [Parsarg_Pop -opt4 arga(opt4)]}
    set bool [Parsarg_Pop -opt4 arga(opt4)]
    report -v args bool arga(opt4)

    report  ""
    report  {todo : set arga(--) [Parsarg_Pop --]}
    set arga(--) [Parsarg_Pop -- ]
    report -v args arga(--) 

    report  ""
    report  {todo : set arga(-flagX) [Parsarg_Pop -flagX]}
    set arga(-flagX) [Parsarg_Pop arga(-flagX)]
    report -v args arga(-flagX) 

    report  ""
    report  {todo : set arga(flag1) [Parsarg_Pop -flag1]}
    set arga(flag1) [Parsarg_Pop -flag1 ]
    report -v args arga(flag1)

    report  ""
    report  {todo : set bool [Parsarg_Pop fich1]}
    set bool [Parsarg_Pop fich1 ]
    report -v args bool  fich1

    report  ""
    report  {todo : set bool [Parsarg_Pop fich2]}
    set bool [Parsarg_Pop fich2 ]
    report -v args bool  fich2
    
    
    report "\n# Variables de sortie"
    report -v args arga opt3_value fich1 fich2

}

# pist_requireAll -- installe la librairie pist 
# 
# argument : 
# 
#  - appliName : nom du tableau a initialiser (i.e gred, stead, ...)
#    par défaut ce tableau est "pist"
# 
# description :
# 
#  Le fonction principale de cette procedure est de mémoriser le répertoire 
#  d'installation de la librairie PIST utilisée et de la rendre utilisable
#  par une appli.
#  Si la variable d'environnement PIST_SETUP est positionnée, elle est 
#  utilisée ô, ôs
#  Sinon, la librairie pist est recherchée successivement dans le répertoire 
#  courant (i.e on peut ajouter un lien "pist" dans ce répertoire courant)
#  puis dans les parents successif
# 
# HUYPOTHESE : 
#  Chaque répertoire contenant un package pist **doit** avoir le même nom que
#  le package lui-meme :
#  Le package "Comm" doit etre dans le répertoire "Comm/", et nom par "comm/" ni "Comm-3.7/"
#  
# 
# sortie : 
# 
#  positionnement des variables suivantes (pist ou appliName si spécifié) :
#   - pist(exe) : nom absolu de cet exécutable (en vue de le re-sourcer)
#   - pist(setup)  : répertoire de l'exécutable 
#   - pist(pistsetup) et env(PIST_SETUP) : installation de PIST
#   - auto_path : insertion de pist(pistsetup) **devant** cette globale
# 
# 
proc pist_requireAll { {appliName pist} } {

global env auto_path
upvar #0 $appliName appli
   
    array set appli {
        exe         UNKNOWN
        setup       UNKNOWN
        pistsetup   UNKNOWN
    }
    
    # On mémorise le nom absolu du répertoire cette application
    cd [file dirname [info script]]
    set appli(setup) [pwd]
    
    # On mémorise le nom absolu de cette application
    set appli(exe) [file join $appli(setup) [file tail [info script] ] ]
    
    # Recherche de la librairie PIST
    if {[info exists env(PIST_SETUP)]} {
        set appli(pistsetup) $env(PIST_SETUP)
    } else {
        
        set dirsToScan [list                                            \
           $appli(setup)                                                \
           [file dir $appli(setup)]                                     \
           [file dir [file dir $appli(setup)]]                          \
           [file dir [file dir [file dir $appli(setup)]]]               \
           [file dir [file dir [file dir [file dir $appli(setup)]]]]    \
        ]
        
        # On cherche dans ce répertoire s'il y a un un plusieurs nom
        # répertoire, mais aussi lien !) commençant par pist...
        foreach dir $dirsToScan {
           
           set pistDirs [glob -nocomplain [file join $dir pist]* ]
           if {[llength $pistDirs] == 0} {
               continue
           } 
           
           # S'il existe plusieurs lib potentielle au même niveau, 
           # (pist-1.9.a et pist-1.10.a), on doit sélectionner 
           # pist-1.10 (la plus ancienne)
           # 
           foreach name [lsort -decreasing -dictionary $pistDirs] {
              set pkgIndexes [glob -nocomplain  \
                            [file join $name * pkgIndex.tcl]]
              if {[llength $pkgIndexes]} {
                 set pistSetup $name
                 break
              }
           }

           if {[info exists pistSetup]} break
         }
        
         if {![info exists pistSetup]} {
           error "Librairie PIST introuvable à partir de $appli(pistsetup) "
           exit
         }
        
         set appli(pistsetup) $pistSetup
         set env(PIST_SETUP) $appli(pistsetup)
    }
    # On ajout la librairie pist à l'auto_path
    set auto_path [concat [list $appli(pistsetup)]  $auto_path]
    
    # On demande chaque package (sous-répertoire contenant un fichier 
    # pkgIndex.tcl)
    foreach pkFile [glob -nocomplain  \
            [file join $appli(pistsetup) * pkgIndex.tcl] ]   {
        set pk [file tail [file dir $pkFile]]
        package require $pk
    }
    # parray appli
}

main
# ./












