/* to complile:
   cc SaveDelete
   ln SaveDelete -lc
*/

#define SIGBREAKF_CTRL_C (1L << 12)
#define NULL 0L

char buffer[100],*position,*rindex();

struct Library       *DosBase;
char                 *filename;
void                 *OpenLibrary();

#asm
      cseg
      public    _restore
_restore:
      move.l   _DosBase,a6    
      move.l   #$70f7,d0     
      move.w   d0,-72(a6)
      move.l   #$60000092,d0
      move.l   d0,-70(a6)
      rts
#endasm


void SaveDelete()
{
#asm
   public _geta4
   movem.l  d0-d7/a0-a6,-(sp)
   jsr _geta4
   move.l   d1,_filename
#endasm
   ;
   position = rindex(filename,'/');
   if (position == NULL) position = rindex(filename,':');
   if (position == NULL) position = filename; else position++;
   strcpy(buffer,"Trash:");
   strcat(buffer,position);
   restore();
   if (strncmp("TRASH:",filename,6) != 0) 
     {
     DeleteFile(buffer);
     if (!Rename(filename,buffer)) DeleteFile(filename);
     }
   else DeleteFile(filename);
   SetFunction(DosBase, -72L, &SaveDelete); 
   
#asm
      movem.l  (sp)+,d0-d7/a0-a6
#endasm
}
      

/* test_sd() tests the DeleteFile vector to see if SaveDelete is already 
   installed. Returns zero if SaveDelete is installed, one if it is not.
*/
#asm
      public   _test_sd
_test_sd:
      clr.w    d0
      move.l   _DosBase,a6
      cmpi.l   #$60000092,-70(a6)
      bne.s    _yes
      moveq    #1,d0
_yes:
      rts   
#endasm

void _main()
{
   DosBase = (struct Library *) OpenLibrary("dos.library",0L);
   if (test_sd())
    {   SetFunction(DosBase, -72L, &SaveDelete); 
        Wait(SIGBREAKF_CTRL_C);
        restore();
    }
   CloseLibrary(DosBase);
}
