safeminx.c
来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 197 行
C
197 行
/* ======================================================================= SAFEMINX.c Safe Multiple Includes. A utility to prevent problems with multiple #include's of the same file. Which is a severe problem for some older compilers like Turbo C version 1.5 ... 95-10-26 v1.00 Initial version _____ This version is Public Domain. /_|__| A.Reitsma, Delft, Nederland./ | \ --------------------------------------------------------------- */#include <stdlib.h> /* for EXIT_SUCCESS */#include <stdio.h> /* for fprintf()/fopen()/fclose() */#include <string.h> /* for strlen etc ... */#include <ctype.h> /* for isalpha() */#include "dirport.h"#ifndef FILENAME_MAX #define FILENAME_MAX 80#endif#ifndef FNAME_MAX #define FNAME_MAX 8+3+1#endif#define PROGRAM "SAFEMINX"#define VERSION "v1.00"#define AUTHOR "A.Reitsma, Delft, The Netherlands."#define CREATED "95-10-26"#define COPYRIGHT "Public Domain."char * Syntax[] ={ PROGRAM " " VERSION " " CREATED " " AUTHOR " " COPYRIGHT "\n\n", "Usage: " PROGRAM " <destination directory name>\n\n", "The problem:\n", "Some old compilers have severe problems with multiple #include's\n", "of the same file. This program eliminates the problem by creating\n", "'include-file' wrappers in the destination directory for the\n", "include files in the current directory.\n", "The wrappers could also be edited to include items which _should_\n", "be in the include file according to the standard but aren't.\n", "E.g.: FILENAME_MAX in stdio.h or CLOCKS_PER_SEC in time.h\n\n", "Instructions:\n- create a new include file directory,\n", "- change directory to the old include file directory,\n", "- run this program with the new directory as parameter,\n", "- change your compiler's settings to use the new directory.\n", "(Or something to the same effect.)\n\n", "Files are NEVER deleted or modified!\n\n", "Problem permanently solved ...\n", NULL};enum Errors{ ERR_ARGS = 1, ERR_MEM, ERR_FOPEN, ERR_NODIR, ERR_INVDRIVE, ERR_DIRCURRENT, ERR_NOFILES,};main( int argc, char * argv[] ){ char DirCurrent[ FILENAME_MAX ]; char DestName[ FILENAME_MAX ]; int DestDirLen; DOSFileData Data; /* validate the arguments */ if( argc < 2 ) { int ix = 0; do { fprintf( stdout, Syntax[ ix ]); }while( NULL != Syntax[ ++ix ]); return ERR_ARGS; } /* obtain the name of the current directory */ getcwd( DirCurrent, FILENAME_MAX ); strlwr( DirCurrent ); /* validate the destination drive and directory */ strcpy( DestName, argv[ 1 ]); strlwr( DestName ); if( ':' == DestName[ 1 ] ) { DestName[ 2 ] = '.'; DestName[ 3 ] = '\0'; if( 0 != chdir( DestName )) { fprintf( stderr, "\aInvalid destination drive\n" ); return ERR_INVDRIVE; } DestName[ 2 ] = argv[ 1 ][ 2 ]; DestName[ 3 ] = argv[ 1 ][ 3 ]; } if( 0 != chdir( argv[ 1 ]) ) { fprintf( stderr, "\aInvalid destination directory\n" ); return ERR_NODIR; } chdir( DirCurrent ); /* just in case it was changed ... */ if( 0 == strcmp( DirCurrent, DestName )) { fprintf( stderr, "\aDestination is current directory.\n" ); return ERR_DIRCURRENT; } /* anything to do? */ if( 0 != FIND_FIRST( "*.h", _A_NORMAL, &Data )) { fprintf( stderr, "\aNo .h files in the current directory\n" ); return ERR_NOFILES; } /* Yes, something to do: prepare for action */ fprintf( stdout, "Directory: \"%s\" ---\n", DirCurrent ); DestDirLen = strlen( argv[ 1 ]); memcpy( DestName, argv[ 1 ], DestDirLen+1 ); if( '\\' != argv[ 1 ][ DestDirLen - 1 ] ) { DestName[ DestDirLen ] = '\\' ; DestDirLen++; } do { char NameAlpha[ FNAME_MAX+1 ]; char * NamePtr = NameAlpha; FILE * FileOut; strcpy( DestName+DestDirLen, ff_name( &Data )); FileOut = fopen( DestName, "r" ); if( NULL != FileOut ) { fprintf( stdout, "Not overwriting \"%s\". It already exists!\n", ff_name( &Data )); continue; } FileOut = fopen( DestName, "w" ); if( NULL == FileOut ) { fprintf( stdout, "\aFailure opening \"%s\".\n", ff_name( &Data )); continue; } fprintf( stdout, "Creating \"%s\"\n", DestName ); strcpy( NameAlpha, ff_name( &Data )); while( '\0' != *NamePtr ) { if( !isalpha( *NamePtr )) *NamePtr = '_'; NamePtr ++ ; } fprintf( FileOut, /* fixed text: */ "/* %s\n" " Prevention of double inclusions.\n" "*/\n\n" "#ifndef SAFE__%s\n" "#define SAFE__%s\n\n" "#include <%s\\%s> /* 'original' */\n" "\n#endif\n", /* parameters: */ ff_name( &Data ), NameAlpha, NameAlpha, DirCurrent, ff_name( &Data ) ); fclose( FileOut ); }while( 0 == FIND_NEXT( &Data )); FIND_END( &Data ); fprintf( stdout, "--- Done ---\n" ); return EXIT_SUCCESS;}/* === SAFEMINX.c end ================================================= */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?