home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug041.arc / RENAME.DOC < prev    next >
Text File  |  1979-12-31  |  7KB  |  296 lines

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