Problème compatibilité librairie MAC et UBUNTU

LUFFYroooo Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -  
LUFFYroooo Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je souhaite recoder la fonction "ls" dans le cadre d'un projet pour mon école.

Le soucis est que je dispose d'un environnement Ubuntu alors qu'a mon école nous avons des macs.

J'utilise donc la fonction "opendir" de "sys/stat.h", je vous met le code pour vous aider a comprendre mon problème :



#include "ls.h"

void ft_ls_name(int argc, char **argv)
{
DIR *rep;
int i;
struct dirent *ent;

i = 1;
while(i < argc)
{
rep = opendir(argv[i]);
if (rep != NULL)
{
while ((ent = readdir (rep)) != NULL)
ft_putendl(ent->d_name);
closedir(rep);
}
i++;
}
}

int main(int argc, char **argv)
{
ft_ls_name(argc, argv);
return (0);
}



Le retour sur Mac, grâce a la fonction d'affichage me permet d'avoir tout les "noms" trié par ordre Ascii, exemple :

MAC : (sans fonction de trie)

.
..
libft
ls
ls.h
main.o
main.c
Makefile

Ubuntu : (sans fonction de trie)

.
main.o
Makefile
..
ls
main.c
libft
ls.h

J'aimerais donc savoir si quelqu'un avais une solution a m'apporter pour Ubuntu,peut-être remplacer sys/types.h par celui de mac ?

Je ne veux pas faire de fonction de trie car je compte ne rien stocker, pour que le programme sois plus rapide !

Merci, Luffy

A voir également:

1 réponse

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut LUFFYroooo,

1. rien ne garantit que readdir() renvoie un résultat classé
2. ls, en revanche doit renvoyer par défaut un résultat classé alphabétiquement, sauf options particulières
3. si tu veux te reposer sur une fonction POSIX faisant le travail pour toi, tu peux utiliser scandir()
4. tu peux aussi faire le tri toi même


Dal
0
LUFFYroooo Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de ta reponse !

Mais justement, sur MAC(du moins a mon ecole (42)) la fonction readdir renvoie le résultat classer par ordre ASCII tandis que sur Ubuntu non !

Je n'est pas le droit d utiliser la fonction scandir() dans le cadre de mon projet a part si je recode cette fonction.

Et pour le trie, je ne peux pas faire de trie car je ne veux rien stocker pour que le programme sois trés rapide sur un "ls -R /", je profite donc du fait que sur mac le resultat sois trié !

Le temps gagner est peut etre infime pour un humain, mais je n'ai pas non plus le droit de dépasser ma stack ! C est pour cela que je ne veux pas stocker les donnés (meme si, je suis d'accord que sa resouderais mon probleme)

Merci !
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
readir est conforme à la norme POSIX sous Linux, et cette norme n'oblige pas à garantir que readdir() renvoie un résultat classé par ordre alphabétique, contrairement à ls, qui elle, est une commande POSIX qui doit renvoyer un résultat classé par ordre alphabétique par défaut (liens vers les pages Open Group).

Si tu te bases sur le fait que l’implémentation de readir sous Mac serait classée, ton code pour ls sera plus rapide, mais ne sera pas portable (sous réserve, que, effectivement, tu puisses considérer comme acquis que ce comportement sous Mac est avéré - est-il spécifié dans une documentation officielle d'Apple ?).

Si la question de la portabilité n'est pas un problème pour toi, dans ton cas, tant mieux, et alors je ne vois pas quelle "solution" à quel problème tu cherches.

Est-ce que tu cherches seulement à simuler sous Linux, pour les besoins de ton développement sous Linux seulement, le comportement de readir sous Mac ?


Dal
0
LUFFYroooo Messages postés 14 Date d'inscription   Statut Membre Dernière intervention  
 
Sur la documentation Apple :

The readdir() function returns a pointer to the next directory entry. It returns NULL upon reaching
the end of the directory or on error. In the event of an error, errno will be set to any of the values
documented for the getdirentries(2) system call.


DOnc je ne pense pas que ca sois specifier ! Non la portabilite n est pas un probleme pour le moment, je cherchais juste un moyen d'obtenir le meme resultat, je ferais comme si !

Merci pour ta reponse ! :)
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
tu pourrais faire une compilation conditionnelle en testant
#ifdef __linux__
et dans ce cas ajouter le code nécessaire au classement alphabétique (ou utiliser scandir).
0
LUFFYroooo Messages postés 14 Date d'inscription   Statut Membre Dernière intervention   > [Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention  
 
Merci de ta réponse, mais au vus des soucis rencontrés pour le trie au cas où les fichiers se nomme ....B et ....a par exemple nous avons décidé d utiliser un trie par insertion dans une liste doublement chaînée ! (La fonction scandir n est pas autorisé)

Merci pour tout, j essayerais ce que tu ma dis pour voir le résultat quand même !
0