Skip to content
This repository has been archived by the owner on Oct 12, 2021. It is now read-only.

Gestion de l'env #9

Open
bjanik opened this issue Jan 11, 2018 · 7 comments
Open

Gestion de l'env #9

bjanik opened this issue Jan 11, 2018 · 7 comments

Comments

@bjanik
Copy link
Collaborator

bjanik commented Jan 11, 2018

Concernant la gestion de l'env, on le stocke dans une liste chainée?( avec les champs name, value, un flag indiquant si la variable est exportable ou non et un next of course).

Les fonctions de gestion seraient les suivantes:

  1. Fonction d'affichage.
  2. Fonction de recherche d'une variable (custom getenv)
  3. Fonction d'ajout d'une variable
  4. Fonction de suppression d'une variable
  5. Fonction qui convertit l'environnement passé dans le main en liste chainée (appelée lors de l'initialisation du shell).
  6. Fonction qui convertit l'env sous forme de char** pour le passer en parametre d'execve.

L'appel de env sans arguments affichant que l'ensemble des variables exportables, Hugo a suggeré a juste titre d'implémenter un builtin "declare", qui afficherait l'ensemble des variables (exportable ou non).

@VannTen
Copy link
Owner

VannTen commented Jan 11, 2018

  • un flag persistant poru convertir l'env en char** seulement si la liste a changée (point6).
    Donc notre env ressemblerait à
struct s_env
{
   t_env_list *env_list; // list chaine de valeur de l'env (ou eventuellent un t_lst * contenant des t_env)
   char   **env_array; // tableau a passer a exec.
   t_bool env_list_has_changed; // flag set a FALSE a chaque fois que env_array est update, et a TRUE a chaque fois que env_list est update.
}

On aurait typiquement une fonction du type :

char const **get_env_array(struct s_env *env)
{
if (env->env_list_has_changed)
   {
   update_env_array(&env->env_array, const env->env_list); // le const serait dans le proto je le mets pour plus compact
   env->env_list_has_change = FALSE;
   }
   return (env->env_array);
}

@maoux
Copy link
Collaborator

maoux commented Jan 11, 2018

donc fonction en plus a faire :
int env_list_has_changed(t_env_list);

qui fait cette partie ?

@bjanik
Copy link
Collaborator Author

bjanik commented Jan 11, 2018

Je m'en occupe! J'ai deja commencé jeudi aprèm

@VannTen
Copy link
Owner

VannTen commented Jan 12, 2018

Y'a pas tellement besoin d'une fonction. Il faut juste un wrapper sur les fonctions qui modifie la liste, qui passe le boolean a TRUE.

@VannTen
Copy link
Owner

VannTen commented Jan 12, 2018

Du genre

add_to_env(t_env *env, char const *key_and_value)
{
f_add_to_env_list(&env->env_list, key_and_value);
// éventuellement check alloc.
env->env_list_has_changed = TRUE;
}

@bjanik
Copy link
Collaborator Author

bjanik commented Jan 15, 2018

Je viens de push sur la branche env_management les fonctions de gestion de l'env décrites ci-dessus

@VannTen
Copy link
Owner

VannTen commented Jan 16, 2018

Merci :).
J'ai jeté un coup d'oeil, ça ma l'air propre. Juste deux petites remarques :
-Tes fonctions prennent en paramètres des char * const, ce qui veut dire que le pointeur passé en paramètres ne sera pas modifié, non pas son contenu ! C'était plutôt char const * ? (Le const sur le paramètres passé en copie ne change rien pour l'interface, vu que c'est la copie dans la fonction qui est modifié le cas échéant. (Comme un int const en param, on le met pour se souvenir qu'on ne le modifie pas, mais pas dans l'interface).

  • pour les flags global local, on peut utiliser une enum anonyme ou non plutot que des defines. L'avantage c'est que le debugger montrera le nom de la constante symbolique, pas la valeur (et c'est quand meme plus utile)
enum
{
    LOCAL,
    GLOBAL,
    GLOBAL_AND_LOCAL
};

(Si on utilise ma libft, les booléans sont définis avec le type t_bool)

@VannTen VannTen closed this as completed Jan 16, 2018
@VannTen VannTen reopened this Jan 16, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants