home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / text / editors / dme_441 / src / filereq.c < prev    next >
C/C++ Source or Header  |  1991-01-24  |  2KB  |  131 lines

  1.  
  2. /*
  3.  *  ARP interface (ARPLOAD, ARPSAVE)
  4.  */
  5.  
  6. #include "defs.h"
  7.  
  8. Prototype void do_arpinsfile (void);
  9. Prototype void do_arpload (void);
  10. Prototype void do_arpsave (void);
  11. Prototype void fixfile (char *, char *);
  12. Prototype void splitpath (char *, char *, char *);
  13.  
  14.  
  15. void
  16. do_arpinsfile()
  17. {
  18.     char file[64];
  19.     char dir[64];
  20.     BPTR oldlock = CurrentDir((BPTR)Ep->dirlock);
  21.  
  22.     splitpath(Ep->Name, file, dir);
  23.     if (arpreq("Insert File", file, dir, NULL)) {
  24.     CurrentDir(oldlock);
  25.     fixfile(file, dir);
  26.     av[0] = (ubyte *)"i";
  27.     av[1] = (ubyte *)file;
  28.     do_edit();
  29.     return;
  30.     }
  31.     CurrentDir(oldlock);
  32. }
  33.  
  34. void
  35. do_arpload()
  36. {
  37.     char file[64];
  38.     char dir[64];
  39.     BPTR oldlock = CurrentDir((BPTR)Ep->dirlock);
  40.  
  41.     splitpath(Ep->Name, file, dir);
  42.     if (arpreq("New File", file, dir, NULL)) {
  43.     BPTR newlock;
  44.     if (newlock = Lock(dir, SHARED_LOCK)) {
  45.         UnLock(CurrentDir(oldlock));
  46.         Ep->dirlock = (long)newlock;
  47.         /*
  48.         fixfile(file,dir);
  49.         */
  50.         av[0] = (ubyte *)"n";
  51.         av[1] = (ubyte *)file;
  52.         do_edit();
  53.         return;
  54.     }
  55.     }
  56.     CurrentDir(oldlock);
  57. }
  58.  
  59. void
  60. do_arpsave()
  61. {
  62.     char file[64];
  63.     char dir[64];
  64.     BPTR oldlock = CurrentDir((BPTR)Ep->dirlock);
  65.  
  66.     splitpath(Ep->Name, file, dir);
  67.     if (arpreq("Save File", file, dir, NULL)) {
  68.     CurrentDir(oldlock);
  69.     fixfile(file,dir);
  70.     av[1] = (ubyte *)file;
  71.     do_saveas();
  72.     } else {
  73.     CurrentDir(oldlock);
  74.     }
  75. }
  76.  
  77. void
  78. fixfile(file,dir)
  79. char *file,*dir;
  80. {
  81.     char *ptr;
  82.     short len = strlen(dir);
  83.     char hasdev = 0;
  84.  
  85.     /*
  86.      *    do we need to add a slash to the directory spec?
  87.      */
  88.  
  89.     if (len && dir[len-1] != '/' && dir[len-1] != ':') {
  90.     dir[len++] = '/';
  91.     dir[len] = 0;
  92.     }
  93.  
  94.     /*
  95.      *    Is file spec really a full path spec?
  96.      */
  97.  
  98.     for (ptr = file; *ptr; ++ptr) {
  99.     if (ptr[0] == ':')
  100.         hasdev = 1;
  101.     }
  102.     if (!hasdev) {
  103.     movmem(file,file+len,strlen(file)+1);
  104.     movmem(dir,file,len);
  105.     }
  106. }
  107.  
  108. /*
  109.  *  Search backwards for first ':' or '/' and split path there.
  110.  *  This subroutine may appear to be coded incorrectly to a novice
  111.  *  programmer.  It isn't [now].
  112.  */
  113.  
  114. void
  115. splitpath(name, file, dir)
  116. char *name;
  117. char *file, *dir;
  118. {
  119.     short i;
  120.  
  121.     for (i = strlen(name); i >= 0; --i) {       /* was (incorrectly) "i > 0" */
  122.     if (name[i] == ':' || name[i] == '/')
  123.         break;
  124.     }
  125.     ++i;
  126.     strcpy(file, name + i);
  127.     movmem(name, dir, i);
  128.     dir[i] = 0;
  129. }
  130.  
  131.