Hamilton LaboratoriesHamilton C shell 2012User guideSamples

dumpenv.c

Oregon Coast

dumpenv.c
Previous | Next

/***************************************************************************/
/*                                                                         */
/*                                                                         */
/*       Dump the current environmentals as setenv statements.             */
/* Copyright (c) 1989-2012 by Hamilton Laboratories.  All rights reserved. */
/*                                                                         */
/*                                                                         */
/***************************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* This little utility will dump out your environmental variables in a
   form that can be executed in a login.csh file.  It looks for any
   characters that need enclosing single quotes and uses the individual
   escapesym character (assumed to be '^') to escape any that require
   more than just single quotes.

   (escapesym chars, assumed to be '^', are not further quoted; we assume
   if this appears, it's probably meant to be a quote of the next character.)

   When it writes out the PATH variable, it inserts ".;", representing
   the current directory to the start of the string if it's not already
   there.  This is a convenience in converting from cmd.exe's convention
   of always trying the current directory first to csh.exe's of trying
   the current directory only if you specify it.  (You can conditionally
   compile-out this option by #defining TruePATH.)

   */

char chars_needing_quotes[] = "!\n\r'\"` &|;<>()*?{}[]~$";

void cdecl main ( int argc, char *argv[], char *envp[] )
      {
      register char *e;
      int i;
      for (i = 0;  envp[i]; i++)
         {
         for (e = envp[i];  *e && !strchr(chars_needing_quotes, *e);  e++)
            ;
         if (*e)
            {
            /* Enclose the value in quotes. */
            e = strchr(envp[i], '=');
            *e = '\0';
            printf ("setenv %s='", envp[i]);

#           ifndef TruePATH
               if (strcmp(envp[i], "PATH") == 0 &&
                     (e[1] != '.' || e[2] != ';'))
                  {
                  /* PATH variable doesn't already start with ".;" */
                  putchar('.');
                  putchar(';');
                  }
#           endif

            while (*++e)
               switch (*e)
                  {
                  case '!':
                  case '"':
                  case '\'':
                  case '`':
                     putchar('^');
                     putchar(*e);
                     break;
                  case '\n':
                     putchar('^');
                     putchar('n');
                     break;
                  case '\r':
                     putchar('^');
                     putchar('r');
                     break;
                  default:
                     putchar(*e);
                  }
            fputs("'\n", stdout);
            }
         else
            /* Ignore the possibility of a PATH variable that didn't have at
               least one semicolon. */
            printf ("setenv %s\n", envp[i]);
         }
      exit(0);
      }

Previous | Next