Un prompt linux

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 359 fois - Téléchargée 30 fois

Contenu du snippet

Pour ma première contribution : une fonction qui retourne un prompt (Linux)
Alors, a quoi ca sert ? Bah à pas grand chose :) Sauf que je programme un shell et j'ai pas mal cherché ce genre de fonction.
Donc, si un jour tu dois toi aussi programmer un shell, tu auras déjà la fonction qui te retourne le prompt qui va bien ;)

Pour l'utiliser :
...
char *invite=prompt();

Laurent

Source / Exemple :


#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char *prompt (void)
{
   char *invite = NULL;
   char const *user = getenv("USERNAME");

   if (user == NULL)
   {
      user = getenv("USER");

      if (user == NULL)
      {
         user = "";
      }

   }

   {
      char const *host = getenv("HOSTNAME");

      if (host == NULL)
      {
         host = "";
      }

      {
         char const *aux = getenv("PWD");

         if (aux == NULL)
         {
            aux = "";
         }
         {
            char const *rep = aux + strlen(aux);

            while (rep >= aux && *rep != '/')
            {
               rep--;
            }

            rep++;

            invite = malloc(strlen(user) + strlen(host) + strlen(rep) + 6);

            if (invite != NULL)
            {
               strcpy(invite, "[");
               strcat(invite, user);
               strcat(invite, "@");
               strcat(invite, host);
               strcat(invite, " ");
               strcat(invite, rep);
               strcat(invite, "]");
               strcat(invite, "$");
               strcat(invite, " ");
            }

         }

      }
   }
   return invite;
}

int main (void)
{
   int end = 0;

   while (!end)
   {
      char *s = prompt();

      if (s != NULL)
      {
         printf ("%s", s);
         fflush (stdout);
         free (s), s = NULL;
      }

      {
         char line[128];
         fgets(line, sizeof line, stdin);
         end = strcmp(line, "quit\n") == 0;
      }

   }
   return 0;
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
mardi 28 février 2012
Statut
Membre
Dernière intervention
12 novembre 2012

Bonjour, et merci pour ton code il m'est d'un parfait secourt.
Mais je me demande comment je peux gérer les PS1 et PS2 décrit dans le SCL (Shell Command Language).
Si j'ai bien compris, PS1 c'est juste ' $ ' et PS2 c'est au cas ou le shell a besoin de plus d'infos donc il donne à nouveau la mais à l'utilisateur et dans ce cas de figure le ' $ ' devient ' > '.....

Comment je fais ça avec ton code??? Stp.
Merci d'avance...
Messages postés
1
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
17 août 2011

slt,
cette fonction est parfaitement ce que je recherchai pour ce que j'essaye de faire et je t'en remercie de l'avoir posté, mais il y a une petite partie que je n'arrive pas a comprendre...

char const *rep = aux + strlen(aux);
while (rep >= aux && *rep != '/')
{
rep--;
}

comment une chaine peut etre additionné à un entier? et du coup je ne comprend pas ce que "rep" renvoie et ce que fait la boucle while...
Merci
Messages postés
1
Date d'inscription
dimanche 19 avril 2009
Statut
Membre
Dernière intervention
2 novembre 2010

slt,
apparement l'utilisateur ne peut changer le prompte normalement si tu veux decrire le comportement d'un shell : tu peux faire export ps1 = " "
ensuite tu veras que le prompt a changer et parail pour le ps2
ensuite pour la gestion des variables speciales de shell.
je suis entraine de faire la meme choses mais c vrai que pour juste afficher juste un prompt c pas mal
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

et déclare tes variables en début de scope!!! pas n'importe ou avec tes {} !



~(.:: NitRic ::.)~
Messages postés
1
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
12 décembre 2005

Je ne vois qu'une petite erreur technique:

invite = malloc(strlen(user) + strlen(host) + strlen(rep) + 6);

strlen() ne calcul pas le caractère NULL de fin de "string", et puisque tu ajoutes exactement 6 caractères, il faudrait ajouter +1 dans le total des caractères pour ce malloc().
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.