/*-- AutoRev header do NOT edit! * * Program : Bump.c * Copyright : © Copyright 1992 Jaba Development * Author : Jan van den Baard * Creation Date : 6-Feb-92 * Current version : 1.0 * Translator : DICE v2.06 * * REVISION HISTORY * * Date Version Comment * --------- ------- ------------------------------------------ * 21-Mar-92 1.0 Added "ONLYDATE" option. * 08-Feb-92 1.0 Added "QUIET" option. * 06-Feb-92 1.0 Version string updater. * *-- REV_END --*/ /* * --- Compiling : dcc -r -mRR -proto Bump.c -o Bump */ #include #include #include #include #include #include #include #include #include /* * --- Some macros */ #define SKIP_BLANKS(p) while(isspace(*p)) p++; #define SEEK_DIGIT(p) while(!isdigit(*p)) p++; #define FIND_DOT(p) while(*p++ != '.'); /* * --- The version string */ static UBYTE *version_string = "$VER: BUMP 37.15 (21.3.92)"; /* * --- For the shell args */ UBYTE *template = "Name/A,INCVER/S,INCREV/S,SETVER/K/N,SETREV/K/N,QUIET/S,ONLYDATE/S"; ULONG array[7] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L }; /* * --- Some global data */ UBYTE *header = "Error -"; BPTR stdout = NULL; UBYTE *pointer = NULL; ULONG filesize; /* * --- Function proto's */ extern ULONG atoi( UBYTE * ); extern void exit( long ); ULONG MyFPrintf( BPTR, UBYTE *, ... ); UBYTE *SeekVersion( void ); LONG CheckFormat( UBYTE * ); LONG ReadSourceFile( void ); ULONG GetNum( UBYTE * ); void DoDate( BPTR ); /* * --- Perform formatted output */ ULONG MyFPrintf( BPTR fh, UBYTE *format, ... ) { va_list args; long ret; va_start( args, format ); ret = VFPrintf( fh, format, args ); va_end( args ); return( ret ); } /* * --- Check the version string format. */ LONG CheckFormat( UBYTE *ptr ) { UBYTE d = 0, l = 0, r = 0; while( *ptr != 0x22 && *ptr != 0x27 ) { switch( *ptr ) { case '.': d++; break; case '(': l++; break; case ')': r++; break; } ptr++; } if ( d != 3 || l != 1 || r != 1 ) return( FALSE ); return( TRUE ); } /* * --- Search through the buffer for the version string */ UBYTE *SeekVersion( void ) { UBYTE *ptr = pointer; ULONG num = 0L; while( 1 ) { if( *ptr == '$' && ! Strnicmp( ptr + 1, "VER: ", 5 )) return( ptr ); ptr++; if ( num++ > ( filesize - 18 )) return( 0L ); } return( ptr ); } /* * --- Read in the source file */ LONG ReadSourceFile( void ) { BPTR file; stdout = Output(); if ( file = Open(( UBYTE * )array[ 0 ], MODE_OLDFILE )) { Seek( file, 0L, OFFSET_END ); filesize = Seek( file, 0L, OFFSET_BEGINNING ); if ( pointer = ( UBYTE * )AllocMem( filesize, MEMF_PUBLIC )) { if ( Read( file, pointer, filesize ) == filesize ) { Close( file ); return( TRUE ); } else PrintFault( IoErr(), header ); FreeMem( pointer, filesize ); } else { SetIoErr( ERROR_NO_FREE_STORE ); PrintFault( ERROR_NO_FREE_STORE, header ); } Close( file ); } else { MyFPrintf( stdout, "Can't open \"%s\" for input - ", array[ 0 ] ); PrintFault( IoErr(), NULL ); } return( FALSE ); } /* * --- Convert the numbers from the source * --- into real numbers. */ ULONG GetNum( UBYTE *ptr ) { UBYTE number[ 20 ], i = 0; while( isdigit( *ptr )) { number[ i++ ] = *ptr++; } number[ i ] = 0; return( atoi( number )); } /* * --- Ouput the current system date to the file. */ void DoDate( BPTR file ) { struct DateTime dt; char date[10]; ULONG day, month, year; DateStamp((struct DateStamp *)&dt); dt.dat_Format = FORMAT_CDN; dt.dat_StrDate = &date[0]; dt.dat_Flags = 0; dt.dat_StrDay = 0; dt.dat_StrTime = 0; DateToStr(&dt); day = GetNum( &date[ 0 ] ); month = GetNum( &date[ 3 ] ); year = GetNum( &date[ 6 ] ); MyFPrintf( file, "(%ld.%ld.%ld)", day, month, year ); } void _main( void ) { struct RDArgs *cli_args; BPTR file; UBYTE *ptr, *ptr1; ULONG revision, version, i; stdout = Output(); if ( cli_args = ReadArgs( template, &array[ 0 ], 0L )) { if ( ! array[ 1 ] && ! array[ 2 ] && ! array [ 3 ] && ! array[ 4 ] && ! array[ 6 ] ) { array[ 2 ] = TRUE; if ( ! array[ 5 ] ) FPuts( stdout, "Defaulting to INCREV\n" ); } SetIoErr( NULL ); if ( ReadSourceFile()) { SetIoErr( 0L ); if ( ! array[ 5 ] ) MyFPrintf( stdout, "Processing \"%s\"\n", array[ 0 ] ); if ( ptr = SeekVersion()) { if ( CheckFormat( ptr )) { ptr1 = pointer; if ( ! array[ 5 ] ) MyFPrintf( stdout, "Found version string at offset %ld in \"%s\"\n", ptr - ptr1, array[ 0 ] ); ptr += 6; if ( file = Open(( UBYTE * )array[ 0 ], MODE_NEWFILE )) { FWrite( file, ptr1, (ULONG)( ptr - ptr1 ), 1); SKIP_BLANKS( ptr ); if ( ! array[ 5 ] ) FPuts( stdout, "Program name \"" ); while( ! isspace( *ptr )) { FPutC( file, *ptr ); if ( ! array[ 5 ] ) FPutC( stdout, *ptr ); ptr++; } if ( ! array[ 5 ] ) FPuts( stdout, "\"\n" ); SEEK_DIGIT( ptr ); version = GetNum( ptr ); FIND_DOT( ptr ); revision = GetNum( ptr ); if ( ! array[ 5 ] ) { if ( ! array[ 6 ] ) MyFPrintf( stdout, "Old version : %ld.%ld\n", version, revision ); else FPuts( stdout, "Updating version date\n" ); } if ( ! array[ 6 ] ) { if ( array[ 2 ] ) revision++; else if ( array[ 4 ] ) revision = *((ULONG *)array[ 4 ] ); if ( array[ 1 ] ) version++; else if ( array[ 3 ] ) version = *((ULONG *)array[ 3 ] ); } if ( ! array[ 5 ] ) { if ( ! array[ 6 ] ) MyFPrintf( stdout, "New version : %ld.%ld\n", version, revision ); } MyFPrintf( file, " %ld.%ld ", version, revision ); DoDate( file ); while( *ptr != 0x22 && *ptr != 0x27 ) ptr++; FWrite( file, ptr, (ULONG)( filesize - (ULONG)( ptr - ptr1 )), 1 ); Close( file ); if ( IoErr()) PrintFault( IoErr(), header ); else if ( ! array[ 5 ] ) FPuts( stdout, "Done.\n" ); } } else FPuts( stdout, "Error -: Malformed version string\n" ); } else FPuts( stdout, "Error -: no version string found\n" ); FreeMem( pointer, filesize ); } FreeArgs( cli_args ); } else PrintFault( IoErr(), header ); exit( IoErr()); }