19Fermer21
deleted2Le 16/10/2010 à 20:54
>>>>> 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 cheeky)
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 hehe)