home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / os / psh_1 / psh / c / chdir < prev    next >
Text File  |  1995-05-08  |  3KB  |  181 lines

  1. /* vi:tabstop=4:shiftwidth=4:smartindent
  2.  *
  3.  * chdir.c - functions to do with changing directory
  4.  *
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11. #include "psh.h"
  12.  
  13. /* Reads system variables
  14.  */
  15. extern char    *osgetenv(char *);
  16.  
  17. /* Directory stack for pushd/popd
  18.  */
  19. static char    *dirstack[MAXDIRS];
  20. static int    dirptr = -1;
  21.  
  22. /* Does cd(name). If the chdir() doesn't work, then start looking
  23.  * through the variable CDPATH to try and find a success.
  24.  * returns 0 for success, 1 for fail.
  25.  */
  26. static int do_cd(char *name)
  27. {
  28.     char        *cdpath;
  29.     char        *dir;
  30.     char        tmp[MAXLEN];
  31.  
  32.     /* Try to do the cd
  33.      */
  34.     if (chdir(name))
  35.     {
  36.         /* Try using CDPATH
  37.          */
  38.         cdpath = osgetenv("CDPATH");
  39.  
  40.         /* If CDPATH is set then
  41.          */
  42.         if (cdpath)
  43.         {
  44.             /* Split it up on spaces
  45.              */
  46.             while (dir = strtok(cdpath, " "))
  47.             {
  48.                 cdpath = NULL;
  49.                 sprintf(tmp, "%s/%s", dir, name);
  50.                 /* Try to cd. If the chdir works, then
  51.                  * print where you've got to and return
  52.                  */
  53.                 DEBUG(printf("Trying %s\n", tmp);)
  54.                 if (!chdir(tmp))
  55.                 {
  56.                     puts(tmp);
  57.                     return 0;
  58.                 }
  59.             }
  60.             /* All entries in CDPATH failed. Try one more time
  61.              * to chdir to the original name. This makes sure that
  62.              * the errno is set to the original error
  63.              */
  64.             if (chdir(name))
  65.             {
  66.                 return 1;
  67.             }
  68.         }
  69.         else
  70.         {
  71.             return 1;
  72.         }
  73.     }
  74.     return 0;
  75. }
  76.  
  77. /* The "cd" command
  78.  */
  79. int sh_cd(int argc, char **argv)
  80. {
  81.     int do_cd(char *name);
  82.  
  83.     if (argc > 2)
  84.     {
  85.         fprintf(stderr, "Usage: cd <dir>\n");
  86.         return 1;
  87.     }
  88.  
  89.     if (do_cd(argv[1]))
  90.     {
  91.         perror("cd");
  92.     }
  93.  
  94.     return 0;
  95. }
  96.  
  97. /* List directories on the directory stack.
  98.  * "\\" is always on the stack, as this allows you
  99.  * to do popd repeatedly to swap directoried between
  100.  * CSD and PSD.
  101.  */
  102. int    sh_dirs(int argc, char **argv)
  103. {
  104.     int    i;
  105.  
  106.     if (argc != 1)
  107.     {
  108.         fprintf(stderr, "Usage: dirs\n");
  109.         return 1;
  110.     }
  111.  
  112.     for (i=dirptr; i>=0; i--)
  113.     {
  114.         printf("%s ", dirstack[i]);
  115.     }
  116.     printf("\\\n");
  117.     return 0;
  118. }
  119.  
  120. /* The pushd command.
  121.  * Places the current directory on the stack and cd's to the
  122.  * new directory, using CDPATH
  123.  */
  124. int sh_pushd(int argc, char **argv)
  125. {
  126.     char    tmp[MAXLEN];
  127.  
  128.     if (argc != 2)
  129.     {
  130.         fprintf(stderr, "Usage: pushd dir\n");
  131.         return 1;
  132.     }
  133.     if (dirptr == MAXDIRS-1)
  134.     {
  135.         fprintf(stderr, "Directory stack full\n");
  136.         return 1;
  137.     }
  138.     getcwd(tmp, MAXLEN);
  139.     if (do_cd(argv[1]))
  140.     {
  141.         perror("pushd");
  142.         return 1;
  143.     }
  144.     dirstack[++dirptr] = strdup(tmp);
  145.     sh_dirs(1, NULL);
  146.     return 0;
  147. }
  148.  
  149. /* The popd command.
  150.  * Pops a directory off the stack and cd's to it.
  151.  * If the stack is empty, then do chdir("\\") to return
  152.  * to the PSD.
  153.  */
  154. int sh_popd(int argc, char **argv)
  155. {
  156.     int        r;
  157.  
  158.     if (argc != 1)
  159.     {
  160.         fprintf(stderr, "Usage: popd\n");
  161.         return 1;
  162.     }
  163.     if (dirptr > -1)
  164.     {
  165.         r = chdir(dirstack[dirptr]);
  166.         free(dirstack[dirptr--]);
  167.     }
  168.     else
  169.     {
  170.         r = chdir("\\");
  171.     }
  172.     if (r)
  173.     {
  174.         perror("popd");
  175.         return 1;
  176.     }
  177.         
  178.     sh_dirs(1, NULL);
  179.     return 0;
  180. }
  181.