Path: utzoo!utgpu!watserv1!watmath!att!linac!uwm.edu!spool.mu.edu!samsung!uakari.primate.wisc.edu!news.larc.nasa.gov!amiga-request From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) Newsgroups: comp.sources.amiga Subject: v91i101: virt alpha - virtual device driver, Part02/04 Message-ID: Date: 8 May 91 00:50:19 GMT References: Reply-To: grahamw@cpsc.ucalgary.ca (William Graham) Lines: 1389 Approved: tadguy@uunet.UU.NET (Tad Guy) X-Mail-Submissions-To: amiga@uunet.uu.net X-Post-Discussions-To: comp.sys.amiga.misc Submitted-by: grahamw@cpsc.ucalgary.ca (William Graham) Posting-number: Volume 91, Issue 101 Archive-name: devices/virt-alpha/part02 #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'learn.asm' <<'END_OF_FILE' X Xr_mine equr d0 X X;learn.asm X; A robust utility to copy all the qualities of a file X; other than the contents to another file. Acts X; exactly like a copy command (because the poor thing once X; was a copy command...). Accepts wildcards, handles X; sub directories. X; X; (used to be ARP copy, before RESOURCE and ANSELM got to it...) X X X XLEARN = 1 ; do my version, or else just do ordinary ARP cp X ; (if unset will compile so closely that "diff" can't detect any diff.) X X;COALESCE = 1 X X; X; The Arp Copy Command as bastardized by Yours Truly X; X; (Source code fd-generated from Resource) X; Jan 19 1991 AH X; X; Compilation generated with genim2 X; X; "Diff" verified that there is no difference between X; this resourced and recompiled version, and the original X; (with the LEARN flag unset) X; X; acts as normal, but if name of command is "learn" X; or some such thing then it outputs smart info... X; X X;a little talk about object oriented programming: X; X; qualitatively, what i am trying to do here - by tagging X; my little bit of code into the copy function - is to X; access the wildcard and file-pointing functionality X; of the copy function without having to force my code X; to have any particular awareness of it. X; X; this is representative of a dilemma in computer schlockience X; which is that there is no clear cut way of visible X; seperating the "strands" of functionality. Even C++ X; fails to address the issue. X; X; More and more as I program I see myself simply being X; a weaver, weaving together of strings of code from X; different functions, such that they run interleaved X; and perform my composite operation. X; X; the point is that it would be nice if I didn't have to X; do that. If i could access wildcarding, recursive X; directory searching, source file opening, dest X; file opening in an implicit manner, and allow my X; compiler to do the final weaving. It might mean X; a revolution as significant as the spinning jenny. X; X X X X X IFND EXEC_TYPES_I XEXEC_TYPES_I SET 1 XEXTERN_LIB MACRO X XREF _LVO\1 X ENDM XSTRUCTURE MACRO X\1 EQU 0 XSOFFSET SET \2 X ENDM XBOOL MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XBYTE MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+1 X ENDM XUBYTE MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+1 X ENDM XWORD MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XUWORD MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XSHORT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XUSHORT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XLONG MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XULONG MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XFLOAT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XAPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XCPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+4 X ENDM XRPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+2 X ENDM XSTRUCT MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2 X ENDM XLABEL MACRO X\1 EQU SOFFSET X ENDM XBITDEF MACRO * X BITDEF0 \1,\2,B_,\3 X\@BITDEF SET 1<<\3 X BITDEF0 \1,\2,F_,\@BITDEF X ENDM XBITDEF0 MACRO * X\1\3\2 EQU \4 X ENDM XLIBRARY_VERSION EQU 33 X ENDC EXEC_TYPES_I X X XZAPTR MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*4 X ENDM X XZLONG MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*4 X ENDM X XZDOUB MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*8 X ENDM X XZWORD MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2*2 X ENDM X XZBYTE MACRO X\1 EQU SOFFSET XSOFFSET SET SOFFSET+\2 X ENDM X X X; IFD LEARN X Xmax_PathLen equ 1024 Xmax_CommentLen equ 80 X X ; X ; Virtual Info Block Aggregate X ; X ; An attempt to store all possible evidence required to X ; positively identify a specific instance of a file. X ; X ; This includes the physical media block number and X ; other static absolutes. X ; X ; This also includes looking at the file to determine X ; overt file type if any, TEXT,IFF,ARC etc. X ; X ; If a file is flagged as in an archive then the name of X ; that archive is added to the path just prior to the filename. X ; X ; If an entire physical media is to be remembered, then X ; whatever positive identification is stored about that media. X ; X X X STRUCTURE DateStamp,0 X LONG ds_Days X LONG ds_Minute X LONG ds_Tick X LABEL ds_SIZEOF X X STRUCTURE FileInfoBlock,0 X LONG fib_DiskKey ; device specific id? X LONG fib_DirEntryType ; < 0 = file, > 0 = directory X STRUCT fib_FileName,108 ; name X LONG fib_Protection ; sparwed X LONG fib_EntryType ; ??? X LONG fib_Size ; byte size X LONG fib_NumBlocks ; block size X STRUCT fib_DateStamp,ds_SIZEOF ; last date X STRUCT fib_Comment,80 ; null terminated comments X STRUCT fib_padding,36 ; unused X LABEL fib_SIZEOF X X X STRUCTURE VirtualInfoBlock,0 X LONG vir_MyID ; junk X X ; Used by COALESCE: X LONG vir_CheckSum ; Checksum of Entire File X LONG vir_Size ; File Byte Size X X ; Used by other junk: XCOALSIZE = 12 X X ZLONG vir_Type,2 ; BITDEFS (IFF/ZOO/NDOS...) X ZWORD vir_IncSum,8 ; Incremental checksums X X ; FIB (more or less): X ; File Positive ID: X LONG vir_DiskKey ; Disk Physical Address X LONG vir_DirEntryType ; < 0 = File, > 0 = Directory X LONG vir_Protection ; xSPARWED X LONG vir_EntryType ; ??? (why bother?) X X LONG vir_NumBlocks ; File Block Size X STRUCT vir_DateStamp,ds_SIZEOF ; File DateStamp X ; Volume Positive ID: X STRUCT vir_VolID,ds_SIZEOF ; Volume DateStamp Positive ID X LONG vir_VolType ; Volume Type X LONG vir_VolDiskType ; Volume Disk Type 'NDOS'... X ; Indeterminate Length Stuff: X LABEL vir_Path ; Device:path (may have spaces),0 X LABEL vir_Comments ; Comments if any,0 (terminate) X ; Align (always force even) X LABEL vir_SIZEOF ; Warning: Variable Size! X X; ENDC X X X_LVOAvailMem equ -$D8 ; exec X X_LVORead equ -$2A Xdat_SIZEOF equ $1A X_LVOExamine equ -$66 X_LVOUnLock equ -$5A X_LVOIsInteractive equ -$D8 X_LVOPathName equ -$14a X_LVODosFreeMem equ -$15C X_LVOArpExit equ -$17A X_LVOArpAlloc equ -$180 X_LVOArpOpen equ -$18C ; misc X_LVOArpQSort equ -$1aa X_LVOArpPMatch equ -$1b0 X_LVOFindFirst equ -$1B6 X_LVOFindNext equ -$1BC X_LVOAddDANode equ -$1FE X_LVOWrite equ -$30 X_LVOPuts equ -$F0 X_LVODeleteFile equ -$48 X_LVOPrintf equ -$E4 X_LVOOpenLibrary equ -$228 X_LVOFreeTrackedItem equ -$1E0 Xan_SIZEOF equ $14 X_LVOCheckAbort equ -$10E X_LVOGADS equ -$FC Xfr_SIZEOF equ $1A X_LVOIoErr equ -$84 X_LVOLock equ -$54 X_LVOAlert equ -$6C X_LVOFreeDAList equ -$1F8 X_LVOMakeLibrary equ -$54 X X********************************************************************** X XProgStart X movem.l d0/a0,-(sp) X lea arplibrary.MSG(pc),a1 X moveq #$1F,d0 X dc.w $2c78,$0004 ; move zero page (4) to a6 X jsr _LVOOpenLibrary(a6) X tst.l d0 X bne.s lbC000022 X addq.w #8,sp X move.l #$38036,d7 X jmp _LVOAlert(a6) ; arp missing? X XlbC000022 move.l d0,a6 X movem.l (sp),d0/a0 X lea -8(sp),sp X lea usageCopywild.MSG(pc),a1 X move.l sp,a2 X lea FROMTOAALLSQU.MSG(pc),a3 X jsr _LVOGADS(a6) ; parse! X tst.w d0 X lea usageCopywild.MSG(pc),a1 X ble lbC000210 X move.l 12(sp),d6 X add.l d6,d0 X moveq #0,d7 X move.l #$31C,d0 X X; a0 = base pointer X; d0 = number of elements in region to sort X; d1 = size of sorted elements in bytes? X; a1 = user function to perform the comparison X X jsr _LVOArpQSort(a6) X X rts X X jsr _LVOArpAlloc(a6) X move.l d0,a2 X moveq #$67,d2 X tst.l d0 X beq lbC000234 X move.l #$FF,$10(a2) X move.w #13,-2(a2) X move.l 4(sp),a5 X sub.l a4,a4 X move.l a5,a0 ; wildcard source XlbC000076 move.b (a0)+,d0 X beq.s lbC0000E2 ; parse done? X cmp.b #'#',d0 X bne.s lbC000090 X move.b (a0)+,d0 X beq.s lbC0000E2 X cmp.b #'?',d0 X bne.s lbC000090 X clr.b -2(a0) X bra.s lbC000096 XlbC000090 cmp.b #'*',d0 X bne.s lbC000076 XlbC000096 move.l a0,a4 ; handle wildcard source X clr.b -(a0) XlbC00009A move.l (sp),a0 X move.l a0,d0 X bne.s lbC0000A6 X lea lbB00045B(pc),a0 X move.l a0,(sp) XlbC0000A6 moveq #-$1,d5 X moveq #0,d1 XlbC0000AA moveq #0,d4 XlbC0000AC move.b (a0)+,d0 ; wildcard something or other X beq.s lbC0000DC ; done? X cmp.b #':',d0 X beq.s lbC0000A6 X cmp.b #'/',d0 X beq.s lbC0000A6 X cmp.b #'*',d0 X beq.s lbC0000D4 X cmp.b #'#',d0 X beq.s lbC0000CE X addq.l #1,d1 X addq.l #1,d4 X bra.s lbC0000AC XlbC0000CE tst.b (a0)+ X bne.s lbC0000D4 X subq.w #1,a0 XlbC0000D4 tst.l d5 X bpl.s lbC0000AA X move.l d1,d5 X bra.s lbC0000AA X X X XlbC0000DC tst.l d5 X blt.s lbC00010E X bra.s lbC000112 X XlbC0000E2 move.l a5,d1 ; lock or file X moveq #-$2,d2 X jsr _LVOLock(a6) ; thing exists? X move.l d0,d1 X beq.s lbC00009A ; ??? X move.l d1,d3 X lea $14(a2),a0 X move.l a0,d2 X jsr _LVOExamine(a6) ; examine thing X tst.l d0 X beq.s lbC000108 ; failed? X tst.l $18(a2) X blt.s lbC000108 ; file or dir check??? X move.w #$FFFF,d7 XlbC000108 move.l d3,d1 X jsr _LVOUnLock(a6) XlbC00010E moveq #0,d4 X moveq #0,d5 XlbC000112 move.l (sp),d0 X move.l a2,a0 X jsr _LVOFindFirst(a6) X move.l (a2),d3 X bne.s lbC000120 X moveq #1,d6 XlbC000120 move.l d0,d2 ; build dir X bne.s lbC000150 X bsr.s lbC00017A X lea $318(a2),a1 X lea $118(a2),a0 X moveq #0,d1 X tst.l $18(a2) X blt.s lbC00013C X tst.l d3 X bne.s lbC000146 X moveq #1,d1 XlbC00013C moveq #0,d0 X jsr _LVOAddDANode(a6) X tst.l d0 X beq.s lbC00014E XlbC000146 move.l a2,a0 X jsr _LVOFindNext(a6) X bra.s lbC000120 ; end loop X XlbC00014E moveq #$67,d0 XlbC000150 move.l d0,d2 X cmp.w #$E8,d2 X beq.s lbC000182 ; enter copy loop XlbC000158 move.l $318(a2),a1 X jsr _LVOFreeDAList(a6) X tst.w d2 X beq lbC000214 ; exit X lea Cantopens.MSG(pc),a0 ; failure, exit X cmp.w #$CD,d2 X bra failure X XlbC000172 jsr _LVOPuts(a6) ; some checkabort weird X moveq #0,d2 X bra.s lbC000158 X XlbC00017A lea lbC000172(pc),a1 ; checkabort X jmp _LVOCheckAbort(a6) X X X X ;---------------------------------------------------->>> XlbC000182 move.l $318(a2),d0 ; next! X beq lbC000214 ; exit X move.l d0,a3 X bsr.s lbC00017A ; check abort X lea 6(a3),a0 XlbC000192 move.l a0,a1 XlbC000194 move.b (a0)+,d0 ; end of string? X beq.s lbC0001A6 X cmp.b #'/',d0 X beq.s lbC000192 ; skip crap, termstart X cmp.b #':',d0 X beq.s lbC000192 ; skip crap, termstart X bra.s lbC000194 ; skip crap X XlbC0001A6 move.l a1,-(sp) ; a1 = valid term start X lea $218(a2),a1 X move.l a5,a0 X bra.s lbC0001B4 ; enter "make dest term" X X X ; destination term = dest term + wildcard substitution...cool... X XlbC0001B0 move.b (a0)+,d0 X move.b d0,(a1)+ XlbC0001B4 tst.b (a0) ; copy to end of term X bne.s lbC0001B0 X move.l (sp)+,a0 X move.l d7,d1 ; something... X bne.s lbC0001E4 X move.l a4,d1 X beq.s lbC0001F4 X cmp.b #'/',d0 X beq.s lbC0001D0 X cmp.b #':',d0 X beq.s lbC0001D0 X add.w d5,a0 XlbC0001D0 move.b (a0)+,(a1)+ ; done? X bne.s lbC0001D0 X subq.w #1,a1 X move.l a4,a0 X tst.b (a0) X beq.s lbC0001DE X sub.w d4,a1 XlbC0001DE move.b (a0)+,(a1)+ X bne.s lbC0001DE X bra.s lbC0001F4 X XlbC0001E4 moveq #':',d0 X cmp.b -1(a1),d0 X beq.s lbC0001F0 X move.b #'/',(a1)+ XlbC0001F0 move.b (a0)+,(a1)+ X bne.s lbC0001F0 XlbC0001F4 lea 6(a3),a0 ; a0 = source name X lea $218(a2),a1 ; a1 = dest name X bsr DoCopy X move.l $318(a2),a1 X move.l (a1),$318(a2) X jsr _LVODosFreeMem(a6) X bra lbC000182 X ;----------------------------------------------------<<<< X X X;***************************************************************************** X;***************************************************************************** X;***************************************************************************** X;***************************************************************************** X X ; X ; exit stuff X ; X XlbC000210 jsr _LVOPuts(a6) ; success XlbC000214 moveq #0,d0 XlbC000216 jsr _LVOArpExit(a6) ; bye Xfailure lea Cantopens.MSG(pc),a4 ; failure XlbC00021E jsr _LVOIoErr(a6) X move.l d0,d2 XlbC000224 move.l $318(a2),a1 X jsr _LVOFreeDAList(a6) X move.l a4,a0 X move.l sp,a1 X jsr _LVOPrintf(a6) XlbC000234 moveq #$14,d0 X bra.s lbC000216 X Xfailure100 lea Outofmemory.MSG(pc),a4 ; failure X moveq #$67,d2 X bra.s lbC000224 X Xfailure200 lea Cantopens.MSG(pc),a4 ; failure X addq.w #4,sp X bra.s lbC00021E X Xfailure300 lea s.MSG(pc),a0 ; aborted X moveq #0,d0 XlbC00024E move.l a1,-(sp) X move.l sp,a1 X move.l d0,d2 X jsr _LVOPrintf(a6) X addq.w #8,sp X move.l a5,a1 X jsr _LVOFreeTrackedItem(a6) X move.l (sp),d1 X jsr _LVODeleteFile(a6) X lea Destinationfi.MSG(pc),a4 X bra.s lbC000224 X Xfailure500 jsr _LVOIoErr(a6) ; failure X lea Errorwritings.MSG(pc),a0 X move.l 4(sp),a1 X bra.s lbC00024E X Xfailure400 jsr _LVOIoErr(a6) ; failure X lea Errorreadings.MSG(pc),a0 X move.l (sp),a1 X bra.s lbC00024E X X X X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X; start of modified zone jan 19 91 AH all mods are enclosed by >>><<< X X ; a0 = source name X ; a1 = dest name XDoCopy move.l d5,-(sp) X movem.l a0/a1/a3-a5,-(sp) X tst.l d6 X bne.s DoCopy100 ; say stupid message? X move.l sp,a1 X lea s.MSG0(pc),a0 ; say " c:gumby..." X jsr _LVOPrintf(a6) X ; get file size X ; d0 = lock XDoCopy100 move.l (sp),d1 ; d1 = name X moveq #-$2,d2 ; d2 = mode X jsr _LVOLock(a6) ; d0 < lock or fail X move.l d0,d1 ; d1 = lock X beq failure X move.l d0,-(sp) X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN X X ; X ; Given Lock: X ; X ; GET PATH X ; X ; GET VOLUME_NODE (the devices) -> DATESTAMP (for Positive ID) X ; X ; X X ;Length = PathName(Lock, Destination, NumberNames) X ; D0 D0 A0 D1 X X ; Get Path: X ; d0 = lock X lea PathBuffer(pc),a0 ; a0 = dest X move.l #max_PathLen/32,d1 ; d1 = max paths (16 of em) X jsr _LVOPathName(a6) X lea PathSuccess(pc),a0 X move.l d0,(a0) ; save success state + size X ; Alternatively ARP discusses a technique of retrieving the X ; File Path by setting AP_LENGTH to declare AP_BUF space post FIB X ; (but I don't feel like doing that) X ; Extract some junk from Lock: X move.l (sp),a1 ; A1 = Lock << APTR X add.l a1,a1 X add.l a1,a1 X lea VIB(pc),a0 X ;move.l 4(a1),vir_DiskKey(a0) ; DiskBlock (done later also) X move.l 16(a1),a1 ; A1 = Volume Node << APTR X add.l a1,a1 X add.l a1,a1 X move.l 4(a1),vir_VolType(a0) ; Volume->Type (must == 2!) X move.l 16(a1),vir_VolID(a0) ; Volume->VolDays X move.l 20(a1),vir_VolID+4(a0) X move.l 24(a1),vir_VolID+8(a0) X move.l 64(a1),vir_VolDiskType(a0) ; Volume->DiskType X X move.l (sp),d0 ; (restore) X move.l d0,d1 ; (restore) X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X ; d1 = Lock X lea $14(a2),a0 ; (that weird arp thing) X move.l a0,d2 ; d2 = FIB X jsr _LVOExamine(a6) X move.l (sp),d1 X move.l d0,(sp) X jsr _LVOUnLock(a6) X move.l (sp)+,d0 X beq failure X X move.l $90(a2),d5 ; d5 = sizeof file (max ram) X ble failure X X IFD COALESCE X move.l #COALSIZE,d5 ; all i need X move.l d5,$90(a2) X ENDC X X move.l #$20001,d1 ; get some ram X move.l a6,-(sp) X dc.w $2c78,$0004 ; move zero page (4) to a6 X jsr _LVOAvailMem(a6) X move.l (sp)+,a6 X lsr.l #1,d0 X sub.l #$1388,d0 X move.l #$3D0,d1 X cmp.l d1,d0 X bgt.s 1$ X move.l d1,d0 X1$ cmp.l d0,d5 X blt.s 2$ X move.l d0,d5 X2$ move.l d5,d0 X X ; COALESCE just needs to open a tiny bit of the file to X ; examine its checksum and size info for validity... X ; but must be at least this size! X X IFD COALESCE X cmp.l #COALSIZE,d0 X bne failure100 X ENDC X X jsr _LVOArpAlloc(a6) X tst.l d0 X beq failure100 X X move.l d0,a3 X move.l (sp),d1 X move.l #1005,d2 ; open old X jsr _LVOArpOpen(a6) X tst.l d0 X beq failure X move.l a1,a4 X move.l 4(sp),d1 X move.l #1006,d2 ; open new X X IFD COALESCE X move.l #1005,d2 ; (coalesce just compares) X ENDC X X jsr _LVOArpOpen(a6) X move.l d0,d1 X beq failure200 X move.l a1,a5 X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN X lea csumstuff(pc),a1 ; wipe csums for new file X clr.l (a1) X clr.l 4(a1) X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X ; loop... copy it XDoCopy200 sub.l a1,a1 X jsr _LVOCheckAbort(a6) X tst.l d0 X bne failure300 X move.l (a4),d1 ; d1 = file handle X move.l a3,d2 ; d2 = dest ram X move.l d5,d3 ; d3 = max size X jsr _LVORead(a6) ; read from old X tst.l d0 X blt failure400 X beq DoCopy900 X move.l d0,d3 ; d3 = actual size got X sub.l a1,a1 X jsr _LVOCheckAbort(a6) X tst.l d0 ; d0 = actual size writ X bne failure300 X move.l (a5),d1 X ; d1 = file handle X ; d2 = source/dest ram X ; d3 = size X IFND COALESCE X IFND LEARN X jsr _LVOWrite(a6) ; write to new X cmp.l d0,d3 ; writ = wrot? X bne failure500 ; write error X ENDC X ENDC X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X; X; a truly crude coalesce routine X; X; later should rely on externally known virtual token rather X; than one imbedded in file X; X; and handle proper paths, and smarter messaging... X; X X IFD COALESCE X ; d1 = file handle X ; d2 = dest ram X ; d3 = size X lea somespace(pc),a0 X move.l a0,d2 X move.l #COALSIZE,d3 X jsr _LVORead(a6) ; didn't read enuf X cmp.l d0,d3 X bne failure500 X X movem.l d0-d3/a0-a1,-(a7) X X lea somespace(pc),a0 X move.l a3,d2 ; d2 = dest ram X cmp.l #'VIRT',(a3) ; src is virtual? X beq coal100 X move.l sp,a1 X lea srcnot(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 Xsrcnot dc.b "source file is not virtual\n",0 X even Xdestnot dc.b "dest file is not virtual\n",0 X even Xarediff dc.b "file x is different from file y\n",0 X even Xaresame dc.b "file x is same as file y\n",0 X even Xcoal100 cmp.l #'VIRT',(a0) ; dest is virtual? X beq.s coal200 X move.l sp,a1 X lea destnot(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 X Xcoal200 move.l vir_CheckSum(a0),d0 X cmp.l vir_CheckSum(a3),d0 X bne coal300 X move.l vir_Size(a0),d0 X cmp.l vir_Size(a3),d0 X beq coal400 Xcoal300 move.l sp,a1 X lea arediff(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 Xcoal400 move.l sp,a1 X lea aresame(pc),a0 X jsr _LVOPrintf(a6) X bra coal900 X Xcoal900 movem.l (a7)+,d0-d3/a0-a1 X bra DoCopy900 X X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN X; X; checksum a word every 4096 bytes or last, keep building long checksum X; output to file X; X; checksum is a cyclic redundancy checksum, in such a way that later on X; if i have one of the sources i wish to compare it against it can be X; "dismantled" and act as a "diff" (not quite a zero-sum-proof but...). X; X ; d1 = file handle X ; d2 = source ram X ; d3 = size X movem.l d0-d3/a0-a1,-(a7) X move.l d2,a0 X lea csumstuff(pc),a1 X movem.l (a1),d1/d2 X moveq #0,d0 X bra.s csum100 Xcsum800 move.b (a0)+,d0 ; read source X add.l d0,d2 ; add to csum X ror.b d1,d0 ; prevent additive swap errors X addq.l #1,d1 Xcsum100 dbf d3,csum800 X movem.l d1/d2,(a1) ; write csum X movem.l (a7)+,d0-d3/a0-a1 X move.l d3,d0 ; (feign _LVOWrite success) X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X X cmp.l $90(a2),d0 ; did it in one pass? wow! X bne DoCopy200 XDoCopy900 X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X; rather than copying the file, write out a virtual info block only. X X IFD LEARN X X ; add checksums X lea VIB(pc),a0 X move.l csumstuff+4(pc),vir_CheckSum(a0) X move.l csums(pc),vir_IncSum(a0) X move.l csums+4(pc),vir_IncSum+4(a0) X move.l csums+8(pc),vir_IncSum+8(a0) X move.l csums+12(pc),vir_IncSum+12(a0) X X ; do file info block stuff X lea $14(a2),A1 X move.l #'VIRT',vir_MyID(a0) X move.l fib_DiskKey(a1),vir_DiskKey(a0) X move.l fib_DirEntryType(a1),vir_DirEntryType(a0) X move.l fib_Protection(a1),vir_Protection(a0) X move.l fib_EntryType(a1),vir_EntryType(a0) X move.l fib_Size(a1),vir_Size(a0) X move.l fib_NumBlocks(a1),vir_NumBlocks(a0) X move.l fib_DateStamp(a1),vir_DateStamp(a0) X move.l fib_DateStamp+4(a1),vir_DateStamp+4(a0) X move.l fib_DateStamp+8(a1),vir_DateStamp+8(a0) X X ; path is already added X X ; Add Comments (after path) X lea vir_Path(a0),a0 X move.l PathSuccess(pc),d0 ; d0 <= max_Pathlen (invariant) X move.l #max_PathLen-1,d1 X cmp.l d1,d0 X bmi.s 0$ X move.l d1,d0 X0$ add.l d0,a0 ; get to end of path name X clr.b (a0)+ ; terminate path X lea fib_Comment(a1),a1 X moveq #max_CommentLen-2,d0 ; room is sufficient to hold me? X1$ move.b (a1)+,d1 X beq.s 2$ X move.b d1,(a0)+ X dbf d0,1$ X2$ clr.b (a0)+ ; terminate comments X X lea VIB(pc),a1 ; get size X sub.l a1,a0 X move.l a0,d3 X cmp.l #vir_SIZEOF+max_PathLen+max_CommentLen,d3 X bcc.s 3$ ; DEBUG X X ; Write Virtual stuff part X move.l (a5),d1 ; d1 = file handle X move.l a1,d2 ; d2 = source ram X jsr _LVOWrite(a6) ; d3 = length X cmp.l d3,d0 X bne failure500 X3$ X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X move.l a5,a1 X jsr _LVOFreeTrackedItem(a6) ; release dest X move.l a4,a1 X jsr _LVOFreeTrackedItem(a6) ; release src X move.l a3,a1 X jsr _LVOFreeTrackedItem(a6) ; release work RAM X tst.w d6 ; say stupid message? X bne.s 5$ X lea copiedtos.MSG(pc),a0 ; "...copied to x:dumby" X lea 4(sp),a1 X jsr _LVOPrintf(a6) X5$ movem.l (sp)+,a0/a1/a3-a5 X move.l (sp)+,d5 X rts X X X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X IFD LEARN XVIB dcb.b vir_SIZEOF,0 XPathBuffer dcb.b max_PathLen,0 XCommentsBuffer dcb.b max_CommentLen,0 XPathSuccess dc.l 0 ; success in building path? Xcsumstuff dc.l 0,0 ; counter.l, master checksum.l Xcsums dcb.w 8,0 ; incremental checksums.w X ENDC X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< X X X X IFD LEARN XusageCopywild.MSG dc.b 'usage: Learn (wildcards) [TO] (wildcards or dir' X ENDC X X IFND LEARN XusageCopywild.MSG dc.b 'usage: Copy (wildcards) [TO] (wildcards or dir' X ENDC X X dc.b ') [ALL] [QUIET]',0 XCantopens.MSG dc.b 'Can''t open %s',$A,0 XOutofmemory.MSG dc.b 'Out of memory',$A,0 XErrorreadings.MSG dc.b 10 X dc.b 'Error reading %s',$A,0 XErrorwritings.MSG dc.b 10 X dc.b 'Error writing %s',$A,0 XDestinationfi.MSG dc.b 'Destination file "%s" removed',$A,0 Xarplibrary.MSG dc.b 'arp.library',0,0 XFROMTOAALLSQU.MSG dc.b 'FROM,TO/A,ALL/S,QUIET/S' XlbB00045B dc.b 0 Xs.MSG dc.b 10 X dc.b '%s',$A,0 Xs.MSG0 dc.b ' %s..',0 X IFD LEARN Xcopiedtos.MSG dc.b 'learnt to %s',$A,0 X dc.b 0 X ENDC X IFND LEARN Xcopiedtos.MSG dc.b 'copied to %s',$A,0 X dc.b 0 X ENDC X X IFD COALESCE Xsomespace dcb.b COALSIZE,0 X ENDC X X END X X X;end of modified zone jan 19 91 AH X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X;****************************************************************************** X X X i need a utility which accepts a path, possibly wildcarded, and possibly X with "all" set, and that returns to me a lock on each file it finds in X turn. X X X END_OF_FILE if test 23663 -ne `wc -c <'learn.asm'`; then echo shar: \"'learn.asm'\" unpacked with wrong size! fi # end of 'learn.asm' fi if test -f 'virt_mean.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'virt_mean.uu'\" else echo shar: Extracting \"'virt_mean.uu'\" \(20996 characters\) sed "s/^X//" >'virt_mean.uu' <<'END_OF_FILE' Xbegin 666 virt_mean.wp XM@(`*"@K#`"H>PR)625(Z(B!4:&4@5FER='5A;"!$979I8V6#"@K#`"HGPZD@* XM;W(@J8,*"L,`*A_#(")0;V]R($UA;G,@1FQO<'1I8V%L(H,*"@H*"@H*"L,`7 XM*A[#4')O:F5C="!#;VYC97!T($1O8W5M96YT@PH*PP`J(\-">2!!;G-E;&T@R XM2&]O:X,*"L,`*B##3&%S="!%9&ET.B!&96(@-R`Q.3DQ@PH*"@H*4')O;&]G, XM=64Z"JFIJ:FIJ:FIJ0H*"51H:7,@<')O<&]S86P@8V]N=&%I;G,@87,@:71SW XM(&UA:6X@=&AE2P@87,@=V5L;"!A7!T*2X*"@E)(&1E9GD@64]5' XM+"!T:&4@2!S;V9T=V%R92P@86YD(&AA7-I8V%L(&UE9&EA(&]N('=H:6-H('1H92!F:6QE2!A9W)E960@=7!O;B!M971H;V0@9F]R#7)E^ XM9F5R:6YG('1O(&%N9"!R971R:65V:6YG(&]F9FQI;F4@;65D:6$N"@H)5')A% XM;G-P87)E;G0*":FIJ:FIJ:FIJ:FI"@H)5&AE(%9I7-T96T@8V%N#61E=&5C="!I="!I2!A('5S( XM97(@97AP;&EC:70-8V]M;6%N9"X@($ET('-T;W)E&-E<'1I;VX@;V8@=&AE(&9I;&4@8V]N=&5N=',@:71S96QF+B`@270@87-S' XM:6=N2!Y;W4@;W=N+@H*"4-O86QE6]U2!S:6YG;&4@9'5P;&EC871E+"!O<@UN96%R(&1U<&QI8V%T92!I;G-T< XM86YC92!O9B!E=F5R>2!F:6QE('1H870@>6]U)W9E(&5V97(@=&%U9VAT(&ETC XM+@I!;F0@8VAA:6X@86QL(&UU;'1I<&QE(')E9F5R96YC97,@=&\@;VYL>2!O) XM;F4@2`B4&QE87-E(&EN7-E;&8@;F5E9&EN9R!O"P@82=L82!.95A4+"!E>&-E<'0@2!E>&5C=71I;F<@=&AE(&YA;65D(&EC;VXN"@H)5&AE($YE! XM6%0@96YV:7)O;65N="!S=6-C97-S9G5L;'D@6EN9R!T:')O=6=H('1H96ER(&1A=&%S<&%C92P@=VET:"!A;&P@=&AE:7(@7 XM=&]O;',-:&%N9'D@;V9F('1O(&]N92!S:61E+B`@5VAE"!A;F0@9&%T87-P86-E(&%R92!M:7AE9"!U<"P@86YD#71H) XM92!P;V]R('5S97(@:7,@9F]R979E"!WJ XM;W5L9"!H879E(&$@<&]W97(@;V9F(&)U='1O;BP@=VAI8V@-=V]U;&0@:7-SC XM=64@86X@;W)C:&5S=')A=&5D('!O=V5R(&]F9B!R97%U97-T('1O('1H92!EK XM;G1I6]U2`H9&5G2!I2P@87,@=V5L( XM;"!A7!E(%5T:6QI=&EE'0@=&\@=&AE('1A:6P@;V8@=&AE(&UO0H)":FIJ:FIJ:FIJ0H*"4$@9&ESE XM:R!C;W!I97(@=&AA="!D:7-P96YS97,@=VET:"!T:&4@8V]M;6]N(&ED:6]C: XM>2!O9@UP&-E<'0@=&AA="!F97<@;W1H97(@" XM<&5O<&QE(&AA=F4@:&%D('1O(&9I9VAT('=I=&@@=&AOF4@82!P2X*"@E4:&ES(&ME>2!T:&5NY XM(&EN(&$@6-L:6-A;&QY(')U;B!L96YG=&@-96YC;V1E9"!A9V%I;G-T('1H92!P87-S[ XM=V]R9"!I="!B96-O;65S(&YO="!P;W-S:6)L92!T;R!S:6UP;'D-(G!A2!286YD>2!,: XM:6YD96XL(&%N9"!)(&AA=F4@8F5E;B!R=6YN:6YG(&ET(&9O65A0TQ,S`@;65G86)Y=&5S(&]F('%U87-IJ6QE9V%L(&-O9&4@=VET:&]U="!QA XM=6%L;2P@86YD($D@;&5A=F4-;W1H97(@<&5O<&QE(&%C8V5S2!CV XM;VUP=71E2!S96-U7!I;F<@97)R;W(@9&]E2!N=6UB97)S*2X*"@E)(&UE;G1I;VX@16YC71E2!U;F)E;&EE=F%B;&4@;W)G86YI>F%T:6]N86P@8V%T87-T7-T96T@;VX@5DE2.BP@86YD('EO=2=V92!P" XM97)F;W)M960@82!T;W1A;"!#3T%,15-#12!O;@UE=F5R>71H:6YG+B`@3F]WI XM('EO=2!W86YT('1O(&UA:V4@82`B6]U(&1O/R`-4VEM<&QY(&1R86<@=&AE(%9)4CH@9&5V:6-E[ XM(&EC;VX@;W9E2!P2!C;&5A;BP@86YD#7-H87)A8FQE.R!Y970@;F]TR XM(&)I>GIA2!O8F9U XM;W0@;V8@9&EF9F5R96YT($-O;7!A;FEE2!S965M#71O\ XM(&AA=F4@82!B860@:VYA8VL@;V8@8F%N:W)U<'1I;F<@86QL(&UY($5M<&QOJ XM>65R6]U(2`@22!T:&EN& XM:R!T:&%T($D@:&%V92!A('1E;F1E;F-Y('1O(&]V97)W:&5L;0UT:&5M('=I; XM=&@@:61E87,@86YD('1H97D@:G5S="!E>'!L;V1E(*D@;F%T=7)A;"!C875S2 XM97,N+BX*"@E"=70@8GD@=V]R:VEN9R!A="!S;R!M86YY(&1I9F9E2!E>&%C=&QY('1E8VAN:6-A;&QY('=H870@=&\@9&\@=&\@4 XM<'5T(&$@<')O9'5C=`UT;V=E=&AE2!I;G1E2!%9'5C871I;VXN"@H)22=M(&UO] XM2!))W9E(&)E96X@97AP;&]R:6YG('1H92!%249&O XM14P@3T]04R!S>7-T96TN"@H)5&AE(&ED96$@;V8@0UE"15)34$%#12!E>&-I5 XM=&5S(&UE+"!A;'1H;W5G:"!)(&)E;&EE=F4@=&AE#79E2!$96UO8W)A8WD@86)O=F4@` XM86YD(&)E>6]N9"!T:&4@:61E82!O9@U#>6)E6)E2!L:6ME('1H:7,@:&5L<"!M86YK:6YD(&-H87)T(&$@8V]U2!T96%C:&EN9RP@22!A;2!T>7!I8V%L;'D@82!F86ER2 XM;'D@<'5B;&EC('!E2P@6%N:V5D(&5D:71I;VYS*2!O2!!;6EG82!-87)K970N"@H)37D@9F%TG XM:&5R(&]W;G,@5&AE($-O;7!U=&5R(%-H;W`L($YO2!S96QF(&1E<')E8VEA=&EN9R!J;VMEB!+:61S+"!B=70@;F]W($DG;2!J4 XM=7-T(&]L9"$@($)U="!A="`R,R!Y96%R0H*"0D)"0D)"0D)"4%N2!-871E"`@*"!.3U0@24Y#3%5$140@*0H)<&EC='5R92!O' XM9B!A7-E;&8@86YD(&%NU XM;W1H97(@<')O9W)A;6UE2!S;VQD(#4P,#`P('5N:71S(&]F($UA2P@86YD('-I;F-E#71H97D@9&ED(&1I2`H=')A;G-I5 XM=&EV92!P2!O9B!F7=A>2!T;R!P. Mail comments to the moderator at . Post requests for sources, and general discussion to comp.sys.amiga.misc.