;mit DOBJ gewonnenes Listing von 'MakeDir'
;anschließend per Hand optimiert und so verändert, daß neue Directorys
; gleich als nicht ausführbar markiert werden.

        NOLIST
        INCLUDE "exec/LVO.i"
        INCLUDE "exec/execbase.i"
        INCLUDE "dos/LVO.i"
        INCLUDE "dos/dos.i"
        INCLUDE "dos/dosextens.i"
        LIST

_DirName:       EQU -24 ;Zeiger auf das aktuelle zu erzeugende Directory.
                        ;Offset zu A5
_ExecBase:      EQU 36  ;Zeiger auf die Basis der exec.library. Offset zu sp
_DOSBase:       EQUR A3
DirLock:        EQUR D5 ;BPTR auf das alte/neue Directory
IOError:        EQUR D6 ;der erhaltene IO-Fehler
RetCode:        EQUR D7 ;der beabsichtigte Return-Code

        SECTION only,CODE

main:   LINK.W  A5,#-36
        MOVEM.L D2-D3/D5-D7/A2-A3/A6,-(sp)
        MOVEA.W #_AbsExecBase,A0
        MOVEA.L (A0),A6
        MOVEQ.L #RETURN_FAIL,RetCode    ;Vorgabe für den Return-Wert
        MOVEQ.L #0,IOError
        MOVE.L  A6,_ExecBase(sp)
        LEA.L   dosname(pc),A1
        MOVEQ.L #36,D0
        CALL    OpenLibrary
        move.l  D0,_DOSBase
        tst.l   D0
        beq     nodos
        LEA.L   pattern(pc),A0
        MOVE.L  A0,D1
        LEA.L   -28(A5),A1
        MOVE.L  A1,D2
        MOVEQ.L #0,D3
        move.l  d3,(a1)
        CALLDOS ReadArgs
        MOVE.L  D0,32(sp)
        TST.L   D0
        bne     2$
        CALL    IOErr
        MOVE.L  D0,D1
        MOVE.L  D3,D2
        CALL    PrintFault
        bra     abort
2$:     MOVEQ.L #0,IOError
        MOVEA.L -28(A5),A2
        MOVE.L  A2,D1
        bne     3$
        MOVEQ.L #RETURN_FAIL,RetCode
        MOVE.L  D3,D2
        LEA.L   nonameerr(pc),A1
        MOVE.L  A1,D1
        CALL    VPrintf
        bra     .l3
3$:     MOVEQ.L #RETURN_OK,RetCode
        MOVE.L  (A2),_DirName(A5)
        bra     .l4
.l5:    MOVE.L  _DirName(A5),D1
        MOVEQ.L #ACCESS_READ,D2
        CALLDOS Lock
        MOVE.L  D0,DirLock
        beq     1$
        MOVEQ.L #RETURN_ERROR,RetCode
        MOVEQ.L #0,IOError
        LEA.L   twiceerr(pc),A1
        MOVE.L  A1,D1
        LEA.L   _DirName(A5),A6
        MOVE.L  A6,D2
        CALLDOS VPrintf
        bra     unlockthis
1$:     MOVE.L  _DirName(A5),D1
        CALL    CreateDir
        MOVE.L  D0,DirLock
        beq     2$
        MOVE.L  DirLock,D1
        CALL    UnLock
        move.l  _DirName(a5),d1
        moveq   #FIBF_EXECUTE,d2
        CALL    SetProtection
        bra     nolock
2$:     MOVEQ.L #RETURN_ERROR,D0
        CMP.L   D0,RetCode
        beq     3$
        move.l  d0,d7
        CALL    IOErr
        MOVE.L  D0,IOError
3$:     LEA.L   cantcreateerr(pc),A0
        MOVE.L  A0,D1
        LEA.L   _DirName(A5),A1
        MOVE.L  A1,D2
        CALL    VPrintf
unlockthis:
        MOVE.L  DirLock,D1
        CALL    UnLock
nolock: ADDQ.L  #4,A2
        MOVE.L  (A2),_DirName(A5)
.l4:    TST.L   _DirName(A5)
        bne     .l5
.l3:    MOVE.L  32(sp),D1
        CALLDOS FreeArgs
        MOVE.L  IOError,D1
        CALL    SetIoErr
abort:  TST.L   IOError
        beq     closedos
        MOVE.L  IOError,D1
        MOVEQ.L #0,D2
        CALLDOS PrintFault
closedos:
        MOVEA.L _DOSBase,A1
        MOVEA.L _ExecBase(sp),A6
        CALL    CloseLibrary
        bra     quit
nodos:  move.l  _ExecBase(sp),A0
        MOVEA.L (A0),A1
        MOVEA.L ThisTask(A1),A0
        MOVEQ.L #ERROR_INVALID_RESIDENT_LIBRARY,D0
        MOVE.L  D0,pr_Result2(A0)
quit:   MOVE.L  RetCode,D0
        MOVEM.L (sp)+,D2-D3/D5-D7/A2-A3/A6
        UNLK    A5
        RTS

                DC.B    "$VER: makedir 37.211 (7.7.93 by as)",$0a,$0d,0
dosname:        DC.B    "dos.library",0
pattern:        DC.B    "NAME/M",0
nonameerr:      DC.B    "No name given",$0a,0
twiceerr:       DC.B    "%s already exists",$0a,0
cantcreateerr:  DC.B    "Can't create directory %s",$0a,0

        END
