home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 387b.lha / dice_v2.02 / lib / unix / getcwd.c < prev   
Encoding:
C/C++ Source or Header  |  1990-05-30  |  1.3 KB  |  79 lines

  1.  
  2. /*
  3.  *  getcwd.c
  4.  */
  5.  
  6. #include <exec/types.h>
  7. #include <libraries/dos.h>
  8. #include <libraries/dosextens.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11.  
  12. typedef struct FileInfoBlock FIB;
  13. typedef struct Process Process;
  14.  
  15. char *
  16. getcwd(path, max)
  17. char *path;
  18. int max;
  19. {
  20.     BPTR lock;
  21.     FIB *fib;
  22.     int len = 0;    /*    path length    */
  23.     int elen;        /*    element length    */
  24.     short alloced = 0;
  25.  
  26.     {
  27.     Process *proc = (Process *)FindTask(NULL);
  28.     if (proc->pr_Task.tc_Node.ln_Type == NT_TASK)
  29.         return(NULL);
  30.     lock = DupLock(proc->pr_CurrentDir);
  31.     if (lock == NULL)
  32.         return(NULL);
  33.     }
  34.     if (path == NULL) {
  35.     path = malloc(max);
  36.     alloced = 1;
  37.     }
  38.  
  39.     if (fib = malloc(sizeof(FIB))) {
  40.     while (lock && Examine(lock, fib)) {
  41.         BPTR newlock;
  42.  
  43.         elen = strlen(fib->fib_FileName);
  44.         if (len + elen + 2 > max)
  45.         break;
  46.  
  47.         newlock = ParentDir(lock);
  48.  
  49.         if (len) {
  50.         if (newlock)
  51.             strins(path, "/");
  52.         else
  53.             strins(path, ":");
  54.         strins(path, fib->fib_FileName);
  55.         ++len;
  56.         } else {
  57.         strcpy(path, fib->fib_FileName);
  58.         if (newlock == NULL)
  59.             strcat(path, ":");
  60.         }
  61.         len += elen;
  62.  
  63.         UnLock(lock);
  64.         lock = newlock;
  65.     }
  66.     free(fib);
  67.     }
  68.  
  69.     if (lock) {
  70.     UnLock(lock);
  71.     if (alloced)
  72.         free(path);
  73.     path = NULL;
  74.     }
  75.     return(path);
  76. }
  77.  
  78.  
  79.