10Fermer12
deleted2Le 16/10/2010 à 18:07
PpHd (./10) :
Oué, les options longues servent à rien (trop long pour ti)

Ca a de la gueule, ça fait plus mieux vrai trilove
Mais ok.
PpHd (./10) :
et même pour les options courtes j’enlèverai le '-' pour que ca soit plus court à taper.

Et tu fais comment pour différencier un fichier d'une option ?
Ou alors -xlkjsdfjherterqmsdflkjg façon tar ? C'est juste imbitable, mais bon grin

L'avantage de l'état actuel des choses est que ça gère aussi les options du genre --truc <argument de truc> --machin.
Le code est court pour gérer tout ça (et 700 octets pour l'ensemble de la lib, qui est rentabilisée par un seulement deux programmes de ce type, et exécutable en archive).
ManageCommandLine
;==============================================================================
;       Registers usage:
;       a2      callback
;       a3      switchlist (current)
;       d3      #opt / misc
;
;       Offset of args in the stack :
FRAME_BASE      equ     4+4*4            ; 4 registers saved + return address
CMDLINE         equ     0+FRAME_BASE
DATA_PTR        equ     4+FRAME_BASE
SWITCHLIST      equ     8+FRAME_BASE
CALLBACK        equ     12+FRAME_BASE
SWITCHFUNC      equ     16+FRAME_BASE
;==============================================================================

pdtlib@0002:
    ;-----------------------------------------------
    ;    Check if an arg remains
    ;-----------------------------------------------
        movem.l d3-d4/a2-a3,-(sp)
        movea.l CALLBACK(sp),a2                         ; Callback : a2
\Loop:    movea.l CMDLINE(sp),a0                          ; CMDLINE*
        bsr.s   pdtlib@000A                             ; Get next arg
        move.l  a0,d0
        bne.s   \StillArgs
                moveq.l #PDTLIB_END_OF_PARSING,d0       ; No more arg, quit
\Quit:          movem.l (sp)+,d3-d4/a2-a3
                rts

    ;-----------------------------------------------
    ;    Check if it is a long or a short switch
    ;-----------------------------------------------
\StillArgs:
    movea.l    SWITCHLIST(sp),a3
    moveq.l    #-4,d3
    cmpi.b    #'-',(a0)
    bne.s    \NoMinus
        cmpi.b    #'-',1(a0)
        beq.s    \LongSwitch
        bra.s    \ShortSwitch
\NoMinus:
    cmpi.b    #'+',(a0)
    beq.s    \Plus
        ;-----------------------------------------------
        ;    Not a switch, inform the program
        ;-----------------------------------------------
        moveq.l #PDTLIB_NOT_A_SWITCH,d0
                movea.l DATA_PTR(sp),a0
                jsr     (a2)
                moveq.l #PDTLIB_NOT_A_SWITCH,d1
\TestCallbackReturn:
                subq.w  #PDTLIB_STOP,d0                 ; Continue or stop, depending on
                bne.s   \Loop                           ; callback result
                        move.w  d1,d0
                        bra.s   \Quit
\Plus:    cmpi.b    #'+',1(a0)
    beq.s    \LongSwitch

    ;-----------------------------------------------
    ;    Handle short switch
    ;-----------------------------------------------
\ShortSwitch:
    move.b    (a0)+,d0                ; d0.b: sign
\ShortSwitchLoop:
    addq.w    #4,d3
    move.b    (a3)+,d1
    beq.s    \NoShortSwitch
    cmp.b    (a0),d1
    beq.s    \SwitchFoundNoPop
\NoShortSwitch:
    tst.b    (a3)+                    ; CHECK THAT FOR #0 AT END OF TABLE !
    bne.s    \NoShortSwitch
    tst.b    (a3)
    bne.s    \ShortSwitchLoop
    tst.b    1(a3)
    bne.s    \ShortSwitchLoop

    ;-----------------------------------------------
    ;    Switch doesn't exist
    ;-----------------------------------------------
\InvalidSwitch:
        moveq.l #PDTLIB_INVALID_SWITCH,d0
        movea.l DATA_PTR(sp),a0
        jsr     (a2)
        moveq.l #PDTLIB_INVALID_SWITCH,d1
        bra.s   \TestCallbackReturn

    ;-----------------------------------------------
    ;    Handle long switch
    ;-----------------------------------------------
\LongSwitch:
    move.b    (a0),d4                    ; d4.b: sign
    pea    2(a0)
\LongSwitchLoop:
    addq.l    #1,a3                    ; Skip short switch
    addq.w    #4,d3
    move.l    (sp),-(sp)
    pea    (a3)
    ROMC    strcmp
    addq.l    #8,sp
    tst.w    d0
    beq.s    \SwitchFound
\SkipSwitch:
    tst.b    (a3)+
    bne.s    \SkipSwitch
    tst.b    (a3)
    bne.s    \LongSwitchLoop
    tst.b    1(a3)
    beq.s    \InvalidSwitch
    bra.s    \LongSwitchLoop

    ;-----------------------------------------------
    ;    Switch is found, execute its routine
    ;-----------------------------------------------
\SwitchFound:
        movea.l (sp)+,a0
    move.b    d4,d0
\SwitchFoundNoPop:
        movea.l SWITCHFUNC(sp,d3.w),a1
        move.l  DATA_PTR(sp),a0
        jsr     (a1)
        moveq.l #PDTLIB_SWITCH_OK,d0
        move.l  DATA_PTR(sp),a0
        jsr     (a2)
        moveq.l #PDTLIB_SWITCH_OK,d1
        bra.s   \TestCallbackReturn


(c'est moi ou les tabs sont passées à 4 caractères de large, ça chie pour la mise en page de l'asm :/)