Hello!

Inspiré(e) de prendre part à la discussion ? Ou de poser une question ou demander de l’aide ?

Alors bienvenues dans les grands sujets des forums de La Bulle : m’inscrire.

Cette partie du forum n’est pas compatible avec les bloqueurs publicitaires

Félicitations à vous, de préférer les accès payants plutôt que la gratuité par la publicité, c’est honnorable et cohérent de votre part. Malheureusement, l’accès payant par micropaiement (qui serait d’environ 1 cent pour 20 pages consultées) n’est pour l’instant pas encore mis en place, et l’accès gratuit sans publicité, est réservé aux membres actif(ve)s du forum. En attendant, si vous souhaitez poursuivre votre visite chez nous, vous pouvez ajouter le site à votre liste blanche, ou encore mieux, désactiver le bloqueur partout. Pour ajouter le site à votre liste blanche, pour Firefox (similaire pour les autres navigateurs), rendez‑vous en bas à gauche de la fenêtre de votre navigateur, et cliquez sur le menu comme dans l’exemple de l’image ci‑dessous, puis rechargez la page, en appuyant sur F5.

supprimer les indicateur de chemin excédants
Auteur Message
Beau Parleur
Beau Parleur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 320
Mar 27 Fév 2018 18:26
Message supprimer les indicateur de chemin excédants
Bonjour,
Ou re- ,

Je viens ici, parce que maintenant, le forum BulleForum est le forum préféré.

Du coup, je reviens avec une question pour Hibou et tous les passionnés du langage Ada.

Je programme pour le moment un petit programme qui fait une recherche de chemin d'accès pour permetre de compléter automatiquement ou semi automatiquement une ligne de commande.

Mon problème est le suivant :
lorsque je fait la recherche de chemin, le résultat du chemin courant pour un chemin relatif commençant par "./" donne "././" sur Linux ou ".\" donne ".\.\" sur Windows.

Je cherche comment dans mon algo faire en sorte que seul le premier indicateur du chemin courant soit présent dans le résultat.

Dans les source qui suivent Common fournit le type string_access qui est un accès sur une chaine de caractères et Result fourni un tableau variable 1 dimention de chaîne de caractères.

A l'époque, j'avais écrit ce pseudocode, Voilà, corrigé.

Source ada : 

-- On cherche une exression règulière dans les chemins d'accès aux fichiers hiérarchisés
-- La lecture de contenu d'un chemin de dossiers est fournie par le langage.
-- La fonction comparaison en expression régulière est fournie pas le langage.

-- Chaîne Est L'Expression Réguliére
-- Path Est Un Ensemble De Chamin D'Accès Aux Commandes.
-- Chemin Est La Seconde Partie De Chaine Séparée Par Une Espace.

-- -- Si Chaine Vide Rien Faire.

-- -- Si Non Si La Chaîne Contient Une Espace : Alors
-- -- Si Le Chemin Est Vide
-- -- Regarder Le Contenu Du Dossier Courant Avec Le Reste De La Chaine Substituable Au Pattern En Expression Régulière
-- -- Si Non
-- -- Regarder Le Contenu Du Chemin Avec Le Reste De La Chaine Substituable Au Pattern En Expression Régulière

-- -- Si Le Chemin Est Unique
-- -- Compléter Le Chemin
-- -- Si Non
-- -- Alors Traitement Multipath.

-- -- Si Non
-- -- Regarder Le Contenu Du Path Avec Le Début De La Chaîne Substituable Au Pattern En Expression Régulière
-- -- Si Le Chemin Est Unique
-- -- Compléter Le Chemin
-- -- Si Non
-- -- Alors Traitement Multipath.
-- -- Fin Sis.



Voici mon paquetage Completion 118 ligne:

La procedure Completion (Line : in String;
Full_Command : out Common.String_Access;
Result : out Results.Result_Access) est la procedure principale de ce paquetage.
Le premier paramètre est le chemin courant dans la ligne de commande, le second paramètre est le résultat qui est null si la complétion n'est pas unique, le troisième paramettres est l'ensemble des chemin possible selon le premier paramètres, si la complétion n'est pas unique.

Source ada : 

with GNAT.Regexp;
with GNAT.Directory_Operations.Iteration;
with Ada.Characters.Handling;
use Ada.Characters.Handling;
with Ada.Strings.Fixed;
use Ada.Strings;
package body Arkn.Completion is

use GNAT.Regexp;
use Arkn.Results;
use GNAT.Directory_Operations;


procedure Find_At_Path (Path : in String;
Pattern : in String;
Result : in Results.Result_Access) is

Reg_Exp : constant Regexp := Compile(Pattern, True, True);

procedure Find_Action (Item : String;
Index : Positive;
Quit : in out Boolean) is
Buffer : Variadic_Access;



begin
if Match(Item, Reg_Exp) then
Buffer := new Variadic_Array(1..(Result.File_Content'Length)+1);
Buffer(Buffer'First..Buffer'Last-1) := Result.File_Content.all;
Buffer(Buffer'Last) := (+(To_Wide_String(Item)));
Free(Result.File_Content);
Result.File_Content := new Variadic_Array ' (Buffer.all);
Quit := False;
end if;
end Find_Action;

procedure Wildcard_Iterator is
new GNAT.Directory_Operations.Iteration.Wildcard_Iterator(Find_Action);

begin
Wildcard_Iterator(Path);
end Find_At_Path;


procedure Completion (Line : in String;
Full_Command : out Common.String_Access;
Result : out Results.Result_Access) is

Top : constant Natural := Fixed.Index_Non_Blank(Line);
Bot : constant Natural := Fixed.Index_Non_Blank(Line, Backward);

Blank_Index : constant Natural :=

Fixed.Index(Line(top..bot), " ", backward);



begin
Result := new Search_Result_Type;
Result.File_content := new Variadic_Array (1..1);
if Blank_Index > 0 then
if Blank_Index < Bot then
declare
Path : constant String := Line(Blank_Index+1..Bot);
Directory_Index : constant Natural :=
Fixed.Index(Path, Dir_Separator & "", Backward);
begin
if Directory_Index > 0 and
Directory_Index < Path'Last then
declare
Directory : constant String :=
Path(Path'First..Directory_Index);
begin
Find_At_Path(Directory,
"*" & Path(Directory_Index+1..Path'Last) & "*",
Result);
end;
elsif Directory_Index > 0 then
declare
Directory : constant String :=
Path(Path'First..Directory_Index);
begin

Find_At_Path(Directory,
"*",
Result);
end;
else
begin

Find_At_Path(Get_Current_Dir,
"*" & Path & "*",
Result);
end;
end if;
end;
else


begin

Find_At_Path(Get_Current_Dir,
"*",
Result);
end;
end if;

if Result.File_Content'Length = 2 then
Full_Command := new Wide_String ' (To_Wide_String(Line(Line'First..Blank_Index)) & (-Result.File_Content(2)));
end if;

end if;

end Completion;

end Arkn.Completion;
Profil
Beau Parleur
Beau Parleur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 320
Mar 27 Fév 2018 18:56
Message Re: supprimer les indicateur de chemin excédants
je plaisante Hibou !

En réalité, je voulais te demander si tu peux si tu sais amméliorer ou comment l'améliorer.

Très cinsèrement, pour une fois, c'était de l'humour en espérant en avoir.

La question serait alieurs. Mais j'ai laissé tombé.

J'avais mis un smiley quelque part. ;-) Yeux au ciel avec le sourire
Profil
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 22200
Mar 27 Fév 2018 19:20
Message Re: supprimer les indicateur de chemin excédants
J’étais quand‑même en train d’essayer d’avoir une idée, jusqu’à ce que je vois le deuxième message.

J’ai peut‑être lu trop vite le premier message, mais sur Linux par exemple, dans les expressions régulières pour les chemins, le premiers point ne correspond qu’à un point, toujours, il n’a pas la fonction de correspondre à un caractère quelconque comme dans le reste de l’expression.

C’est ce dont je crois me souvenir, mais il faudrait vérifier.

En marge, il faudra vraiment qu’un jour je corrige ce problème de mise en page avec les boites CODE. Mais je ne sais pas quand je serai assez en forme et quand j’aurai assez le temps pour ça.

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Beau Parleur
Beau Parleur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 320
Mar 27 Fév 2018 19:42
Message Re: supprimer les indicateur de chemin excédants
Ah oui, heureusement que je t'ai stoppé rapidement.

Désolé pour la blague, je réutilise du code qui fonctionne comme d'hab ou presque.
Bref.
Merci pour ton soutient. C'est une joie de partager avec toi la passion de la programmation, en plus avec Ada.
Profil
cron