home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / cvs-1.8.7-src.tgz / tar.out / fsf / cvs / src / cvsrc.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  3KB  |  151 lines

  1. /*
  2.  *    Copyright (c) 1993 david d zuhn
  3.  *
  4.  *    written by david d `zoo' zuhn while at Cygnus Support
  5.  *
  6.  *    You may distribute under the terms of the GNU General Public License
  7.  *    as specified in the README file that comes with the CVS 1.4 kit.
  8.  *
  9.  */
  10.  
  11.  
  12. #include "cvs.h"
  13. #include "getline.h"
  14.  
  15. /* this file is to be found in the user's home directory */
  16.  
  17. #ifndef    CVSRC_FILENAME
  18. #define    CVSRC_FILENAME    ".cvsrc"
  19. #endif
  20. char cvsrc[] = CVSRC_FILENAME;
  21.  
  22. #define    GROW    10
  23.  
  24. extern char *strtok ();
  25.  
  26. /* Read cvsrc, processing options matching CMDNAME ("cvs" for global
  27.    options, and update *ARGC and *ARGV accordingly.  */
  28.  
  29. void
  30. read_cvsrc (argc, argv, cmdname)
  31.     int *argc;
  32.     char ***argv;
  33.     char *cmdname;
  34. {
  35.     char *homedir;
  36.     char *homeinit;
  37.     FILE *cvsrcfile;
  38.  
  39.     char *line;
  40.     int line_length;
  41.     size_t line_chars_allocated;
  42.  
  43.     char *optstart;
  44.  
  45.     int command_len;
  46.     int found = 0;
  47.  
  48.     int i;
  49.  
  50.     int new_argc;
  51.     int max_new_argv;
  52.     char **new_argv;
  53.  
  54.     /* don't do anything if argc is -1, since that implies "help" mode */
  55.     if (*argc == -1)
  56.     return;
  57.  
  58.     /* setup the new options list */
  59.  
  60.     new_argc = 1;
  61.     max_new_argv = (*argc) + GROW;
  62.     new_argv = (char **) xmalloc (max_new_argv * sizeof (char*));
  63.     new_argv[0] = xstrdup ((*argv)[0]);
  64.  
  65.     /* determine filename for ~/.cvsrc */
  66.  
  67.     homedir = get_homedir ();
  68.     if (!homedir)
  69.     return;
  70.  
  71.     homeinit = (char *) xmalloc (strlen (homedir) + strlen (cvsrc) + 10);
  72.     strcpy (homeinit, homedir);
  73.     strcat (homeinit, "/");
  74.     strcat (homeinit, cvsrc);
  75.  
  76.     /* if it can't be read, there's no point to continuing */
  77.  
  78.     if (!isreadable (homeinit))
  79.     {
  80.     free (homeinit);
  81.     return;
  82.     }
  83.  
  84.     /* now scan the file until we find the line for the command in question */
  85.  
  86.     line = NULL;
  87.     line_chars_allocated = 0;
  88.     command_len = strlen (cmdname);
  89.     cvsrcfile = open_file (homeinit, "r");
  90.     while ((line_length = getline (&line, &line_chars_allocated, cvsrcfile))
  91.        >= 0)
  92.     {
  93.     /* skip over comment lines */
  94.     if (line[0] == '#')
  95.         continue;
  96.  
  97.     /* stop if we match the current command */
  98.     if (!strncmp (line, cmdname, command_len)
  99.         && isspace (*(line + command_len)))
  100.     {
  101.         found = 1;
  102.         break;
  103.     }
  104.     }
  105.  
  106.     fclose (cvsrcfile);
  107.  
  108.     if (found)
  109.     {
  110.     /* skip over command in the options line */
  111.     optstart = strtok (line + command_len, "\t \n");
  112.  
  113.     do
  114.     {
  115.         new_argv [new_argc] = xstrdup (optstart);
  116.         new_argv [new_argc+1] = NULL;
  117.         new_argc += 1;
  118.       
  119.         if (new_argc >= max_new_argv)
  120.         {
  121.         char **tmp_argv;
  122.         max_new_argv += GROW;
  123.         tmp_argv = (char **) xmalloc (max_new_argv * sizeof (char*));
  124.         for (i = 0; i <= new_argc; i++)
  125.             tmp_argv[i] = new_argv[i];
  126.         free(new_argv);
  127.         new_argv = tmp_argv;
  128.         }
  129.       
  130.     }
  131.     while ((optstart = strtok (NULL, "\t \n")) != NULL);
  132.     }
  133.  
  134.     if (line != NULL)
  135.     free (line);
  136.  
  137.     /* now copy the remaining arguments */
  138.   
  139.     for (i=1; i < *argc; i++)
  140.     {
  141.     new_argv [new_argc] = (*argv)[i];
  142.     new_argc += 1;
  143.     }
  144.  
  145.     *argc = new_argc;
  146.     *argv = new_argv;
  147.  
  148.     free (homeinit);
  149.     return;
  150. }
  151.