>>>>> Ceci dit, c'est quand même un sacré bricolage, la ligne de commande
T'imagine pas, surtout quand tu veux gérer des options un peu étendues qui prennent elle-même des arguments etc...
C'est pour ça que j'ai fini par faire une lib pour ça. Mon premier concept marchait, mais ne simplifiait pas assez. Maintenant, c'est aussi con que ça :
Dans le programme, tu appelles le gestionnaire (ça a l'air gros, mais en C c'est juste une ligne):
Appel
pea SwitchFolder(pc)
pea SwitchSavePath(pc)
pea SwitchFlash(pc)
pea SwitchRemove(pc)
pea SwitchList(pc)
pea SwitchUnarc(pc)
pea SwitchArc(pc)
pea SwitchCallback(pc)
pea StrSwitches(pc)
clr.l -(sp) ; a6 is used as global frame pointer, I don't need &Data
pea CMDLINE(a6)
jsr MANAGE_CMDLINE(a6)
Ensuite, tu fais une fonction par switch supporté :
Fonctions
SwitchRemove:
move.w #REMOVE,TASK(a6)
moveq.l #PDTLIB_CONTINUE,d0
rts
SwitchFlash:
bset.b #FLAG_FLASH,FLAGS(a6)
moveq.l #PDTLIB_CONTINUE,d0
rts
SwitchSavePath:
bset.b #FLAG_SAVE_PATH,FLAGS(a6)
moveq.l #PDTLIB_CONTINUE,d0
rts
...
Enfin, la callback appelée après la gestion de chaque switch, en cas d'erreur, ou si un argument n'est pas un switch :
Callback
SwitchCallback:
cmpi.w #PDTLIB_INVALID_SWITCH,d0
bne.s \NotInvalidSwitch
;---------------------------------------------------------------
; Switch doesn't exist
;---------------------------------------------------------------
move.w #ERROR_INVALID_SWITCH,ERROR(a6)
lea CMDLINE(a6),a0
jsr GET_CURRENT_ARG_PTR(a6)
pea (a0)
pea StrErrorInvalidSwitch(pc)
\QuitError: bsr Print2Stderr
addq.l #8,sp
moveq.l #PDTLIB_STOP,d0
rts
\NotInvalidSwitch:
cmpi.w #PDTLIB_NOT_A_SWITCH,d0
bne.s \NotNotASwitch
...
;---------------------------------------------------------------
; Else it is PDTLIB_SWITCH_OK, all is fine
;---------------------------------------------------------------
\NotNotASwitch:
moveq.l #PDTLIB_CONTINUE,d0
rts
Ca devient facile, t'as juste une fonction à écrire pour chaque chose que ton programme doit savoir faire, tu t'occupes plus de rien.
(à noter la fonction GetCurrentArgPtr pour récupérer un argument provoquant une erreur, ou un argument qui n'est pas un switch etc... GetNextArgPtr est la dernière fonction et permet de gérer les switches avec arguments (elle retourne NULL s'il n'y en a pas).
C'est beaucoup plus rapide et simple que de tout faire soi-même, et pourtant j'ai bossé un paquet de temps là-dessus !
(tiens tiens tiens... ça me fait penser que je pourrais ajouter une callback pour gérer directement les arguments qui ne sont pas des switches, en passant l'adresse de l'argument en question

)
PpHd (./16) :
Il faut différencier les actions / opérations principales des autres options.
Tu pux préciser stp ? Un truc du genre :
:> par fcv -a <archive> <fichier1> <fichier 2>
Pour créer une archive (-a) de deux fichiers, la mettre en flash (f) en ignorant les erreurs (c) en mode verbeux (v)
Un truc dans ce style ?
(tiens c'est rigolo, une fonction en plus "ManagePackedSwitches()", wrapper de ManageCmdline(), et ma lib continuerait à gerér ça

)