home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 406_01 / atoc / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-09  |  4.3 KB  |  167 lines

  1. /*=========================================================================
  2.  
  3.     ATOC main module
  4.  
  5. =========================================================================*/
  6.  
  7. #define MAIN_MODULE
  8. #include <stdio.h>
  9. #include <time.h>
  10. #include "atoc.h"
  11.  
  12.  
  13. /*-------------------------------------------------------------------------
  14. main program
  15. -------------------------------------------------------------------------*/
  16. main( argc, argv )
  17. int argc;
  18. char *argv[];
  19. {
  20.     FILE *fi, *fo;
  21.     int i, j;
  22.  
  23.     printf( "ATOC %s, by Mike Rejsa\n", VERSION );
  24.     exitcode = 0;
  25.  
  26.     options( &argc, argv );
  27.     if ( argc >= 2 && argc <= 3 )
  28.     {
  29.         if ( ( fi = fopen( argv[ 1 ], "r" ) ) != NULL )
  30.         {
  31.             if ( argc == 3 )
  32.                 fo = fopen( argv[ 2 ], "w" );
  33.             else fo = stdout;
  34.             if ( fo != NULL )
  35.             {
  36.                 get_filename( argv[ 1 ] );
  37.                 get_timedate();
  38.                 fprintf( fo, "/* ANSI to K&R translation by ATOC %s, by Mike Rejsa */\n", VERSION );
  39.                 atoc( fi, fo );
  40.                 if ( argc == 3 )
  41.                 {
  42.                     fclose( fo );
  43.                     if ( exitcode != 0 )
  44.                         unlink( argv[ 2 ] );
  45.                 }
  46.             }
  47.             else
  48.             {
  49.                 if ( argc == 3 )
  50.                     printf( "Can't open file \"%s\"\n", argv[ 2 ] );
  51.                 else printf( "stdout == NULL!\n" ); /* exercise in futility... */
  52.                 exitcode = 1;
  53.             }
  54.             fclose( fi );
  55.         }
  56.         else
  57.         {
  58.             printf( "Can't open file \"%s\"\n", argv[ 1 ] );
  59.             exitcode = 1;
  60.         }
  61.     }
  62.     else
  63.     {
  64.         printf( "ANSI C to K&R C translator\n" );
  65.         printf( "Usage: ATOC [-e] [-i] [-il] [-v] infile [ outfile ]\n" );
  66.         printf( "         -e   Don't convert enumerations\n" );
  67.         printf( "         -i   Include #include files inline\n" );
  68.         printf( "         -il  Only include \"local\" #include files inline\n" );
  69.         printf( "         -t   Don't convert trigraphs\n" );
  70.         printf( "         -v   Don't convert voids\n" );
  71.         exitcode = 1;
  72.     }
  73.  
  74.     exit( exitcode );
  75. }
  76. /*-------------------------------------------------------------------------
  77. get_filename( s ) extracts the base filename from s and puts it into
  78. filename[] as a quoted string.
  79. -------------------------------------------------------------------------*/
  80. PRIVATE get_filename( s )
  81. char *s;
  82. {
  83.     char *cp, *strchr(), *strrchr();
  84.  
  85.     if ( ( cp = strrchr( s, '\\' ) ) != NULL )
  86.         ++cp;
  87.     else if ( ( cp = strchr( s, ':' ) ) != NULL )
  88.         ++cp;
  89.     else cp = s;
  90.     strcpy( filename, cp );
  91. }
  92. /*-------------------------------------------------------------------------
  93. get_timedate() sets global compile time and date strings.
  94. -------------------------------------------------------------------------*/
  95. PRIVATE get_timedate()
  96. {
  97.     long int t;
  98.     struct tm *ts;
  99.     static char *mname[] = {
  100.         "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  101.         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
  102.         NULL
  103.     };
  104.  
  105.     time( &t );
  106.     ts = localtime( &t );
  107.     sprintf( compiledate, "%s %02d %04d",
  108.       mname[ ts->tm_mon ], ts->tm_mday, ts->tm_year + 1900 );
  109.     sprintf( compiletime, "%02d:%02d:%02d",
  110.       ts->tm_hour, ts->tm_min, ts->tm_sec );
  111. }
  112. /*-------------------------------------------------------------------------
  113. options( argc, argv ) handles command line options.
  114. -------------------------------------------------------------------------*/
  115. PRIVATE options( argc, argv )
  116. int *argc;
  117. char *argv[];
  118. {
  119.     int x;
  120.  
  121.     enumflag = TRUE;
  122.     includeflag = FALSE;
  123.     localonlyflag = FALSE;
  124.     trigraphflag = TRUE;
  125.     voidflag = TRUE;
  126.     for ( x = 1; x < *argc; )
  127.         if ( argv[ x ][ 0 ] == '-' )
  128.             switch( tolower( argv[ x ][ 1 ] ) )
  129.             {
  130.                 case 'e':
  131.                     enumflag = FALSE;
  132.                     rmarg( argc, argv, x );
  133.                     break;
  134.                 case 'i':
  135.                     includeflag = TRUE;
  136.                     if ( tolower( argv[ x ][ 2 ] ) == 'l' )
  137.                         localonlyflag = TRUE;
  138.                     rmarg( argc, argv, x );
  139.                     break;
  140.                 case 't':
  141.                     trigraphflag = FALSE;
  142.                     rmarg( argc, argv, x );
  143.                     break;
  144.                 case 'v':
  145.                     voidflag = FALSE;
  146.                     rmarg( argc, argv, x );
  147.                     break;
  148.                 default:
  149.                     ++x;
  150.                     break;
  151.             }
  152.         else ++x;
  153. }
  154. /*-------------------------------------------------------------------------
  155. rmarg( argc, argv, x ) removes an argument from the argument list.
  156. -------------------------------------------------------------------------*/
  157. PRIVATE rmarg( argc, argv, x )
  158. int *argc;
  159. char *argv[];
  160. int x;
  161. {
  162.     for ( ; x < *argc; ++x )
  163.         argv[ x ] = argv[ x + 1 ];
  164.     --*argc;
  165. }
  166. /*=======================================================================*/
  167.