/* (gH) -- gocd.rex ; TimeStamp (unix) : 24 Février 1997 vers 12:36 */ /****************************************************srexx******/ /* */ /* go.rex - (gH) org. 1996 : */ /* */ /* +================================================+ */ /* + + */ /* + déplacement (cd) dans les répetoires + */ /* + via des abbréviations + */ /* + + */ /* +================================================+ */ /* */ /* */ /* testé avec - regina */ /* syntaxe : */ /* */ /* go [ | -i | -L | -a */ /* | -f | -h ] */ /* exemples : go tmp */ /* go -i ~ */ /* go -a . Tests */ /* */ /* go seul afiche l'aide */ /* */ /* */ /***************************************************************/ /* */ /* Auteur */ /* */ /* gilles.hunault@univ-angers.fr */ /* email : gilles.hunault@univ-angers.fr */ /* */ /* http://www.info.univ-angers.fr/pub/gh/gh.html */ /* */ /***************************************************************/ /* trace 'I' */ versGo = " 3.62 (linux-sirius) " ligSyntaxe = " Syntaxe go [ | -i | -L | -a | -f | -h | -s | -d ] " say " go (gH) version " versGo dbg_Go = 0 /* 0 pour normal, 1 pour debug */ if dbg_Go then do parse version rxv say" version utilisée : " rxv end /* fin de debug */ /* trace 'I' */ /* # 1. Vérification du système d'exploitation et des variables d'environnement */ nomOs = fileut("osName") goloc = value("gocd",,"SYSTEM") tmp_loc = value("TEMP",,"SYSTEM") fabr = goloc if goloc = "" then goloc = value("go",,"SYSTEM") if tmp_loc = "" then tmp_loc = value("TMP",,"SYSTEM") if dbg_Go then do say " nomOs = " nomOs " et goloc = " goloc end /* fin de debug */ if nomOs="unx" then do if tmp_loc = "" then tmp_loc = "/tmp" end if nomOs="dos" then nomdir = tmp_loc"\gotmp" else nomdir = tmp_loc"/gotmp" /* # 2. Passage en revue de la ligne de commande */ plist = "" ajout = "" parse arg ligcmd parse var ligcmd abr . parse var ligcmd with "-l" plist parse var ligcmd with "-f" fabr parse var ligcmd with "-a" nabr ncd . parse var ligcmd with "-d" dabr dcd . if ligcmd = "noclobber" then ligcmd = "" fabr = strip(fabr) if fabr = "" then if goloc \= "" then fabr = goloc if fabr \= "" then retc = fileut("checkFile^"fabr) if goloc = "" then goloc = fabr /* # 3. Affichage de la liste si paramètre -L */ if index(ligcmd,"%") > 0 then do ; call srch_Abr ; call gH_exit ; end if index(ligcmd,"-l") > 0 then do ; call listeAbr ; call gH_exit ; end if index(ligcmd,"-l") > 0 then do ; call listeAbr ; call gH_exit ; end if index(ligcmd,"/n") > 0 then do ; call listeAbr ; call gH_exit ; end if index(ligcmd,"-n") > 0 then do ; call listeAbr ; call gH_exit ; end if index(ligcmd,"-s") > 0 then do ; call trie_Abr ; call gH_exit ; end if index(ligcmd,"-i") > 0 then do p = wordpos("-i",ligcmd) CdFrom = word(ligcmd,p+1) call inst_Abr CdFrom ; call trie_Abr call gH_exit ; end /* # 4. Si besoin est, on affiche l'aide sur go ou sur la variable d'environnement */ if ligcmd="" then do say ligSyntaxe exit end if wordpos("-h",ligcmd,) >0 then do ; call aideGocd ; call gH_exit ; end if goloc="" then do ; call aideSetGocd ; call gH_exit ; end /* # 5. Si nouvelle abbréviation, on l'ajoute */ /* # si abbréviation à détruire, on s'exécute */ if length(nabr) > 0 then do ; call ajouteAbr ; call gH_exit ; end if length(dabr) > 0 then do ; call detruitAbr ; call gH_exit ; end /* # 6. Finalement, on recherche la dernière abbréviation correspondante */ if abr \= "-f" then do chemin = "" do while lines(fabr) > 0 lig = linein(fabr) mot1 = word(lig,1) mot2 = word(lig,2) if mot1=abr then do chemin = mot2 end end call lineout fabr rf = stream(fabr,'Command','Close') /* # 7. Si aucune abbréviation ne correspond, on le dit */ if chemin = "" then do say "" say " Désolé, aucune ligne ne commence par le mot " abr say " que vous recherchez. Utilisez l'option -l " say " pour voir la liste des abbréviations. " say "" call gH_exit end /* finsi chemin = "" */ /* # 8. Arrivé ici, il reste à effectuer le changement de cd */ /* pour dos, on cree un .bat */ if (nomOs="dos") then do fs = tmp_loc"\go_tmp.bat" /* call delFile fs */ rdd = fileut("delFile^"fs) call lineout fs , substr(chemin,1,2) call lineout fs , "cd " chemin call lineout fs rf = stream(fs,'Command','Close') end /* pour unix on crée un .cd */ if (nomOs="unx") then do "echo " chemin " > ~/.cd " n_f = chemin"/.autoexec" lde = linein(n_f) call lineout n_f rf = stream(n_f,'Command','Close') rde = length(lde) if rde>0 then do '(cd ' chemin ' ; if test -r core ; then rm core ; fi ; ./.autoexec ) ' end end end ; else do say ligSyntaxe end /* finsi abr \= "-f" */ /* # 9. fin du programme */ exit /*********************************************************************************/ gH_exit: procedure rect = fileut("cpy") exit return /* fin procedure gH_exit */ aideGocd: procedure say " (gH) go.rex : changements de répertoire." say " " say ligSyntaxe say " " say " est le nom d'une abbréviation de répertoire " say " est le nom d'un répertoire " say " est le nom d'un fichier " say " " say " . l'option -h réaffiche cette aide " say " " say " . l'option -i installe c'est à dire construit une liste d'abbréviations " say " à partir du répertoire spécifié et de tous ses sous-répertoires " say " " say " . l'option -l liste les abbréviations connues " say " " say " . l'option -a ajoute une abbréviation de façon manuelle " say " " say " . l'option -f change de fichier d'abbréviations " say " " say " . l'option -s fait le tri et le ménage des abbréviations " say " " say " . l'option -d permet de supprimer une abbréviation " say " " say " . le caractère % permet une recherche ambigue " say " " call charout , " Appuyer sur Entrée pour continuer " pull . say " " say " Exemples : " say " " say " go -h " say " réaffiche cette aide " say " " say " go tmp " say " va dans le répertoire associé à tmp (s'il existe) " say " " say " go tmp% " say " affiche les abbréviations et répertoires recensés " say " qui commence par la chaine tmp " say " " say " go -i c:\tmp " say " va dans le cd associé et ajoute au fichier des abbréviations " say " tous les noms de répertoires (3 car au minimum) " say " " say " go -l " say " affiche la liste des abbréviations et des répertoires associés " say " " say " (dos) go -a tst c:\tmp\test " say " ajoute à la liste des abbréviations le mot tst et lui " say " associe le chemin du répertoire c:\tmp\test " say " " say " (unix) go -a tst /home/gh/tmp/test " say " ajoute à la liste des abbréviations le mot tst et lui " say " associe le chemin du répertoire /home/gh/tmp/test " say " " say " go -f autre.lst " say " utilise le fichier autre.lst comme liste d'abbréviations " say " plutot que celui indique par la variable d'environnement " say " go. ce fichier contient sur chaque ligne l'abbréviation " say " comme mot 1 et le chemin du répertoire en mot 2. " say " " say " go -s " say " vient vérifier les noms d'abbréviation et les trie par " say " ordre alphabétique " say " " say " go -d tmp " say " supprime la ligne correspondant à l'abbréviation tmp " say " " say " syntaxe go [ | -i | -l | -a | -f | -h | -s | -d ] " say " " say " est le nom d'une abbréviation de répertoire " say " est le nom d'un répertoire " say " est le nom d'un fichier " say " " return /* fin procedure aideGocd */ aideSetGocd: procedure say " (gH) go.rex : changements de répertoire." say " " say " Erreur : je ne vois pas la variable d'environnement nommé gocd " say " qui indique où est le fichier des abbréviations. " say " " say " Si vous ne savez pas gérer les variables d'environnement (sous Dos avec " say " set et dans l'autoexec ou sous Unix avec SET/EXPORT et dans le .profile " say " utilisez l'option -f avec le chemin d'accès du fichier d'abbrévaitions. " say " " return /* fin procedure aideSetGocd */ detruitAbr: procedure expose fabr dabr tmp_loc newf = tmp_loc||"/gocd.tmp" retc = fileut("delFile^"newf) do while lines(fabr) > 0 lig = linein(fabr) if word(lig,1) = dabr then say " suppression de " lig else call lineout newf , lig end /* fin tant que */ call lineout fabr call lineout newf rf = stream(fabr,'Command','Close') rf = stream(newf,'Command','Close') retc = fileut("delFile^"fabr) retc = call fileut("copyFile^"newf"^"fabr) return /* fin procedure detruitAbr */ listeAbr: procedure expose fabr nbch = 0 call lineout fabr rf = stream(fabr,'Command','Close') do while lines(fabr) > 0 lig = linein(fabr) if substr(word(lig,1),1,1)\="#" then nbch = nbch + 1 end /* fin tant que */ call lineout fabr rf = stream(fabr,'Command','Close') say " (gH) go.rex : changements de répertoire." say " " say " Liste des " nbch " chemins connus : (fichier "fabr")" say " " do while lines(fabr) > 0 lig = linein(fabr) say " " lig end /* fin tant que */ call lineout fabr rf = stream(fabr,'Command','Close') say " " say " Fin de la liste des " nbch " chemins connus : (fichier "fabr")" say " " return /* fin procedure listeAbr */ srch_Abr: procedure expose fabr ligcmd is = index(ligcmd,"%") dp = substr(ligcmd,1,is-1) if length(dp)=0 then do say " Donner au moins une lettre avant * pour effectuer une recherche" say " ou utiliser go -L pour la liste de tous les chemins. " call gH_exit end nm = words(dp) mr = word(dp,nm) say " Liste des chemins connus dans "fabr" ressemblant à " mr " : " say do while lines(fabr) > 0 lig = linein(fabr) if index(lig,mr)>0 then say " " lig end /* fin tant que */ call lineout fabr rf = stream(fabr,'Command','Close') return /* fin procedure listeAbr */ trie_Abr: procedure expose fabr say nba = 0 do while lines(fabr) > 0 lig = linein(fabr) nba = nba + 1 a.nba = word(lig,1) r.nba = word(lig,2) end call lineout fabr rf = stream(fabr,'Command','Close') say " Tri des " nba " abbréviations dans " fabr call charout , " " do i = 1 to nba - 1 if (i//10) = 0 then do ; if (i//50) = 0 then call charout , "+" else call charout , "." end /* fin de si */ low = i do j = i + 1 to nba abrj = translate(a.j) abrj = a.j abrL = translate(a.low) abrL = a.low if abrj < abrL then low = j end temp = a.i a.i = a.low a.low = temp temp = r.i r.i = r.low r.low = temp end rect = fileut("delFile^"fabr) /* on ne récrit qu'une fois les lignes (en cas de doublon) */ call lineout fabr , substr(a.1,1,29) r.1 do i = 2 to nba j = i-1 if (a.i <> a.j) then call lineout fabr , substr(a.i,1,29) r.i /* supprimé en aout 2001 */ /* else if (r.i <> r.j) then call lineout fabr , substr(a.i,1,29) r.i */ end say call lineout fabr rf = stream(fabr,'Command','Close') return /* fin procedure trie_Abr */ ajouteAbr: procedure expose nabr ncd nomOs tmp_loc fs fabr say " (gH) go.rex : changements de répertoire." say nabr = strip(nabr) ncd = strip(ncd) /* une erreur fréquente est de confondre l'ordre des paramètres */ /* on permute nabr et ncd si ncd est . */ if nabr = "." then do tmp = nabr nabr = ncd ncd = tmp end /* une autre erreur est d'oublier . d'où */ if ncd = "" then ncd = "." if ncd = "." then do if nomOs = "dos" then do fs = tmp_loc"\go_tmp.bat" retc = fileut("delFile^"fs) "cd > " fs call lineout fs rf = stream(fs,'Command','Close') ncd = strip(linein(fs)) call lineout fs rf = stream(fs,'Command','Close') retc = fileut("delFile^"fs) "echo "nabr" "ncd " >> " fabr end if nomOs = "unx" then do fs = tmp_loc"/go_tmp.cd" "pwd > " fs ncd = linein(fs) retc = fileut("delFile^"fs) call lineout fabr rf = stream(fabr,'Command','Close') retc = fileut("delFile^"fs) "echo "substr(nabr,1,29)" "ncd " >> " fabr call lineout fabr rf = stream(fabr,'Command','Close') end end /* fin de si ncd = "." */ say " Abbréviation " nabr " (pour " ncd") ajoutée à " fabr call trie_abr return /* fin procedure ajouteAbr */ inst_Abr: procedure expose nabr ncd nomOs tmp_loc fs fabr listeDir nomdir totaldir parse arg CdOrg . base = CdOrg if CdOrg = "" | CdOrg ="." then do if nomOs = "dos" then do "cd > " fvol nomvol = linein(fvol) bbase = word(nomvol,1) base = bbase end ; else do fvol = "/tmp/arb.vol" "pwd > " fvol nomcd = linein(fvol) base = nomcd end call lineout fvol rf = stream(fvol,'Command','Close') retc = fileut("delFile^"fvol) end /* fin de recherche de base */ say " Installation à partir de " base name.0 = base location.0 = 1 numdir = 0 numrep = 0 maxdepth = 0 totaldir = 0 depthlimit = 5 /* appel récursif */ call charout , " " call treeDir base 1 1 say /* gestion des noms de répertoires */ nbrep = 0 oldA. = 0 /* mise en mémoire des anciennes abbréviations */ do while lines(fabr) > 0 ligl = linein(fabr) m1 = word(ligl,1) if substr(m1,1,1) \= "#" then do nbrep = nbrep + 1 oab = m1 dab = word(ligl,2) nomA.nbrep = oab nomR.nbrep = dab oldA.oab = 1 oldR.oab = dab /* say " " substr(oab,1,4) " : " oldA.oab" " oldR.oab */ end end /* fin tant que non fin de fichier */ call lineout fabr rf = stream(fabr,'Command','Close') say say " Nouvelles abbréviations : " say /* on a une nouvelle abbreviation si */ /* le code abrégé est nouveau (olda.rabr=0) */ /* ou si le code abrégé existe mais ne pointe pas */ /* vers le même répertoire */ if nomOs="dos" then newAbr = tmp_loc"\newAbr" else newAbr = tmp_loc"/newAbr" retc = fileut("delFile^"newAbr) nbNew = 0 ntdir = totaldir do i = 1 to ntdir if nomOs ="dos" then iabr = lastpos("\",nomRep.i) else iabr = lastpos("/",nomRep.i) rabr = substr(nomRep.i,iabr+1) if length(rabr) = 0 then iterate if length(rabr)> 3 then do rabr = substr(rabr,1,6) end rabr = word(rabr,1) /* obligatoire pour enlever les espaces */ rabr = translate(rabr,xrange('a','z'),xrange('A','Z')) if oldA.rabr = 0 then do say " " substr(rabr,1,29) " -> " nomRep.i call lineout newAbr , substr(rabr,1,29) nomRep.i oldA.rabr = 1 nbNew = nbNew + 1 end ; else do /* on a donc affaire a une ancienne abbréviation */ /* si même répertoires, on ignore */ if oldR.rabr=nomRep.i then rabr="" ; else ; do /* sinon, il faut trouver la première */ /* abbréviation libre */ do while oldA.rabr=1 orabr = rabr rabr = rabr"+" if oldR.rabr=nomRep.i then do olda.rabr=0 rabr = "" end end /* finsi oldR.rabr=nomRep.i */ if length(rabr)>0 then do nbrep = nbrep + 1 nomA.nbrep = rabr nomR.nbrep = nomRep.i oldA.rabr = 1 say " " substr(rabr,1,29) " -> " nomRep.i say " à cause de " oldR.orabr " pour " orabr nbNew = nbNew + 1 call lineout newAbr , substr(rabr,1,29) nomRep.i end end /* finsi oldR.rabr\=nomRep.i */ end /* finsi oldA.rabr = 0 */ end /* fin pour i de 1 a totaldir */ if nbNew > 0 then do call lineout newAbr rf = stream(newAbr,'Command','Close') call appendFile fabr newAbr fabr end ; else say " (aucune nouvelle abbréviation) " retc= fileut("delFile^"newAbr) return /* fin procedure inst_Abr */ treeDir: procedure expose name. location. total. nomarb numdir maxdepth numrep nomdir totaldir depthlimit nomOs nomRep. parse arg directory depth depaut totaldir = totaldir + 1 dbg = 0 if dbg=1 then do say nomOs " appel de tree " directory "," depth "," depaut " avec " nomdir pull . end nomRep.totaldir = directory if (totaldir // 5) = 0 then do if (totaldir // 25) = 0 then call charout , "+" else call charout , "." end /* fin de si */ n = 0 if nomOs="dos" then do "dir " directory " > " nomdir n = 0 do while lines(nomdir) > 0 ldir = linein(nomdir) ndir = word(ldir,1) morep = word(ldir,2) sdir = word(ldir,5) if (morep ="") & (ndir<> '.') & (ndir<>'..') then do n = n + 1 dir.n = sdir end /* fin de si bon répertoire */ end /* fin tant que non fin de fichier */ call lineout nomdir rf = stream(nomdir,'Command','Close') retc= fileut("delFile^"nomdir) end ; else do nomdirD = nomdir".2" "ls -al " directory " > " nomdirD "grep ^d " nomdirD " > " nomdir retc= fileut("delFile^"nomdirD) do while lines(nomdir) > 0 ldir = linein(nomdir) /* un sous-répertoire commence par d */ if substr(ldir,1,1)="d" then do /* mais on ne veut pas . et .. */ srep = word(ldir,9) if (srep<> '.') & (srep<>'..') then do n = n + 1 dir.n = srep end /* fin de si */ end /* fin de si */ end /* fin tant que non fin de fichier */ end ; /* fin de si dos ou unix */ call lineout nomdir rf = stream(nomdir,'Command','Close') retc= fileut("delFile^"nomdir) call sortdir n total.depth = n do loc = 1 to n name.depth = dir.loc location.depth = loc numdir = numdir + 1 if depth = 1 then do ; numrep = numrep + 1 ; end if depth > maxdepth then do ; maxdepth = depth ; end if nomOs = "dos" then do if depth+1<= depthlimit then do if depth> 1 then call treeDir directory||"\"||dir.loc depth+1 else do if substr(directory,length(directory),1) \= "\" then directory = directory"\" call treeDir directory||""||dir.loc depth+1 end end end ; else do if depth+1<= depthlimit then call treeDir directory||"/"||dir.loc depth+1 end end /* fin de la boucle des appels récursifs */ return /* fin du sous-programme */ sortdir: procedure expose dir. top = arg(1) do i = 1 to top - 1 low = i do j = i + 1 to top dirj = translate(dir.j) dirL = translate(dir.low) /* dir.j < dir.low then low = j */ if dirj < dirL then low = j end temp = dir.i dir.i = dir.low dir.low = temp end return /*********************************************************************************/