home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 171.lha / DME_v1.30 / Sources / filereq.c < prev    next >
C/C++ Source or Header  |  1988-04-28  |  3KB  |  151 lines

  1.  
  2. /*
  3.  *  ARP interface (ARPLOAD, ARPSAVE)
  4.  */
  5.  
  6. #include "defs.h"
  7.  
  8. void
  9. do_arpinsfile()
  10. {
  11.     char file[64];
  12.     char dir[64];
  13.  
  14.     splitpath(Ep->Name, file, dir);
  15.     if (arpreq("INSERTFILE", file, dir, NULL)) {
  16.     fixfile(file,dir);
  17.     av[0] = (ubyte *)"i";
  18.     av[1] = (ubyte *)file;
  19.     do_edit();
  20.     }
  21. }
  22.  
  23. void
  24. do_arpload()
  25. {
  26.     char file[64];
  27.     char dir[64];
  28.  
  29.     splitpath(Ep->Name, file, dir);
  30.     if (arpreq("NEWFILE", file, dir, NULL)) {
  31.     fixfile(file,dir);
  32.     av[0] = (ubyte *)"n";
  33.     av[1] = (ubyte *)file;
  34.     do_edit();
  35.     }
  36. }
  37.  
  38. void
  39. do_arpsave()
  40. {
  41.     char file[64];
  42.     char dir[64];
  43.  
  44.     splitpath(Ep->Name, file, dir);
  45.     if (arpreq("SAVEAS", file, dir, NULL)) {
  46.     fixfile(file,dir);
  47.     av[1] = (ubyte *)file;
  48.     do_saveas();
  49.     }
  50. }
  51.  
  52. fixfile(file,dir)
  53. register char *file,*dir;
  54. {
  55.     register char *ptr;
  56.     register short len = strlen(dir);
  57.     char hasdev = 0;
  58.  
  59.     /*
  60.      *    do we need to add a slash to the directory spec?
  61.      */
  62.  
  63.     if (len && dir[len-1] != '/' && dir[len-1] != ':') {
  64.     dir[len++] = '/';
  65.     dir[len] = 0;
  66.     }
  67.  
  68.     /*
  69.      *    Is file spec really a full path spec?
  70.      */
  71.  
  72.     for (ptr = file; *ptr; ++ptr) {
  73.     if (ptr[0] == ':')
  74.         hasdev = 1;
  75.     }
  76.     if (!hasdev) {
  77.     movmem(file,file+len,strlen(file)+1);
  78.     movmem(dir,file,len);
  79.     }
  80. }
  81.  
  82. /*
  83.  *  Search backwards for first ':' or '/' and split path there.
  84.  *  This subroutine may appear to be coded incorrectly to a novice
  85.  *  programmer.  It isn't [now].
  86.  */
  87.  
  88. splitpath(name, file, dir)
  89. register char *name;
  90. char *file, *dir;
  91. {
  92.     register short i;
  93.     for (i = strlen(name); i >= 0; --i) {       /* was (incorrectly) "i > 0" */
  94.     if (name[i] == ':' || name[i] == '/')
  95.         break;
  96.     }
  97.     ++i;
  98.     strcpy(file, name + i);
  99.     bmov(name, dir, i);
  100.     dir[i] = 0;
  101. }
  102.  
  103. #asm
  104.  
  105.         ;   arpreq(hail,file,dir,window)
  106.  
  107.         FAR DATA
  108.         FAR CODE
  109.  
  110.         public    _arpreq
  111.         public    _LVOOldOpenLibrary
  112.         public    _LVOCloseLibrary
  113.         public    _SysBase
  114.  
  115. _LVOFileRequest equ    -294
  116.  
  117. arp_name_text    dc.b 'arp.library',0
  118.  
  119. fs        ds.l    1   ;hailing text
  120.         ds.l    1   ;file name
  121.         ds.l    1   ;directory
  122.         ds.l    1   ;window requesting
  123.         ds.w    1   ;LONG Align, idiots!  set to 0
  124.         ds.l    1   ;func for wildcards
  125.         ds.l    1   ;func to call w/intuimessages
  126.  
  127. _arpreq:
  128.         lea.l    fs,A0
  129.         movem.l 4(sp),D0-D3             ;setup fields
  130.         movem.l D0-D3,(A0)
  131.         clr.w    fs+16
  132.         move.l    _SysBase,A6
  133.  
  134.         lea.l    arp_name_text,a1    ;open library
  135.         jsr    _LVOOldOpenLibrary(a6)
  136.         tst.l    d0
  137.         beq.s    done
  138.         move.l    d0,a6
  139.         lea.l    fs,a0
  140.         jsr    _LVOFileRequest(A6)     ;call requestor
  141.         move.l    D0,-(sp)                ;return value
  142.         move.l    A6,A1            ;CloseLibrary(arpbase)
  143.         move.l    _SysBase,A6
  144.         jsr    _LVOCloseLibrary(A6)
  145.         move.l    (sp)+,D0                ;return value
  146. done        rts
  147.  
  148. #endasm
  149.  
  150.  
  151.