PpHd (./28) :
Par exemple pour extraire une archive sans savoir quels sont les fichiers dedans on fait comment ?
D'une manière générale, l'opération à faire sur l'archive (extraction, listing, suppression) se fait sur tous les fichiers de l'archive, sauf si une liste de fichiers est précisée, auquel cas l'opération s'applique à cette liste. Il suffit de passer NULL comme seul argument de la va_list pour que celle-ci soit vide.
'par__ExtractFile (<archive>, <Flags>, NULL);' extrait tous les fichiers d'une archive.
PpHd (./28) :
C'est quoi les valeurs retours retournées ?
Bonne question, je me rends compte que je ne peux pas me contenter d'un code d'erreur : ce n'est pas assez précis, notamment dans le cas où le programme veut signaler quel est le fichier manquant, ou au nom invalide etc : Par sait en temps réel quel fichier provoque l'erreur (et s'en sert pour afficher 'invalid file %s' par exemple), mais cette info est perdue lorsqu'on retourne au programme appelant.
Le mieux serait peut-être de renvoyer un handle au format documenté, genre :
; header
ds.b 2 -> code d'erreur
ds.b (strlen(str)) -> chaine d'erreur (word null si pas d'erreur)
; Pour list, on rajoute :
ds.b 2 -> nombre de fichiers
; Puis une partie dynamique :
ds.b 18 -> Nom du fichier (c-string)
ds.b 2 -> taille du fichier
ds.b 1 -> type
ds.b 1 -> <padding>
etc...
dc.w 0 -> fin de la liste.
A charge pour le programme appelant de libérer le handle évidemment.
De plus, si on veut qu'un programme type GUI ait accès aux infos du mode verbveux ou aux erreurs non fatales (option -c -> continue sur les erreurs quand c'est possible), il faut que Par puisse appeler une callback, afin que le programme puisse afficher cette chaine (dans le terminal, dans une fenêtre...).
Ca donne donc des protos de ce genre :
HANDLE par__ArchiveFiles (const char* Archive, unsigned short Flags, void (*Callback) (const char* Str), const char* Folder, const char* File1, ...);
HANDLE par__ExtractFiles (const char* Archive, unsigned short Flags, void (*Callback) (const char* Str), const char* Folder, const char* File1, ...);
HANDLE par__Remove (const char* Archive, void (*Callback) (const char* Str), const char* File1, ...);
HANDLE par__List (const char* Archive, void (*Callback) (const char* Str), const char* File1, ...);
Note : Si la callback vaut null, alors stdout/err sont utilisés comme sortie.
En effet, le programme Par est un wrapper autour de la lib (puisqu'il est aussi une lib

), et s'appelle comme n'importe quel programme externe (à la différence près qu'il fait un bsr vers ses propres fonctions exportées évidemment).
En clair, _main parse la ligne de commande, construit les appels vers par@000x, puis fait l'appel.
Plus qu'un programme qui exporte des services, Par devient un wrapper autour d'une librairie. Ca simplifie de beaucoup le code amha.