This is path.c in view mode; [Download] [Up]
/* Directory and path functions
Copyright (C) 1992 Joseph H. Allen
This file is part of JOE (Joe's Own Editor)
JOE is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 1, or (at your option) any later version.
JOE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with
JOE; see the file COPYING. If not, write to the Free Software Foundation,
675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include "config.h"
#include "zstr.h"
#include "vs.h"
#include "va.h"
#include "tty.h"
#include "path.h"
#ifdef DIRENT
#include <dirent.h>
#else
#ifdef SYSDIRENT
#include <sys/dirent.h>
#else
#ifdef SYSDIR
#include <sys/dir.h>
#else
#ifdef BSDSYSDIR
#include <bsd/sys/dir.h>
#else
#ifndef __MSDOS__
#include "dir.c"
#endif
#endif
#endif
#endif
#endif
#ifdef junk
char *abspth(path)
char *path;
{
char *s=0;
int x=0;
int y;
if(path[0]=='/')
{
s=vsadd(s,'/');
while(path[x]=='/') ++x;
y=1;
}
else
{
if(!(s=pwd())) return 0;
s=vsncpy(NULL,0,sz(s));
if(s[1]) s=vsadd(s,'/');
y=sLEN(s);
}
while(path[x])
{
if(path[x]=='.' && (path[x+1]==0 || path[x+1]=='/'))
{
x+=1;
while(path[x]=='/') ++x;
continue;
}
if(path[x]=='.' && path[x+1]=='.' && (path[x+2]==0 || path[x+2]=='/'))
{
x+=2;
while(path[x]=='/') ++x;
if(y!=1)
{
--y;
while(s[y-1]!='/') --y;
}
continue;
}
do
s=vsset(s,y,path[x]), ++y, ++x;
while(path[x] && path[x]!='/');
s=vsset(s,y,'/'), ++y;
while(path[x]=='/') x++;
}
if(y!=1 && s[y-1]=='/') --y;
s=vstrunc(s,y);
return s;
}
#endif
char *ossep(path)
char *path;
{
int x;
for(x=0;path[x];++x)
#ifdef __MSDOS__
if(path[x]=='/') path[x]='\\';
#else
if(path[x]=='\\') path[x]='/';
#endif
return path;
}
char *joesep(path)
char *path;
{
int x;
for(x=0;path[x];++x) if(path[x]=='\\') path[x]='/';
return path;
}
char *namprt(path)
char *path;
{
char *z;
#ifdef __MSDOS__
if(path[0] && path[1]==':') path+=2;
#endif
z=path+slen(path);
while(z!=path && z[-1]!='/') --z;
return vsncpy(NULL,0,sz(z));
}
char *namepart(tmp,path)
char *tmp;
char *path;
{
char *z;
#ifdef __MSDOS__
if(path[0] && path[1]==':') path+=2;
#endif
z=path+zlen(path);
while(z!=path && z[-1]!='/') --z;
return zcpy(tmp,z);
}
char *dirprt(path)
char *path;
{
char *b=path;
char *z=path+slen(path);
#ifdef __MSDOS__
if(b[0] && b[1]==':') b+=2;
#endif
while(z!=b && z[-1]!='/') --z;
return vsncpy(NULL,0,path,z-path);
}
char *begprt(path)
char *path;
{
char *z=path+slen(path);
int drv=0;
#ifdef __MSDOS__
if(path[0] && path[1]==':') drv=2;
#endif
while(z!=path+drv && z[-1]=='/') --z;
if(z==path+drv) return vsncpy(NULL,0,sz(path));
else
{
while(z!=path+drv && z[-1]!='/') --z;
return vsncpy(NULL,0,path,z-path);
}
}
char *endprt(path)
char *path;
{
char *z=path+slen(path);
int drv=0;
#ifdef __MSDOS__
if(path[0] && path[1]==':') drv=2;
#endif
while(z!=path+drv && z[-1]=='/') --z;
if(z==path+drv) return vsncpy(NULL,0,sc(""));
else
{
while(z!=path+drv && z[-1]!='/') --z;
return vsncpy(NULL,0,sz(z));
}
}
int mkpath(path)
char *path;
{
char *s;
if(path[0]=='/')
{
if(chddir("/")) return 1;
s=path;
goto in;
}
while(path[0])
{
int c;
for(s=path;*s && *s!='/';s++);
c= *s; *s=0;
if(chddir(path))
{
if(mkdir(path,0777)) return 1;
if(chddir(path)) return 1;
}
*s=c;
in:
while(*s=='/') ++s;
path=s;
}
return 0;
}
/* Create a temporary file */
char *mktmp(where)
char *where;
{
static int seq=0;
char *name;
int fd;
if(!where) where=getenv("TEMP");
#ifdef __MSDOS__
if(!where) where="";
#else
if(!where) where="/tmp";
#endif
name=(char *)malloc(zlen(where)+16);
loop:
sprintf(name,"%s/J%d%d.tmp",where,seq= ++seq%1000,(unsigned)time(NULL)%1000);
ossep(name);
if((fd=open(name,O_RDONLY))!= -1)
{
close(fd);
goto loop;
}
if((fd=creat(name,0666))== -1) return 0;
else close(fd);
return name;
}
int rmatch(a,b)
char *a, *b;
{
int flag, inv, c;
for(;;)
switch(*a)
{
case '*': ++a;
do if(rmatch(a,b)) return 1; while(*b++);
return 0;
case '[': ++a;
flag=0;
if(*a=='^') ++a, inv=1; else inv=0;
if(*a==']') if(*b==*a++) flag=1;
while(*a && (c= *a++)!=']')
if(c=='-' && a[-2]!='[' && *a)
{ if(*b>=a[-2] && *b<=*a) flag=1; }
else if(*b==c) flag=1;
if((!flag && !inv) || (flag && inv) || !*b) return 0;
++b;
break;
case '?': ++a;
if(!*b) return 0;
++b;
break;
case 0: if(!*b) return 1;
else return 0;
default: if(*a++!=*b++) return 0;
}
}
int isreg(s)
char *s;
{
int x;
for(x=0;s[x];++x) if(s[x]=='*' || s[x]=='?' || s[x]=='[') return 1;
return 0;
}
#ifdef __MSDOS__
#include <dos.h>
#include <dir.h>
struct direct
{
char d_name[16];
} direc;
int dirstate=0;
struct ffblk ffblk;
char *dirpath=0;
void *opendir(path)
char *path;
{
dirstate=0;
return &direc;
}
void closedir()
{
}
struct direct *readdir()
{
int x;
if(dirstate)
{
if(findnext(&ffblk)) return 0;
}
else
{
if(findfirst("*.*",&ffblk,FA_DIREC))
return 0;
dirstate=1;
}
zcpy(direc.d_name,ffblk.ff_name);
for(x=0;direc.d_name[x];++x) direc.d_name[x]=todn(direc.d_name[x]);
return &direc;
}
#endif
char **rexpnd(word)
char *word;
{
void *dir;
char **lst=0;
#ifdef DIRENT
struct dirent *de;
#else
#ifdef SYSDIRENT
struct dirent *de;
#else
struct direct *de;
#endif
#endif
dir=opendir(".");
if(dir)
{
while(de=readdir(dir))
if(zcmp(".",de->d_name))
if(rmatch(word,de->d_name))
lst=vaadd(lst,vsncpy(NULL,0,sz(de->d_name)));
closedir(dir);
}
return lst;
}
int chpwd(path)
char *path;
{
#ifdef __MSDOS__
char buf[256];
int x;
if(!path) return 0;
if(path[0] && path[1]==':')
{
if(_chdrive(path[0]&0x1F)) return -1;
path+=2;
}
if(!path[0]) return 0;
zcpy(buf,path);
x=zlen(buf);
while(x>1)
{
--x;
if(buf[x]=='/' || buf[x]=='\\') buf[x]=0;
else break;
}
return chdir(buf);
#else
if(!path || !path[0]) return 0;
return chdir(path);
#endif
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.