home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libI77 / util.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.3 KB  |  118 lines

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <sys/dir.h>
  4. #include "fio.h"
  5. #define DIRSIZE    14
  6. g_char(a,alen,b) char *a,*b; ftnlen alen;
  7. {    char *x=a+alen-1,*y=b+alen-1;
  8.     *(y+1)=0;
  9.     for(;x>=a && *x==' ';x--) *y--=0;
  10.     for(;x>=a;*y--= *x--);
  11. }
  12. b_char(a,b,blen) char *a,*b; ftnlen blen;
  13. {    int i;
  14.     for(i=0;i<blen && *a!=0;i++) *b++= *a++;
  15.     for(;i<blen;i++) *b++=' ';
  16. }
  17. inode(a) char *a;
  18. {    struct stat x;
  19.     if(stat(a,&x)<0) return(-1);
  20.     return(x.st_ino);
  21. }
  22. #define DONE {*bufpos++=0; close(file); return;}
  23. #define INTBOUND sizeof(int)-1
  24. #define register 
  25. mvgbt(n,len,a,b) char *a,*b;
  26. {    register int num=n*len;
  27.     if( ((int)a&INTBOUND)==0 && ((int)b&INTBOUND)==0 && (num&INTBOUND)==0 )
  28.     {    register int *x=(int *)a,*y=(int *)b;
  29.         num /= sizeof(int);
  30.         if(x>y) for(;num>0;num--) *y++= *x++;
  31.         else for(num--;num>=0;num--) *(y+num)= *(x+num);
  32.     }
  33.     else
  34.     {    register char *x=a,*y=b;
  35.         if(x>y) for(;num>0;num--) *y++= *x++;
  36.         else for(num--;num>=0;num--) *(y+num)= *(x+num);
  37.     }
  38. }
  39. char *curdir()
  40. {    char name[256],*bufpos = name;
  41.     struct stat x;
  42.     struct direct y;
  43.     int file,i;
  44.     *bufpos++ = 0;
  45. loop:    stat(".",&x);
  46.     if((file=open("..",0))<0) goto done;
  47.     do
  48.     {    if(read(file,&y,sizeof(y))<sizeof(y)) goto done;
  49.     } while(y.d_ino!=x.st_ino);
  50.     close(file);
  51.     if(y.d_ino!=2)
  52.     {    dcat(name,y.d_name);
  53.         chdir("..");
  54.         goto loop;
  55.     }
  56.     if(stat(y.d_name,&x)<0 || chdir("/")<0
  57.         || (file=open("/",0))<0) goto done;
  58.     i=x.st_dev;
  59.     do
  60.     {    if(read(file,&y,sizeof(y))<sizeof(y)) goto done;
  61.         if(y.d_ino==0) continue;
  62.         if(stat(y.d_name,&x)<0) goto done;
  63.     } while(x.st_dev!=i || (x.st_mode&S_IFMT)!=S_IFDIR);
  64.     if(strcmp(".",y.d_name) || strcmp("..",y.d_name))
  65.         dcat(name,y.d_name);
  66.     dcat(name,"/");
  67. done:
  68.     bufpos=calloc(strlen(name)+1,1);
  69.     strcpy(bufpos,name);
  70.     chdir(name);
  71.     close(file);
  72.     return(bufpos);
  73. }
  74. dcat(a,b) char *a,*b;
  75. {
  76.     int i,j;
  77.     i=strlen(b);
  78.     j=strlen(a);
  79.     mvgbt(1,j+1,a,a+i+1);
  80.     mvgbt(1,i,b,a);
  81.     a[i]='/';
  82. }
  83. fullpath(a,b,errflag) char *a,*b;
  84. {
  85.     char *a1,*a2,*npart,*dpart,*p;
  86.     a1=curdir();
  87.     npart=NULL;
  88.     for(p=a;*p!=0;p++)
  89.         if(*p=='/') npart=p;
  90.     if(npart==NULL)
  91.     {    dpart=NULL;
  92.         npart=a;
  93.     }
  94.     else
  95.     {    dpart=a;
  96.         *npart++ = 0;
  97.     }
  98.     if(dpart!=NULL)
  99.     {    chdir(dpart);
  100.         a2=curdir();
  101.         strcpy(b,a2);
  102.     }
  103.     else
  104.     {    a2=NULL;
  105.         strcpy(b, a1);
  106.     }
  107.     strcat(b,npart);
  108.     chdir(a1);
  109.     if(a1!=NULL)
  110.     {    free(a1);
  111.         a1=NULL;
  112.     }
  113.     if(a2!=NULL)
  114.     {    free(a2);
  115.     }
  116.     return(0);
  117. }
  118.