/* * ARP interface (ARPLOAD, ARPSAVE) */ #include "defs.h" void fixfile(); void splitpath(); void do_arpinsfile() { char file[64]; char dir[64]; long oldlock = CurrentDir(Ep->dirlock); splitpath(Ep->Name, file, dir); if (arpreq("INSERTFILE", file, dir, NULL)) { CurrentDir(oldlock); fixfile(file, dir); av[0] = (ubyte *)"i"; av[1] = (ubyte *)file; do_edit(); return; } CurrentDir(oldlock); } void do_arpload() { char file[64]; char dir[64]; long oldlock = CurrentDir(Ep->dirlock); splitpath(Ep->Name, file, dir); if (arpreq("NEWFILE", file, dir, NULL)) { long newlock; if (newlock = Lock(dir, SHARED_LOCK)) { UnLock(CurrentDir(oldlock)); Ep->dirlock = newlock; /* fixfile(file,dir); */ av[0] = (ubyte *)"n"; av[1] = (ubyte *)file; do_edit(); return; } } CurrentDir(oldlock); } void do_arpsave() { char file[64]; char dir[64]; long oldlock = CurrentDir(Ep->dirlock); splitpath(Ep->Name, file, dir); if (arpreq("SAVEAS", file, dir, NULL)) { CurrentDir(oldlock); fixfile(file,dir); av[1] = (ubyte *)file; do_saveas(); } else { CurrentDir(oldlock); } } void fixfile(file,dir) register char *file,*dir; { register char *ptr; register short len = strlen(dir); char hasdev = 0; /* * do we need to add a slash to the directory spec? */ if (len && dir[len-1] != '/' && dir[len-1] != ':') { dir[len++] = '/'; dir[len] = 0; } /* * Is file spec really a full path spec? */ for (ptr = file; *ptr; ++ptr) { if (ptr[0] == ':') hasdev = 1; } if (!hasdev) { BMov(file,file+len,strlen(file)+1); BMov(dir,file,len); } } /* * Search backwards for first ':' or '/' and split path there. * This subroutine may appear to be coded incorrectly to a novice * programmer. It isn't [now]. */ void splitpath(name, file, dir) register char *name; char *file, *dir; { register short i; for (i = strlen(name); i >= 0; --i) { /* was (incorrectly) "i > 0" */ if (name[i] == ':' || name[i] == '/') break; } ++i; strcpy(file, name + i); BMov(name, dir, i); dir[i] = 0; }