You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdbool.h>
 | 
						|
#include <assert.h>
 | 
						|
#if defined( _WIN32) || defined( __WATCOMC__)
 | 
						|
   #include <direct.h>
 | 
						|
#else
 | 
						|
   #include <unistd.h>
 | 
						|
#endif
 | 
						|
 | 
						|
/* Code to 'configure' curses.h.  Run as,  e.g.,
 | 
						|
 | 
						|
./config_curses -DPDC_WIDE -DXCURSES
 | 
						|
 | 
						|
it will check to see if the existing curses.h has those options set
 | 
						|
(and not the others,  such as CHTYPE_32).  Essentially,  it just checks
 | 
						|
to see if the existing configuration matches the one described on the
 | 
						|
command line.
 | 
						|
 | 
						|
   If it matches,  we exit without doing anything.  No file is updated.
 | 
						|
 | 
						|
   If the configurations differ,  a new 'curses0.h' is created that
 | 
						|
has the options given on the command line.  This is done by reading in
 | 
						|
the existing 'curses.h',  snipping out the lines with config data,
 | 
						|
and inserting new ones.  When we're done,  we remove 'curses.h' and
 | 
						|
move our new 'curses0.h' into its place.  This will force a full
 | 
						|
recompile on the next build,  which is what we want anyway if
 | 
						|
the configuration has changed.  */
 | 
						|
 | 
						|
int main( const int argc, const char **argv)
 | 
						|
{
 | 
						|
   FILE *ifile, *ofile;
 | 
						|
   int options_found = 0, i, j, options_desired = 0;
 | 
						|
   int verbose = 0;
 | 
						|
   const char *option_text[] = {
 | 
						|
               "XCURSES", "PDC_RGB", "PDC_WIDE",
 | 
						|
               "PDC_FORCE_UTF8", "PDC_DLL_BUILD", "PDC_NCMOUSE",
 | 
						|
               "CHTYPE_32"  };
 | 
						|
   const int n_options = (int)( sizeof( option_text) / sizeof( option_text[0]));
 | 
						|
   char buff[300];
 | 
						|
   const char *curses_h_filename = "curses.h";
 | 
						|
   const char *curses0_h_filename = "curses0.h";
 | 
						|
 | 
						|
   for( i = 1; i < argc; i++)
 | 
						|
      if( argv[i][0] == '-')
 | 
						|
         switch( argv[i][1])
 | 
						|
            {
 | 
						|
            case 'd':
 | 
						|
               {
 | 
						|
               int err_code;
 | 
						|
               const char *arg = (!argv[i][2] && i < argc - 1 ?
 | 
						|
                           argv[i + 1] : argv[i] + 2);
 | 
						|
 | 
						|
#ifdef _WIN32
 | 
						|
               err_code = _chdir( arg);
 | 
						|
#else
 | 
						|
               err_code = chdir( arg);
 | 
						|
#endif
 | 
						|
               if( err_code)
 | 
						|
                  {
 | 
						|
                  fprintf( stderr, "Couldn't change dir to '%s'\n", arg);
 | 
						|
                  perror( NULL);
 | 
						|
                  return( -1);
 | 
						|
                  }
 | 
						|
               }
 | 
						|
               break;
 | 
						|
            case 'v':
 | 
						|
               verbose = 1;
 | 
						|
               break;
 | 
						|
            case 'D':
 | 
						|
               for( j = 0; j < n_options; j++)
 | 
						|
                  if( !strcmp( argv[i] + 2, option_text[j]))
 | 
						|
                     options_desired |= (1 << j);
 | 
						|
               break;
 | 
						|
            default:
 | 
						|
               printf( "Option '%s' not recognized\n", argv[i]);
 | 
						|
            }
 | 
						|
 | 
						|
   ifile = fopen( curses_h_filename, "rb");
 | 
						|
   assert( ifile);
 | 
						|
   while( fgets( buff, sizeof( buff), ifile))
 | 
						|
      if( !memcmp( buff, "   #define ", 11))
 | 
						|
         for( j = 0; j < n_options; j++)
 | 
						|
            if( !memcmp( buff + 11, option_text[j], strlen( option_text[j]))
 | 
						|
                  && buff[11 + strlen( option_text[j])] <= ' ')
 | 
						|
               options_found |= (1 << j);
 | 
						|
   if( verbose)
 | 
						|
      printf( "options_found = 0x%x   options_desired = 0x%x\n",
 | 
						|
               options_found, options_desired);
 | 
						|
   if( options_found == options_desired)
 | 
						|
      {
 | 
						|
      fclose( ifile);         /* nothing to do */
 | 
						|
      return( 0);
 | 
						|
      }
 | 
						|
   fseek( ifile, 0L, SEEK_SET);
 | 
						|
   ofile = fopen( curses0_h_filename, "wb");
 | 
						|
   assert( ofile);
 | 
						|
   while( fgets( buff, sizeof( buff), ifile))
 | 
						|
      {
 | 
						|
      fputs( buff, ofile);
 | 
						|
      if( !memcmp( buff, "**man-end*******", 16))
 | 
						|
         {
 | 
						|
         fputs( "\n", ofile);
 | 
						|
         for( i = 0; i < n_options; i++)
 | 
						|
            if( options_desired & (1 << i))
 | 
						|
               {
 | 
						|
               if( !strcmp( option_text[i], "PDC_DLL_BUILD"))
 | 
						|
                  fprintf( ofile, "#if defined( __WIN32) && !defined( PDC_DLL_BUILD)\n");
 | 
						|
               else
 | 
						|
                  fprintf( ofile, "#ifndef %s\n", option_text[i]);
 | 
						|
               fprintf( ofile, "   #define %s\n", option_text[i]);
 | 
						|
               fprintf( ofile, "#endif\n");
 | 
						|
               }
 | 
						|
         fputs( "\n", ofile);
 | 
						|
         while( fgets( buff, sizeof( buff), ifile)
 | 
						|
                                  && memcmp( buff, "#define PDCURSES", 16))
 | 
						|
            ;
 | 
						|
         fputs( buff, ofile);                      /* dump rest of file unaltered*/
 | 
						|
         while( fgets( buff, sizeof( buff), ifile))
 | 
						|
            fputs( buff, ofile);
 | 
						|
         }
 | 
						|
      }
 | 
						|
   fclose( ofile);
 | 
						|
   fclose( ifile);
 | 
						|
#if defined( _WIN32) && !defined( __WATCOMC__)
 | 
						|
   _unlink( curses_h_filename);
 | 
						|
#else
 | 
						|
   unlink( curses_h_filename);
 | 
						|
#endif
 | 
						|
   rename( curses0_h_filename, curses_h_filename);
 | 
						|
   if( verbose)
 | 
						|
      printf( "curses.h updated\n");
 | 
						|
   return( 0);
 | 
						|
}
 |