home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / utility / disk / maxid_22 / copy.s next >
Text File  |  1992-02-18  |  11KB  |  431 lines

  1. ;File name:    COPY.S            Revision date:    1992.02.19
  2. ;Ported by:    Ulf Ronald Andersson    Portation date:    1992.02.18
  3. ;Ported from:    C-source    Ported to:    Devpac 2 source
  4. ;Copyright:    (C)1986 Max Böhm
  5. ;
  6. ;Original file header, each line preceded by a semicolon, follows:
  7. ;/* 16.5.86  Max Böhm */
  8. ;
  9. ;/* Dieses Programm kopiert den Inhalt des "Source"-Directory    */
  10. ;/* in das "Dest"-Directory.                                     */
  11. ;/* Die beiden Directorys können als Parameter angegeben werden. */
  12. ;/* Defaultwerte sind A:\COPY und D:                             */
  13. ;
  14. ;#include <osbind.h>
  15. ;#include <string.h>
  16. ;Here ends the original file header.
  17. ;
  18. ;
  19.     include    TOS\URAn_SYS.S
  20.     include    TOS\URAn_DOS.S
  21. ;
  22. ;
  23.     text
  24. ;
  25.     opt    a+
  26.     opt    o+
  27.     opt    p+
  28. ;    
  29. ;
  30. _max_args    = 2
  31. ;
  32. ;
  33. _startup:
  34.     move.l    4(sp),a5
  35.     move.l    bp_bss_beg_p(a5),a0
  36.     add.l    bp_bss_len(a5),a0
  37.     move.l    a0,sp
  38.     sub.l    a5,a0
  39.     gemdos    Mshrink,!,(a5),a0
  40.     lea    static,a4
  41.     clr    _argc-static(a4)
  42.     lea    _argv-static(a4),a2
  43.     lea    _argcopy-static(a4),a1
  44.     move.l    a1,(a2)+
  45.     clr.b    (a1)+
  46.     lea    bp_argstring(a5),a3
  47.     move.b    bp_arglen(a5),d7
  48.     and    #$7F,d7
  49.     clr    d6
  50.     subq    #1,d7
  51.     bmi.s    .gotargs
  52. .getarg_lp_1:
  53.     cmpi.b    #' ',(a3)+
  54.     dbgt    d7,.getarg_lp_1
  55.     ble.s    .gotargs
  56.     subq    #1,a3
  57.     addq    #1,d6            ;_argc += 1
  58.     move.l    a1,(a2)+        ;_argv[d6] = a1
  59. .getarg_lp_2:
  60.     move.b    (a3)+,(a1)+
  61.     cmpi.b    #' ',(a3)
  62.     dble    d7,.getarg_lp_2
  63.     bgt.s    .gotargs
  64.     clr.b    (a1)+
  65.     cmpi    #_max_args,d6
  66.     blt.s    .getarg_lp_1
  67. .gotargs:
  68.     pea    _argv-static(a4)
  69.     move    d6,_argc-static(a4)
  70.     move    d6,-(sp)
  71.     bsr    main
  72.     gemdos    Pterm,d0
  73. ;
  74. ;
  75.     data
  76. ;
  77. _argc:        ds.w    1
  78. _argv:        ds.l    _max_args+1
  79. _argcopy:    dcb.b    128,0
  80. ;
  81. static:
  82. ;
  83. source:        dc.b    'A:\COPY'
  84.         dcb.b    (*-source)+100,NUL
  85. dest:        dc.b    'D:'
  86.         dcb.b    (*-source)+100,NUL
  87. starpstar:    dc.b    '\*.*',NUL
  88. slash:        dc.b    '\',NUL
  89. crlf:        dc.b    CR,LF,NUL
  90.         even
  91. buffer:        dc.l    0
  92. buf_size:    dc.l    0
  93. files:        dc.w    0
  94. folders:    dc.w    0
  95. ;
  96. ;
  97.     bss
  98. ;
  99. ;
  100.     ds.l    $100    ;allow 256 longwords on minimum stack
  101. ;
  102. ;
  103.     text
  104. ;
  105. ;
  106. printi    macro    string
  107.     bra.s    .skip\@
  108. .string\@:    dc.b    \1,NUL
  109.     even
  110. .skip\@:
  111.     gemdos    Cconws,.string\@(pc)
  112.     endm    ;printi
  113. ;
  114. ;
  115. prints    macro    string
  116.     gemdos    Cconws,\1
  117.     endm    ;prints
  118. ;
  119. ;
  120. main:                        ;main(argc,argv)
  121.     RSRESET
  122. ;NB: if locals were used they would be declared here, above .aut1
  123. .aut1    rs.l    2
  124. .argc    rs.w    1                ;int argc;
  125. .argv    rs.l    1                ;char *argv[];
  126.     link    a6,#-.aut1            ;{
  127.     printi    <CR,LF,'COPY: Folder copier now starting.',CR,LF,ESC,'w'>
  128.     cmpi    #1,.argc-.aut1(a6)        ; if (argc>=1)
  129.     blt.s    .endif_1
  130.     move.l    .argv-.aut1(a6),a0
  131.     move.l    4(a0),-(sp)
  132.     pea    source-static(a4)
  133.     bsr    strcpy                ;   strcpy(source,argv[1]);
  134.     addq    #8,sp
  135. .endif_1:
  136.     cmpi    #2,.argc-.aut1(a6)        ; if (argc>=2)
  137.     blt.s    .endif_2
  138.     move.l    .argv-.aut1(a6),a0
  139.     move.l    8(a0),-(sp)
  140.     pea    dest-static(a4)
  141.     bsr    strcpy                ;   strcpy(dest,argv[2]);
  142.     addq    #8,sp
  143. .endif_2:
  144.     tst.b    2+dest-static(a4)        ; if (dest[2])
  145.     beq.s    .endif_3
  146.     gemdos    Dcreate,dest-static(a4)        ;   Dcreate(dest);
  147. .endif_3:
  148.     gemdos    Malloc,?            ; buf_size=Malloc(-1l);
  149.     move.l    d0,buf_size-static(a4)
  150.     gemdos    Malloc,d0            ; buffer=Malloc(buf_size);
  151.     move.l    d0,buffer-static(a4)
  152.     bsr    copy_dir            ; if (copy_dir())
  153.     move.l    d0,d3
  154.     move    files-static(a4),-(sp)
  155.     bsr    showint8
  156.     addq    #2,sp
  157.     printi    <ESC,'K',' Files   successfully copied.',CR,LF>
  158.     move    folders-static(a4),-(sp)
  159.     bsr    showint8
  160.     addq    #2,sp
  161.     printi    <' Folders successfully copied.',CR,LF>
  162.     move.l    d3,d0
  163.     bpl.s    .endif_4
  164.     printi    CR,LF,'Press Return to continue.',CR,LF    ; { printf("\nWeiter mit Return.\n");
  165.     gemdos    Crawcin                ;   Cconin();
  166. .endif_4:                    ; }
  167.     printi    <'COPY: Folder copier now exiting.',CR,LF>
  168.     gemdos    Mfree!_IND,buffer-static(a4)    ; Mfree(buffer);
  169.     unlk    a6                ;}
  170.     rts
  171. ;
  172. ;
  173. copy_dir:    ;copy_dir ()       /* source und dest sind global; bei Fehler: return (1) */
  174.     RSRESET
  175. .source_len    rs.w    1
  176. .dest_len    rs.w    1
  177. .fd_source    rs.w    1
  178. .fd_dest    rs.w    1
  179. .error        rs.w    1
  180. .dta        rs.b    44
  181. .old_dta    rs.l    1
  182. .fail        rs.l    1
  183. .size        rs.l    1
  184. .count        rs.l    1
  185. .aut2        rs.l    2
  186. ;NB: if arguments were used they would be declared here, below .aut2
  187.     link    a6,#-.aut2
  188.     clr    .error-.aut2(a6)        ; error=0;
  189.     pea    source-static(a4)
  190.     bsr    strlen
  191.     addq    #4,sp
  192.     move    d0,.source_len-.aut2(a6)    ; source_len=strlen(source);
  193.     subq    #1,d0
  194.     cmpi.b    #'\',source-static(a4,d0)
  195.     bne.s    .keep_source_len
  196.     move    d0,.source_len-.aut2(a6)
  197.     clr.b    source-static(a4,d0)
  198. .keep_source_len:                ;URA: Now ignores final source '\'
  199.     pea    starpstar-static(a4)
  200.     pea    source-static(a4)
  201.     bsr    strcat                ; strcat(source,"\\*.*");
  202.     addq    #8,sp
  203.     pea    dest-static(a4)
  204.     bsr    strlen
  205.     addq    #4,sp
  206.     move    d0,.dest_len-.aut2(a6)        ; dest_len=strlen(dest);
  207.     subq    #1,d0
  208.     cmpi.b    #'\',dest-static(a4,d0)
  209.     bne.s    .keep_dest_len
  210.     move    d0,.dest_len-.aut2(a6)
  211.     clr.b    dest-static(a4,d0)
  212. .keep_dest_len:                ;URA: Now ignores final dest '\'
  213.     gemdos    Fgetdta
  214.     move.l    d0,.old_dta-.aut2(a6)        ; old_dta=Fgetdta();
  215.     gemdos    Fsetdta,.dta-.aut2(a6)        ; Fsetdta(dta);
  216.     gemdos    Fsfirst,source-static(a4),#$10
  217.     move.l    d0,.fail-.aut2(a6)        ; fail=Fsfirst(source,16);
  218.     move    .source_len-.aut2(a6),a0
  219.     clr.b    source-static(a4,a0)        ; source[source_len]=0;
  220. .while_beg_1:
  221.     tst.l    .fail-.aut2(a6)            ; while (!fail)
  222.     bne    .while_end_1            ; {
  223.     pea    slash-static(a4)
  224.     pea    source-static(a4)
  225.     bsr    strcat                ;   strcat(source,"\\");
  226.     addq    #8,sp
  227.     pea    30+.dta-.aut2(a6)
  228.     pea    source-static(a4)
  229.     bsr    strcat                ;   strcat(source,dta+30);
  230.     addq    #8,sp
  231.     pea    slash-static(a4)
  232.     pea    dest-static(a4)
  233.     bsr    strcat                ;   strcat(dest,"\\");
  234.     addq    #8,sp
  235.     pea    30+.dta-.aut2(a6)
  236.     pea    dest-static(a4)
  237.     bsr    strcat                ;   strcat(dest,dta+30);
  238.     addq    #8,sp
  239.     btst    #4,21+.dta-.aut2(a6)        ;   if (dta[21]==16)   /* Directory */
  240.     beq.s    .else_1                ;   {
  241. .doif_1:
  242.     move.l    30+.dta-.aut2(a6),d0
  243.     clr.b    d0
  244.     swap    d0
  245.     cmpi    #'.'<<8,d0            ;     if (strcmp(dta+30,".")
  246.     beq.s    .endif_2
  247.     cmpi.l    #'..',d0            ;         && strcmp(dta+30,".."))
  248.     beq.s    .endif_2            ;     {
  249. .doif_2:
  250.     gemdos    Dcreate,dest-static(a4)        ;       if (Dcreate(dest))
  251.     tst.l    d0
  252.     beq.s    .else_3                ;       {
  253. .doif_3:
  254.     printi    <"Can't create folder: ">    ;         printf("Ordner %s läßt sich nicht"
  255.     prints    dest-static(a4)            ;                " anlegen.\n",dest);
  256.     prints    crlf-static(a4)
  257.     move    #-1,.error-.aut2(a6)        ;         error=1;
  258.     bra.s    .endif_3            ;       }
  259. .else_3:                    ;       else
  260.     bsr    copy_dir            ;       { error|=copy_dir(source,dest);
  261.     or    d0,.error-.aut2(a6)
  262. ;NB: ERROR in original source, copy_dir has NO defined arguments  (but no harm done!)
  263.     tst    d0
  264.     bmi.s    .endif_3
  265.     addq    #1,folders-static(a4)
  266. .endif_3:                    ;       }
  267. .endif_2:                    ;     }
  268.     bra    .endif_1            ;   }
  269. .else_1:                    ;   else       /* File */
  270.     printi    <ESC,'K'>
  271.     prints    source-static(a4)        ;   { printf("%s  nach  %s\n",source,dest);
  272.     printi    <HT,'  ==>>',HT>
  273.     prints    dest-static(a4)
  274.     prints    crlf-static(a4)
  275.     printi    <ESC,'A'>        ;avoid filling screen
  276.     gemdos    Fopen,source-static(a4),!
  277.     move    d0,.fd_source-.aut2(a6)
  278.     bpl.s    .else_4                ;     if ((fd_source=Fopen(source,0))<0)
  279. .doif_4:
  280.     printi    <"Can't open file ">        ;     { printf("Datei %s läßt sich nicht"
  281.     prints    source-static(a4)        ;              " öffnen.\n",source);
  282.     prints    crlf-static(a4)
  283.     move    #-1,.error-.aut2(a6)        ;       error=1;
  284.     bra    .endif_4            ;     }
  285. .else_4:                    ;     else
  286.     gemdos    Fcreate,dest-static(a4),!
  287.     move    d0,.fd_dest-.aut2(a6)
  288.     bpl.s    .else_5                ;     { if ((fd_dest=Fcreate(dest,dta[21]&~1))<0)
  289. .doif_5:
  290.     printi    <"Can't create file ">        ;       { printf("Datei %s läßt sich nicht"
  291.     prints    dest-static(a4)            ;                " einrichten.\n",dest);
  292.     prints    crlf-static(a4)
  293.     move    #-1,.error-.aut2(a6)        ;         error=1;
  294.     bra    .endif_5            ;       }
  295. .else_5:                    ;       else
  296.     move.l    dta_fsize+.dta-.aut2(a6),.size-.aut2(a6)
  297. ;                        ;       { size=*(long*)(dta+26);
  298. .while_beg_2:
  299.     tst.l    .size-.aut2(a6)            ;         while (size)
  300.     beq    .while_end_2
  301.     move.l    .size-.aut2(a6),d0        ;         {
  302.     cmp.l    buf_size-static(a4),d0
  303.     bls.s    .min_size
  304.     move.l    buf_size-static(a4),d0
  305. .min_size:
  306.     move.l    d0,.count-.aut2(a6)        ;           count=(size<buf_size)?size:buf_size;
  307.     sub.l    d0,.size-.aut2(a6)        ;           size-=count;
  308.     gemdos    Fread!_IND,.fd_source-.aut2(a6),.count-.aut2(a6),buffer-static(a4)
  309.     cmp.l    .count-.aut2(a6),d0        ;           if (Fread(fd_source,count,buffer)!=count)
  310.     beq.s    .endif_6
  311. .doif_6:                    ;           {
  312.     printi    <'Error while reading file '>    ;             printf("Fehler beim Lesen von"
  313.     prints    source-static(a4)        ;                    " %s .\n",source);
  314.     prints    crlf-static(a4)
  315.     move    #-1,.error-.aut2(a6)        ;             error=1;
  316.     bra    .while_end_2            ;             break;
  317. .endif_6:                    ;           }
  318.     gemdos    Fwrite!_IND,.fd_dest-.aut2(a6),.count-.aut2(a6),buffer-static(a4)
  319.     cmp.l    .count-.aut2(a6),d0        ;           if (Fwrite(fd_dest,count,buffer)!=count)
  320.     beq.s    .endif_7
  321. .doif_7:                    ;           {
  322.     printi    <'Error while WRITING file '>    ;             printf("Fehler beim Schreiben von"
  323.     prints    dest-static(a4)        ;                    " %s .\n",dest);
  324.     prints    crlf-static(a4)
  325.     move    #-1,.error-.aut2(a6)        ;             error=1;
  326.     bra    .while_end_2            ;             break;
  327. .endif_7:                    ;           }
  328.     bra    .while_beg_2
  329. .while_end_2:                    ;         }
  330.     gemdos    Fclose,.fd_source-.aut2(a6)    ;         Fclose(fd_source);
  331.     gemdos    Fclose,.fd_dest-.aut2(a6)    ;         Fclose(fd_dest);
  332.     gemdos    Fopen,dest-static(a4),#1    ;         fd_dest=Fopen(dest,1);
  333.     move.l    d0,d3
  334.     gemdos    Fdatime,22+.dta-.aut2(a6),d3,#1    ;         Fdatime(fd_dest,dta+22,1);
  335.     gemdos    Fclose,d3            ;         Fclose(fd_dest);
  336.     addq    #1,files-static(a4)
  337. .endif_5:                    ;       }
  338. .endif_4:                    ;     }
  339. .endif_1:                    ;   }
  340.     move    .source_len-.aut2(a6),d0
  341.     clr.b    source-static(a4,d0)        ;   source[source_len]=0;
  342.     move    .dest_len-.aut2(a6),d0
  343.     clr.b    dest-static(a4,d0)        ;   dest[dest_len]=0;
  344.     gemdos    Fsnext
  345.     move.l    d0,.fail-.aut2(a6)        ;   fail=Fsnext();
  346.     bra    .while_beg_1
  347. .while_end_1:                    ; }
  348.     cmpi.l    #-49,.fail-.aut2(a6)        ;   if (fail!=-49l)
  349.     beq.s    .endif_8            ;   {
  350. .doif_8:
  351.     printi    <"Can't find folder ">        ;     printf("Ordner %s nicht gefunden.\n",source);
  352.     prints    source-static(a4)
  353.     prints    crlf-static(a4)
  354.     move    #-1,.error-.aut2(a6)        ;     error=1;
  355. .endif_8:                    ;   }
  356.     gemdos    Fsetdta!_IND,.old_dta-.aut2(a6)    ;   Fsetdta(old_dta);
  357.     move    .error-.aut2(a6),d0        ;   return (error);
  358.     ext.l    d0
  359. .fnend_dir_copy:
  360.     unlk    a6                ;}
  361.     rts
  362. ;
  363. ;
  364. strlen:
  365.     movea.l    4(sp),a0
  366.     move    #256-1,d0        ;limit test
  367. .loop:
  368.     tst.b    (a0)+
  369.     dbeq    d0,.loop
  370.     subq.l    #1,a0
  371.     sub.l    4(sp),a0
  372.     move.l    a0,d0
  373.     rts
  374. ;
  375. ;
  376. strcpy:
  377.     movea.l    4(sp),a1
  378.     movea.l    8(sp),a0
  379.     move    #255-1,d0        ;limit move
  380. .loop:
  381.     move.b    (a0)+,(a1)+
  382.     dbeq    d0,.loop
  383.     beq.s    .exit
  384.     clr.b    (a1)
  385. .exit:
  386.     rts
  387. ;
  388. ;
  389. strcat:
  390.     movea.l    4(sp),a1
  391.     movea.l    8(sp),a0
  392.     move    #255-1,d0        ;limit test & move
  393. .loop_1:
  394.     tst.b    (a1)+
  395.     dbeq    d0,.loop_1
  396.     bne.s    .exit
  397.     subq    #1,a1
  398. .loop:
  399.     move.b    (a0)+,(a1)+
  400.     dbeq    d0,.loop
  401.     beq.s    .exit
  402.     clr.b    (a1)
  403. .exit:
  404.     rts
  405. ;
  406. ;
  407. showint8:
  408.     link    a6,#-10
  409.     clr.l    d2
  410.     move.w    8(a6),d2
  411.     lea    (a6),a0
  412.     clr.b    -(a0)
  413. .loop_1:
  414.     divu    #10,d2
  415.     swap    d2
  416.     addi.b    #'0',d2
  417.     move.b    d2,-(a0)
  418.     clr    d2
  419.     swap    d2
  420.     bne.s    .loop_1
  421.     lea    -9(a6),a1
  422. .loop_2:
  423.     move.b    #' ',-(a0)
  424.     cmpa.l    a1,a0
  425.     bgt.s    .loop_2
  426.     gemdos    Cconws,(a0)
  427.     unlk    a6
  428.     rts
  429. ;
  430. ;
  431.     end    ;of file:    COPY.S