home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG041.ARC / RENAME.MAC < prev    next >
Text File  |  1979-12-31  |  6KB  |  274 lines

  1. ;====================================================================
  2. ;
  3. ; RENAME :- Rename all files matching afn1 to afn2.
  4. ;
  5. ;   PROGRAM
  6. ;
  7. ;
  8.     INCLUDE    MACRO.LIB
  9. ;====================================================================
  10. ;
  11. ; Program :-
  12. ;
  13. ;
  14.     ENTRY
  15.     LD    A, (CPMBUFF)
  16.     OR    A
  17.     JR    NZ, RNM        ; parameter given
  18.     WRITELN 'RENAME :- Rename all files matching afn1 to afn2.'
  19.     RET
  20. RNM:    LD    A, (CCPFCB2 + dr)
  21.     OR    A
  22.     JP    NZ, DR2DIFF
  23.     FILES            ; find source files
  24.     JP    NZ, NOMEM
  25.     LD    A, B
  26.     OR    C
  27.     JP    Z, NOFILE
  28.     LD    (SFILES), BC
  29.     LD    (CHKADDR), DE
  30.     FILES    CCPFCB2        ; get destination files for checking
  31.     JP    NZ, NOMEM    ;   if file of that name already
  32.     LD    (CFILES), BC    ;   exists
  33.     LD    (DSTADDR), DE
  34.     XOR    A
  35.     SBC    HL, DE
  36.     LD    BC, ENDPROG
  37.     ADD    HL, BC
  38.     LD    BC, (CHKADDR)
  39.     SBC    HL, BC
  40.     JP    C, NOMEM    ; insufficient space for destination
  41.     LD    HL, ENDPROG    ;   names
  42.     LD    BC, (SFILES)
  43. NXTNAME:PUSH    BC        ; at least one source file exists
  44.     PUSH    HL
  45.     PUSH    DE
  46.     CALL    CPYNAME
  47.     POP    HL
  48.     LD    BC, 00010h
  49.     ADD    HL, BC
  50.     EX    DE, HL        ; next destination name
  51.     POP    HL
  52.     ADD    HL, BC        ; next source name
  53.     LD    BC, (CFILES)
  54.     INC    BC        ; increase number of files to check
  55.     LD    (CFILES), BC    ;   (no more than 2000h files may
  56.     POP    BC        ;   exist)
  57.     DEC    BC
  58.     LD    A, B
  59.     OR     C
  60.     JR    NZ, NXTNAME
  61.     LD    HL, ENDPROG
  62.     LD    DE, (DSTADDR)
  63.     LD    (OLDAT), HL
  64.     LD    (NEWAT), DE
  65.     LD    BC, (SFILES)
  66. NXTF:    PUSH    BC
  67.     LD    HL, (OLDAT)
  68.     LD    DE, RENBUFF
  69.     LD    BC, 00010h
  70.     LDIR            ; copy source name
  71.     LD    HL, (NEWAT)
  72.     LD    BC, 0000Ch
  73.     LDIR            ; copy destination name
  74.     SERVICE    RENAME, RENBUFF    ; rename file
  75.     CP    0FFh
  76.     JR    Z, BADREN    ; if BDOS reports failure
  77.     LD    BC, (OLDAT)
  78.     CALL    WTFNAME
  79.     WRITE    ' renamed to '
  80.     LD    BC, (NEWAT)
  81.     CALL    WTFNAME
  82.     WRITELN
  83.     JR    UPDATE
  84. BADREN:    WRITE    'BDOS unable to rename '
  85.     LD    BC, (OLDAT)
  86.     CALL    WTFNAME
  87.     WRITE    ' to '
  88.     LD    BC, (NEWAT)
  89.     CALL    WTFNAME
  90.     WRITELN
  91. UPDATE:    LD    BC, 00010h
  92.     LD    HL, (OLDAT)
  93.     ADD    HL, BC
  94.     LD    (OLDAT), HL    ; next source
  95.     LD    HL, (NEWAT)
  96.     ADD    HL, BC
  97.     LD    (NEWAT), HL    ; next destination
  98.     POP    BC
  99.     DEC    BC
  100.     LD    A, B
  101.     OR    C
  102.     JP    NZ, NXTF
  103.     RET
  104.  
  105. NOFILE:    WRITELN 'No matching files found.'
  106.     RET
  107.  
  108. DR2DIFF:WRITELN 'Destination name can not specify a drive code.'
  109.     JR    QUIT
  110. NOMEM:    WRITELN    'Too many files found for available memory space.'
  111. QUIT:    WRITELN 'Aborted, no files renamed.'
  112. JP    ERREXIT
  113.  
  114. DSEG
  115. SFILES:    DS    WORD        ; holds number of source files found
  116. CHKADDR:DS    WORD        ; address of first file to check name
  117.                 ;   doesn't already exist
  118. CFILES:    DS    WORD        ; number of files to check
  119. DSTADDR:DS    WORD        ; address of first destination name
  120. OLDAT:    DS    WORD        ; address of source name
  121. NEWAT:    DS    WORD        ; address of destination name
  122. RENBUFF:DS    0001Ch        ; holds 'FCB' for rename service
  123. CSEG
  124. ;====================================================================
  125. ;
  126. ; Subroutines :-
  127. ;
  128. ;
  129. CPYNAME:            ; Generate new name corresponding to
  130.                 ;   old name at HL and place it at
  131.                 ;   DE. Check that no files of that
  132.                 ;   name already exist, and that name
  133.                 ;   is valid, abort otherwise. Set dr
  134.                 ;   of new name to 000h.
  135.     LD    (OLDAT), HL
  136.     LD    (NEWAT), DE
  137.     LD    A, 000h
  138.     LD    (DE), A        ; set dr of new name
  139.     INC    DE
  140.     LD    HL, CCPFCB2 + fname
  141.     LD    BC, 0000Bh    ; length of fname + ftype
  142.     LDIR            ; copy new name into memory    
  143.     LD    HL, (OLDAT)    ; HL = old name
  144.     LD    DE, (NEWAT)    ; DE = new name
  145.     LD    B, 00Bh
  146. NXT?:    INC    HL
  147.     INC    DE
  148.     LD    A, (HL)
  149.     AND    080h
  150.     LD    C, A        ; store attribute bit
  151.     LD    A, (DE)
  152.     CP    '?'
  153.     JR    NZ, NOT?
  154.     LD    A, (HL)        ; replace '?' from old name
  155. NOT?:    OR    C        ; add attribute bit
  156.     LD    (DE), A
  157.     DJNZ    NXT?
  158.     LD    HL, (NEWAT)
  159.     INC    HL
  160.     LD    B, 008h
  161.     CALL    SPCHK
  162.     BIT    7, (HL)
  163.     JP    NZ, RDONLY    ; file is read only
  164.     LD    B, 003h
  165.     CALL    SPCHK        ; check file name is legal
  166.     LD    BC, (CFILES)
  167.     LD    DE, (CHKADDR)
  168. NXTCHK:    LD    A, B        ; check if file of that name already
  169.     OR    C        ;   exists
  170.     RET    Z
  171.     PUSH    BC
  172.     PUSH    DE
  173.     INC    DE
  174.     LD    HL, (NEWAT)
  175.     INC    HL
  176.     LD    B, 00Bh
  177. NXTL:    LD    A, (DE)        ; compare letters
  178.     XOR    (HL)
  179.     AND    07Fh        ; mask attribute bit
  180.     JR    NZ, NOMTCH
  181.     INC    DE
  182.     INC    HL
  183.     DJNZ    NXTL
  184.     LD    HL, (OLDAT)    ; a match has been found
  185.     LD    DE, (NEWAT)
  186.     LD    B, 00Bh
  187. NXTBYTE:INC    HL        ; see if source name is the same as
  188.     INC    DE        ;   destination name
  189.     LD    A, (DE)
  190.     CP    (HL)
  191.     JR    NZ, NOTSAME
  192.     DJNZ    NXTBYTE
  193.     JR    NOMTCH        ; source same as destination, ok
  194. NOTSAME:POP    DE        ; used to see if file already exists
  195.     JP    FMATCH
  196. NOMTCH:    POP    DE
  197.     LD    HL, 00010h
  198.     ADD    HL, DE
  199.     EX    DE, HL
  200.     POP    BC
  201.     DEC    BC
  202.     JR    NXTCHK
  203.  
  204. SPCHK:                ; Check that fname / ftype is legal.
  205.                 ;   HL = first letter of word
  206.                 ;   B = number of bytes in fname /
  207.                 ;     ftype.
  208.                 ;   Return HL = HL + B.
  209.     LD    A, ' '
  210.     XOR    (HL)
  211.     INC    HL
  212.     AND    07Fh        ; mask attribute bit
  213.     JR    Z, ENDWD
  214.     DJNZ    SPCHK
  215.     RET
  216. ENDWD:    DEC    B
  217.     RET    Z
  218.     LD    A, ' '
  219.     XOR    (HL)
  220.     INC    HL
  221.     AND    07Fh
  222.     JR    Z, ENDWD
  223.     WRITE    'Renaming '
  224.     LD    BC, (OLDAT)
  225.     CALL    TFNAME
  226.     WRITE    <' would result in an invalid filename, viz '>
  227.     LD    BC, (NEWAT)
  228.     CALL    WTFNAME
  229.     WRITELN
  230.     JP    QUIT
  231.  
  232. RDONLY: LD    BC, (OLDAT)
  233.     CALL    TFNAME
  234.     WRITELN ' is R/O, unable to rename read only files.'
  235.     JP    QUIT
  236.  
  237. FMATCH:    LD    HL, (DSTADDR)
  238.     EX    DE, HL        ; DE = first destination name
  239.     XOR    A        ; HL = name which matches
  240.     SBC    HL, DE
  241.     JR    C, EXISTS    ; if name is in file-already-exists
  242.     LD    DE, ENDPROG    ;   portion of memory
  243.     ADD    HL, DE
  244.     WRITE    'Renaming of both '
  245.     LD    B, H
  246.     LD    C, L
  247.     CALL    TFNAME
  248.     WRITE    ' and '
  249.     LD    BC, (OLDAT)
  250.     CALL    TFNAME
  251.     WRITE    <' would result in a duplicate', RET, LF, '  filename, viz '>
  252.     LD    BC, (NEWAT)
  253.     CALL    TFNAME
  254.     WRITELN
  255.     JP    QUIT
  256. EXISTS:    WRITE    'Renaming of '
  257.     LD    BC, (OLDAT)
  258.     CALL    TFNAME
  259.     WRITE    ' is not possible as a file called '
  260.     LD    BC, (NEWAT)
  261.     CALL    TFNAME
  262.     WRITELN    <RET, LF, '  already exists.'>
  263.     JP    QUIT
  264. ;--------------------------------------------------------------------
  265.  
  266.     TFNAME            ; macro declared subroutines
  267.     WTFNAME
  268.     FSEARCH
  269.     DSEARCH
  270. ;====================================================================
  271.  
  272. ENDPROG:
  273.     END
  274.