runit.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 583 行 · 第 1/2 页
C
583 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: Built-in builder commands.
*
****************************************************************************/
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include <sys/stat.h>
#ifdef __UNIX__
#include <utime.h>
#include <unistd.h>
#include <dirent.h>
#else
#include <sys/utime.h>
#include <direct.h>
#include <dos.h>
#endif
#include "watcom.h"
#include "builder.h"
#include "pmake.h"
#define BSIZE 256
#define SCREEN 79
const char Equals[] = "========================================"\
"========================================";
extern bool Quiet;
#ifdef __UNIX__
int __fnmatch( const char *pattern, const char *string )
{
if( *string == 0 ) {
while( *pattern == '*' )
++pattern;
return( ( *pattern == 0 ) ? 1 : 0 );
}
switch( *pattern ) {
case '*':
if( *string == '.' ) {
return( __fnmatch( pattern + 1, string ) );
} else if( __fnmatch( pattern + 1, string ) ) {
return( 1 );
} else {
return( __fnmatch( pattern, string + 1 ) );
}
case '?':
if( ( *string == 0 ) || ( *string == '.' ) ) {
return( 0 );
} else {
return( __fnmatch( pattern + 1, string + 1 ) );
}
case 0:
return( *string == 0 );
default:
if( *pattern != *string ) {
return( 0 );
} else {
return( __fnmatch( pattern + 1, string + 1 ) );
}
}
}
#endif
static void LogDir( char *dir )
{
char tbuff[BSIZE];
int equals;
int bufflen;
const char *eq;
struct tm *tm;
time_t ttime;
ttime = time( NULL );
tm = localtime( &ttime );
strftime( tbuff, BSIZE, "%H:%M:%S", tm );
strcat( tbuff, " " );
strcat( tbuff, dir );
equals = ( SCREEN - ( bufflen = strlen( tbuff ) ) ) / 2 - 2;
if( equals < 0 )
equals = 0;
eq = &Equals[ ( sizeof( Equals ) - 1 ) - equals];
Log( FALSE, "%s %s %s%s\n", eq, tbuff, eq, ( bufflen & 1 ) ? "" : "=" );
}
static unsigned ProcSet( char *cmd )
{
char *var;
char *rep;
var = cmd;
rep = strchr( cmd, '=' );
if( rep == NULL )
return( 1 );
*rep++ = '\0';
if( *rep == '\0' ) {
rep = NULL; // get rid of the variable! Needed by Optima!
}
#ifdef __WATCOMC__
// We don't have unsetenv(), but our setenv() is extended vs. POSIX
return( setenv( var, rep, 1 ) );
#else
if( rep == NULL ) {
unsetenv( var );
return( 0 );
} else
return( setenv( var, rep, 1 ) );
#endif
}
void ResetArchives( copy_entry *list )
{
copy_entry *next;
#ifndef __UNIX__
unsigned attr;
#endif
while( list != NULL ) {
next = list->next;
#ifndef __UNIX__
if( _dos_getfileattr( list->src, &attr ) == 0 ) {
_dos_setfileattr( list->src, attr & ~_A_ARCH );
}
#endif
free( list );
list = next;
}
}
static copy_entry *BuildList( char *src, char *dst, bool test_abit )
{
copy_entry *head;
copy_entry *curr;
copy_entry **owner;
char *end;
char buff[_MAX_PATH2];
char full[_MAX_PATH];
char srcdir[_MAX_PATH];
char *drive;
char *dir;
char *fn;
char *ext;
DIR *directory;
struct dirent *dent;
#ifndef __UNIX__
FILE *fp;
unsigned attr;
#else
struct stat statsrc, statdst;
int dstrc, srcrc;
char pattern[_MAX_PATH];
#endif
strcpy( srcdir, src );
end = &dst[strlen( dst ) - 1];
while( end[0] == ' ' || end[0] == '\t' ) {
--end;
}
end[1] = '\0';
if( strchr( srcdir, '*' ) == NULL && strchr( srcdir, '?' ) == NULL ) {
/* no wild cards */
head = Alloc( sizeof( *head ) );
head->next = NULL;
_fullpath( head->src, srcdir, sizeof( head->src ) );
switch( *end ) {
case '\\':
case '/':
/* need to append source file name */
_splitpath2( srcdir, buff, &drive, &dir, &fn, &ext );
_makepath( full, NULL, dst, fn, ext );
_fullpath( head->dst, full, sizeof( head->dst ) );
break;
default:
_fullpath( head->dst, dst, sizeof( head->dst ) );
break;
}
if( test_abit ) {
#ifndef __UNIX__
fp = fopen( head->dst, "rb" );
if( fp != NULL )
fclose( fp );
_dos_getfileattr( head->src, &attr );
if( !( attr & _A_ARCH ) && fp != NULL ) {
/* file hasn't changed */
free( head );
head = NULL;
}
#else
/* Linux has (strangely) no 'archive' attribute, compare modification times */
dstrc = stat( head->dst, &statdst );
srcrc = stat( head->src, &statsrc );
if( (dstrc != -1) && (srcrc != -1) && (statdst.st_mtime == statsrc.st_mtime) ) {
free( head );
head = NULL;
}
#endif
}
return( head );
}
#ifdef __UNIX__
_splitpath2( srcdir, buff, &drive, &dir, &fn, &ext );
_makepath( srcdir, drive, dir, NULL, NULL );
_makepath( pattern, NULL, NULL, fn, ext );
#endif
directory = opendir( srcdir );
if( directory == NULL ) {
Log( FALSE, "Can not open source directory '%s': %s\n", srcdir, strerror( errno ) );
return( NULL );
}
head = NULL;
owner = &head;
for( ;; ) {
dent = readdir( directory );
if( dent == NULL )
break;
#ifdef __UNIX__
{
struct stat buf;
size_t len = strlen( srcdir );
if( __fnmatch( pattern, dent->d_name ) == 0 )
continue;
strcat( srcdir, dent->d_name );
stat( srcdir, &buf );
srcdir[len] = '\0';
if( S_ISDIR( buf.st_mode ) )
continue;
}
#else
if( dent->d_attr & ( _A_SUBDIR | _A_VOLID ) )
continue;
#endif
curr = Alloc( sizeof( *curr ) );
curr->next = NULL;
_splitpath2( srcdir, buff, &drive, &dir, &fn, &ext );
_makepath( full, drive, dir, dent->d_name, NULL );
_fullpath( curr->src, full, sizeof( curr->src ) );
strcpy( full, dst );
switch( *end ) {
case '\\':
case '/':
strcat( full, dent->d_name );
break;
}
_fullpath( curr->dst, full, sizeof( curr->dst ) );
if( test_abit ) {
#ifndef __UNIX__
fp = fopen( curr->dst, "rb" );
if( fp != NULL )
fclose( fp );
if( !(dent->d_attr & _A_ARCH) && fp != NULL ) {
/* file hasn't changed */
free( curr );
continue;
}
#else
/* Linux has (strangely) no 'archive' attribute, compare modification times */
dstrc = stat( curr->dst, &statdst );
srcrc = stat( curr->src, &statsrc );
if( (dstrc != -1) && (srcrc != -1) && (statdst.st_mtime == statsrc.st_mtime) ) {
free( curr );
continue;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?