mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 02:44:35 +08:00
updates for msdos/go32 from Bryce Cogswell
This commit is contained in:
+10
-26
@@ -36,16 +36,6 @@ will go to a file rather than the screen.
|
||||
The go32 debuggers get confused by the relocated stacks used by tasks,
|
||||
and tend to crash when variables are inspected.
|
||||
|
||||
make directory
|
||||
--------------
|
||||
gcc-go32.cfg is used for cross compiling to the go32 environment under RTEMS,
|
||||
while djgcc.cfg is used for "native" compilation; i.e. under MSDOS rather
|
||||
than under RTEMS. The difference is that "native" compilation uses the djgpp
|
||||
I/O libraries, while "cross" compilation uses the RTEMS I/O libraries.
|
||||
|
||||
djgcc.cfg is identical to gcc.cfg, except for the omission of the -pipe
|
||||
option.
|
||||
|
||||
djgcc include files
|
||||
-------------------
|
||||
In general, we use RTEMS include files because these contain the proper
|
||||
@@ -53,23 +43,17 @@ declarations for the libc, and in particular, the stdio functions.
|
||||
When calling go32-specific functions it is necessary to include some
|
||||
djgpp include files, as well. Unfortunately, there are some disagreements
|
||||
between RTEMS and djgpp as to how certain functions and types are
|
||||
declared. In these cases, I have modified to RTEMS source to special-
|
||||
case the differences.
|
||||
|
||||
cpu-specific files
|
||||
------------------
|
||||
rtems/c/src/exec/cpu/i80386 is intended to contain 386-specific
|
||||
functions for RTEMS. Since under djgpp we do not have *complete*
|
||||
control of the processor, we must cooperate with the djgpp runtime
|
||||
environment, this directory cannot be shared between the go32 port
|
||||
and other 386 BSPs.
|
||||
declared. In these cases, the RTEMS source have been modified to
|
||||
special-case the differences.
|
||||
|
||||
other
|
||||
-----
|
||||
* F12 will immediately abort the program.
|
||||
See libbsp/i80386/go32/iosupp/inch.c.
|
||||
* Pressing F12 will immediately abort the program.
|
||||
See lib/libbsp/i386/go32/console/inch.c.
|
||||
|
||||
* lib/libbsp/i386/go32/timer uses the on-board timer chip by default,
|
||||
which has a resolution of about 1 microsecond. However, if executing
|
||||
on a Pentium processor you can use the on-chip 64-bit cycle counter,
|
||||
which counts at whatever clock rate your processor runs at. To enable
|
||||
this, set RTEMS_CPU_MODEL=pentium in make/custom/go32.cfg.
|
||||
|
||||
* libbsp/i80386/go32/timer uses the on-board timer chip by default.
|
||||
However, if executing on a Pentium processor you can use the on-chip
|
||||
64-bit cycle counter, which counts at whatever clock rate your processor
|
||||
runs at. To use this, compile with -DPENTIUM
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
ifc.exe is an MS-DOS executable which is equivalent to the program
|
||||
install-if-change. It was compiled using Borland C 2.00.
|
||||
|
||||
@@ -0,0 +1,331 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <process.h>
|
||||
|
||||
#include <io.h>
|
||||
|
||||
void * xmalloc( int size )
|
||||
{
|
||||
void * p = (void *)malloc( size );
|
||||
if ( !p ) {
|
||||
fprintf( stderr, "out of memory\n" );
|
||||
exit( 1 );
|
||||
}
|
||||
return p;
|
||||
}
|
||||
void * xrealloc( void * old, int size )
|
||||
{
|
||||
void * p = (void *)realloc( old, size );
|
||||
if ( !p ) {
|
||||
fprintf( stderr, "out of memory\n" );
|
||||
exit( 1 );
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
char ** argv_fix( int * argc, char ** argv )
|
||||
{
|
||||
char ** new = NULL;
|
||||
int max = 20;
|
||||
int cnt = 0;
|
||||
int j;
|
||||
|
||||
for ( j = 1; argv[j]; ++j )
|
||||
if ( argv[j][0] == '@' && access(argv[j]+1,0)==0 )
|
||||
break;
|
||||
if ( argv[j] == NULL )
|
||||
return argv;
|
||||
|
||||
new = (char **)xmalloc( max * sizeof *new );
|
||||
new[cnt++] = *argv++;
|
||||
for ( ; *argv; ++argv ) {
|
||||
if ( cnt >= max )
|
||||
new = (char **)realloc( new, (max*=2) * sizeof *new );
|
||||
|
||||
if ( argv[0][0] != '@' || access(argv[0]+1,0) ) {
|
||||
new[cnt++] = *argv;
|
||||
} else {
|
||||
char line[ 1000 ];
|
||||
FILE * f = fopen( argv[0]+1, "r" );
|
||||
if ( !f ) {
|
||||
perror( argv[0]+1 );
|
||||
exit( 2 );
|
||||
}
|
||||
while ( fgets( line, sizeof line, f ) ) {
|
||||
int len = strlen( line );
|
||||
/* delete trailing newlines */
|
||||
while ( line[len-1] == '\n' || line[len-1] == '\r' )
|
||||
line[--len] = '\0';
|
||||
if ( cnt >= max )
|
||||
new = (char **)xrealloc( new, (max*=2) * sizeof *new );
|
||||
new[cnt] = (char *)xmalloc( len+1 );
|
||||
strcpy( new[cnt], line );
|
||||
++cnt;
|
||||
}
|
||||
fclose( f );
|
||||
}
|
||||
}
|
||||
if ( cnt >= max )
|
||||
new = (char **)xrealloc( new, (max+1) * sizeof *new );
|
||||
new[cnt] = NULL;
|
||||
*argc = cnt;
|
||||
return new;
|
||||
}
|
||||
|
||||
|
||||
const char * USAGE =
|
||||
"usage: $progname [ -cNvmV ] file [ file ... ] dest-directory-or-file\n"
|
||||
" -v -- verbose\n"
|
||||
" -V suffix -- suffix to append to targets (before any . suffix)\n"
|
||||
" eg: -V _g would change 'foo' to 'foo_g' and\n"
|
||||
" 'libfoo.a' to 'libfoo_g.a'\n"
|
||||
" -m mode -- mode for new file(s)\n"
|
||||
" -c -- copy instead of move (always on)\n"
|
||||
" -N -- copy only if source is newer than target\n"
|
||||
;
|
||||
|
||||
void fatal( char * msg )
|
||||
{
|
||||
if ( msg )
|
||||
fprintf( stderr, "%s\n", msg );
|
||||
fprintf( stderr, "%s", USAGE );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
char * basename( char * f )
|
||||
{
|
||||
char * b = strrchr( f, '/' );
|
||||
if ( b ) ++b;
|
||||
else b = f;
|
||||
return b;
|
||||
}
|
||||
|
||||
#include <sys/stat.h>
|
||||
int is_dir( char * path )
|
||||
{
|
||||
struct stat buf;
|
||||
if ( stat( path, &buf ) )
|
||||
return 0;
|
||||
return buf.st_mode & S_IFDIR;
|
||||
}
|
||||
int is_file( char * path )
|
||||
{
|
||||
struct stat buf;
|
||||
if ( stat( path, &buf ) )
|
||||
return 0;
|
||||
return buf.st_mode & S_IFREG;
|
||||
}
|
||||
int newer( char * p1, char * p2 )
|
||||
{
|
||||
struct stat buf1;
|
||||
struct stat buf2;
|
||||
if ( stat( p1, &buf1 ) )
|
||||
return 0;
|
||||
if ( stat( p2, &buf2 ) )
|
||||
return 0;
|
||||
return buf1.st_mtime > buf2.st_mtime;
|
||||
}
|
||||
|
||||
int filecopy( char * d, char * s, int preserve_time )
|
||||
{
|
||||
#if 0
|
||||
int status;
|
||||
char * argv[ 5 ];
|
||||
argv[0] = "cp";
|
||||
argv[1] = "-p";
|
||||
argv[2] = s;
|
||||
argv[3] = d;
|
||||
argv[4] = NULL;
|
||||
status = spawnvp( P_WAIT, argv[0], argv );
|
||||
if ( status )
|
||||
perror( "cp" );
|
||||
return status;
|
||||
#else
|
||||
FILE * fs;
|
||||
FILE * fd;
|
||||
char buffer[ 8192 ];
|
||||
int n;
|
||||
struct ftime When;
|
||||
struct stat Stat;
|
||||
|
||||
fs = fopen( s, "rb" );
|
||||
if ( fs == NULL ) {
|
||||
perror( s );
|
||||
return 1;
|
||||
}
|
||||
fd = fopen( d, "wb" );
|
||||
if ( fd == NULL ) {
|
||||
perror( d );
|
||||
fclose( fs );
|
||||
return 2;
|
||||
}
|
||||
|
||||
if ( preserve_time )
|
||||
if ( getftime( fileno(fs), &When ) ) {
|
||||
perror( s );
|
||||
preserve_time = 0;
|
||||
}
|
||||
|
||||
do {
|
||||
n = fread( buffer, 1, sizeof buffer, fs );
|
||||
if ( n > 0 )
|
||||
if ( fwrite( buffer, 1, n, fd ) < 0 ) {
|
||||
perror( d );
|
||||
return 3;
|
||||
}
|
||||
} while ( n > 0 );
|
||||
|
||||
fclose( fs );
|
||||
|
||||
/* Fix time stamp */
|
||||
if ( preserve_time )
|
||||
if ( setftime( fileno(fd), &When ) ) {
|
||||
perror( s );
|
||||
preserve_time = 0;
|
||||
}
|
||||
fclose( fd );
|
||||
|
||||
/* Fix access rights */
|
||||
if ( stat( s, &Stat ) )
|
||||
perror( s );
|
||||
else if ( chmod( d, Stat.st_mode ) )
|
||||
perror( d );
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int main( int argc, char * argv[] )
|
||||
{
|
||||
char * progname;
|
||||
int verbose = 0;
|
||||
int only_if_newer= 0;
|
||||
char * suffix = NULL;
|
||||
char * mode = NULL;
|
||||
char * dest;
|
||||
char ** pp;
|
||||
|
||||
argv = argv_fix( &argc, argv );
|
||||
|
||||
progname = basename( *argv++ );
|
||||
|
||||
/* process the options */
|
||||
while ( argv[0] && argv[0][0] == '-' ) {
|
||||
switch ( argv[0][1] ) {
|
||||
case 'N':
|
||||
++argv;
|
||||
only_if_newer = 1;
|
||||
break;
|
||||
case 'c':
|
||||
++argv;
|
||||
/* We always copy, regardless */
|
||||
break;
|
||||
case 'v':
|
||||
++argv;
|
||||
verbose = 1;
|
||||
break;
|
||||
case 'V':
|
||||
++argv;
|
||||
suffix = *argv;
|
||||
++argv;
|
||||
break;
|
||||
case 'm':
|
||||
++argv;
|
||||
mode = *argv;
|
||||
++argv;
|
||||
break;
|
||||
default:
|
||||
fatal( NULL );
|
||||
}
|
||||
}
|
||||
|
||||
/* Separate source file(s) from dest directory or file */
|
||||
#if 0
|
||||
if ( !argv[0] || !argv[1] )
|
||||
fatal( "missing files or invalid destination" );
|
||||
#else
|
||||
/* We used to require at least one file; not any more */
|
||||
if ( !argv[0] )
|
||||
fatal( "missing files or invalid destination" );
|
||||
if ( !argv[1] )
|
||||
return 0;
|
||||
#endif
|
||||
for ( pp = argv; *pp; ++pp )
|
||||
continue;
|
||||
--pp;
|
||||
dest = *pp;
|
||||
*pp = NULL;
|
||||
|
||||
/* Process the arguments */
|
||||
for (; *argv; ++argv ) {
|
||||
char * f = *argv;
|
||||
char * leaf = basename( f );
|
||||
char target[ 128 ];
|
||||
|
||||
strcpy( target, dest );
|
||||
|
||||
if ( is_dir( target ) ) {
|
||||
strcat( target, "/" );
|
||||
/* if we were given a suffix, then add it as appropriate */
|
||||
if ( suffix ) {
|
||||
char * dot = strchr( leaf, '.' );
|
||||
if ( dot ) {
|
||||
strncat( target, leaf, dot-leaf );
|
||||
strcat( target, suffix );
|
||||
strcat( target, dot );
|
||||
if ( verbose )
|
||||
printf( "%s: %s will be installed as %s",
|
||||
progname, f, strrchr(target,'/')+1 );
|
||||
} else {
|
||||
strcat( target, leaf );
|
||||
strcat( target, suffix );
|
||||
}
|
||||
} else {
|
||||
strcat( target, leaf );
|
||||
}
|
||||
}
|
||||
|
||||
if ( access( f, 0 ) ) {
|
||||
char buf[200];
|
||||
sprintf( buf, "cannot read %s", f );
|
||||
fatal( buf );
|
||||
}
|
||||
|
||||
if ( only_if_newer && is_file( target ) && !newer( f, target ) ) {
|
||||
if ( verbose )
|
||||
printf( "'%s' not newer than '%s'\n", f, target );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( verbose )
|
||||
printf( "rm -f %s\n", target );
|
||||
if ( chmod( target, 0777 ) )
|
||||
if ( verbose )
|
||||
perror( target );
|
||||
if ( unlink( target ) )
|
||||
if ( verbose )
|
||||
perror( target );
|
||||
if ( verbose )
|
||||
printf( "cp -p %s %s\n", f, target );
|
||||
if ( filecopy( target, f, 1 ) )
|
||||
return 1;
|
||||
if ( mode ) {
|
||||
char buf[ 255 ];
|
||||
sprintf( buf, "chmod %s %s\n", mode, target );
|
||||
if ( verbose )
|
||||
printf( "%s\n", buf );
|
||||
system( buf );
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
|
||||
begin 664 ifc.exe
|
||||
M(VEN8VQU9&4@/'-T9&EO+F@^#0HC:6YC;'5D92 \<W1R:6YG+F@^#0HC:6YC
|
||||
M;'5D92 \<')O8V5S<RYH/@T*#0HC:6YC;'5D92 \:6\N:#X-"@T*=F]I9" J
|
||||
M('AM86QL;V,H(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
|
||||
M("HI;6%L;&]C*"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)9G!R:6YT
|
||||
M9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H(#$@*3L-
|
||||
M"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0IV;VED("H@>')E86QL;V,H('9O
|
||||
M:60@*B!O;&0L(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
|
||||
M("HI<F5A;&QO8R@@;VQD+"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)
|
||||
M9G!R:6YT9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H
|
||||
M(#$@*3L-"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0H-"F-H87(@*BH@87)G
|
||||
M=E]F:7@H(&EN=" J(&%R9V,L(&-H87(@*BH@87)G=B I#0I[#0H@(" @8VAA
|
||||
M<B J*B!N97<@/2!.54Q,.PT*(" @(&EN=" @(" @;6%X(#T@,C [#0H@(" @
|
||||
M:6YT"2 @("!C;G0@/2 P.PT*(" @(&EN= D@(" @:CL-"@T*(" @(&9O<B H
|
||||
M(&H@/2 Q.R!A<F=V6VI=.R K*VH@*0T*"6EF("@@87)G=EMJ75LP72 ]/2 G
|
||||
M0"<@)B8@86-C97-S*&%R9W9;:ETK,2PP*3T]," I#0H)(" @(&)R96%K.PT*
|
||||
M(" @(&EF("@@87)G=EMJ72 ]/2!.54Q,("D-"@ER971U<FX@87)G=CL-"@T*
|
||||
M(" @(&YE=R ]("AC:&%R("HJ*7AM86QL;V,H(&UA>" J('-I>F5O9B J;F5W
|
||||
M("D[#0H@(" @;F5W6V-N="LK72 ]("IA<F=V*RL[#0H@(" @9F]R("@@.R J
|
||||
M87)G=CL@*RMA<F=V("D@('L-"@EI9B H(&-N=" ^/2!M87@@*0T*"2 @("!N
|
||||
M97<@/2 H8VAA<B J*BER96%L;&]C*"!N97<L("AM87@J/3(I("H@<VEZ96]F
|
||||
M("IN97<@*3L-"@D@(" @#0H):68@*"!A<F=V6S!=6S!=("$]("= )R!\?"!A
|
||||
M8V-E<W,H87)G=ELP72LQ+# I("D@('L-"@D@(" @;F5W6V-N="LK72 ]("IA
|
||||
M<F=V.PT*"7T@96QS92R(B I.PT*"2 @("!I
|
||||
M9B H("%F("D@('L-"@D)<&5R<F]R*"!A<F=V6S!=*S$@*3L-"@D)97AI="@@
|
||||
M,B I.PT*"2 @("!]#0H)(" @('=H:6QE("@@9F=E=',H(&QI;F4L('-I>F5O
|
||||
M9B!L:6YE+"!F("D@*2 @>PT*"0EI;G0@;&5N(#T@<W1R;&5N*"!L:6YE("D[
|
||||
M#0H)"2\J(&1E;&5T92!T<F%I;&EN9R!N97=L:6YE<R J+PT*"0EW:&EL92 H
|
||||
M(&QI;F5;;&5N+3%=(#T]("=<;B<@?'P@;&EN95ML96XM,5T@/3T@)UQR)R I
|
||||
M#0H)"2 @("!L:6YE6RTM;&5N72 ]("=<,"<[#0H)"6EF("@@8VYT(#X](&UA
|
||||
M>" I#0H)"2 @("!N97<@/2 H8VAA<B J*BEX<F5A;&QO8R@@;F5W+" H;6%X
|
||||
M*CTR*2 J('-I>F5O9B J;F5W("D[#0H)"6YE=UMC;G1=(#T@*&-H87(@*BEX
|
||||
M;6%L;&]C*"!L96XK,2 I.PT*"0ES=')C<'DH(&YE=UMC;G1=+"!L:6YE("D[
|
||||
M#0H)"2LK8VYT.PT*"2 @("!]#0H)(" @(&9C;&]S92@@9B I.PT*"7T)#0H@
|
||||
M(" @?0T*(" @(&EF("@@8VYT(#X](&UA>" I#0H);F5W(#T@*&-H87(@*BHI
|
||||
M>')E86QL;V,H(&YE=RP@*&UA>"LQ*2 J('-I>F5O9B J;F5W("D[#0H@(" @
|
||||
M;F5W6V-N=%T@/2!.54Q,.PT*(" @("IA<F=C(#T@8VYT.PT*(" @(')E='5R
|
||||
M;B!N97<[#0I]#0H-"@T*8V]N<W0@8VAA<B J(%5304=%(#T@#0HB=7-A9V4Z
|
||||
M("1P<F]G;F%M92!;("UC3G9M5B!=(&9I;&4@6R!F:6QE("XN+B!=(&1E<W0M
|
||||
M9&ER96-T;W)Y+6]R+69I;&5<;B(-"B(@(" @(" @("UV(" @(" @(" @("TM
|
||||
M('9E<F)O<V5<;B(-"B(@(" @(" @("U6('-U9F9I>" @("TM('-U9F9I>"!T
|
||||
M;R!A<'!E;F0@=&\@=&%R9V5T<R H8F5F;W)E(&%N>2 N('-U9F9I>"E<;B(-
|
||||
M"B(@(" @(" @(" @(" @(" @(" @(" @("!E9SH@+58@7V<@=V]U;&0@8VAA
|
||||
M;F=E("=F;V\G('1O("=F;V]?9R<@86YD7&XB#0HB(" @(" @(" @(" @(" @
|
||||
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" G;&EB9F]O+F$G('1O
|
||||
M("=L:6)F;V]?9RYA)UQN(@T*(B @(" @(" @+6T@;6]D92 @(" @+2T@;6]D
|
||||
M92!F;W(@;F5W(&9I;&4H<RE<;B(-"B(@(" @(" @("UC(" @(" @(" @("TM
|
||||
M(&-O<'D@:6YS=&5A9"!O9B!M;W9E("AA;'=A>7,@;VXI7&XB#0HB(" @(" @
|
||||
M(" M3B @(" @(" @(" M+2!C;W!Y(&]N;'D@:68@<V]U<F-E(&ES(&YE=V5R
|
||||
M('1H86X@=&%R9V5T7&XB#0H[#0H-"G9O:60@9F%T86PH(&-H87(@*B!M<V<@
|
||||
M*0T*>PT*(" @(&EF("@@;7-G("D-"@EF<')I;G1F*"!S=&1E<G(L("(E<UQN
|
||||
M(BP@;7-G("D[#0H@(" @9G!R:6YT9B@@<W1D97)R+" B)7,B+"!54T%'12 I
|
||||
M.PT*(" @(&5X:70H(#$@*3L-"GT-"@T*8VAA<B J(&)A<V5N86UE*"!C:&%R
|
||||
M("H@9B I#0I[#0H@(" @8VAA<B J(&(@/2!S=')R8VAR*"!F+" G+R<@*3L-
|
||||
M"B @("!I9B H(&(@*0DK*V([#0H@(" @96QS90EB(#T@9CL-"B @("!R971U
|
||||
M<FX@8CL-"GT-"@T*(VEN8VQU9&4@/'-Y<R]S=&%T+F@^#0II;G0@:7-?9&ER
|
||||
M*"!C:&%R("H@<&%T:" I#0I[#0H@(" @<W1R=6-T('-T870@8G5F.PT*(" @
|
||||
M(&EF("@@<W1A="@@<&%T:"P@)F)U9B I("D-"@ER971U<FX@,#L-"B @("!R
|
||||
M971U<FX@8G5F+G-T7VUO9&4@)B!37TE&1$E2.PT*?0T*:6YT(&ES7V9I;&4H
|
||||
M(&-H87(@*B!P871H("D-"GL-"B @("!S=')U8W0@<W1A="!B=68[#0H@(" @
|
||||
M:68@*"!S=&%T*"!P871H+" F8G5F("D@*0T*"7)E='5R;B P.PT*(" @(')E
|
||||
M='5R;B!B=68N<W1?;6]D92 F(%-?249214<[#0I]#0II;G0@;F5W97(H(&-H
|
||||
M87(@*B!P,2P@8VAA<B J(' R("D-"GL-"B @("!S=')U8W0@<W1A="!B=68Q
|
||||
M.PT*(" @('-T<G5C="!S=&%T(&)U9C([#0H@(" @:68@*"!S=&%T*"!P,2P@
|
||||
M)F)U9C$@*2 I#0H)<F5T=7)N(# [#0H@(" @:68@*"!S=&%T*"!P,BP@)F)U
|
||||
M9C(@*2 I#0H)<F5T=7)N(# [#0H@(" @<F5T=7)N(&)U9C$N<W1?;71I;64@
|
||||
M/B!B=68R+G-T7VUT:6UE.PT*?0T*#0II;G0@9FEL96-O<'DH(&-H87(@*B!D
|
||||
M+"!C:&%R("H@<RP@:6YT('!R97-E<G9E7W1I;64@*0T*>PT*(VEF(# -"B @
|
||||
M("!I;G0)"7-T871U<SL-"B @("!C:&%R(" @(" @*B!A<F=V6R U(%T[#0H@
|
||||
M(" @87)G=ELP72 ](")C<"([#0H@(" @87)G=ELQ72 ]("(M<"([#0H@(" @
|
||||
M87)G=ELR72 ](',[#0H@(" @87)G=ELS72 ](&0[#0H@(" @87)G=ELT72 ]
|
||||
M($Y53$P[#0H@(" @<W1A='5S(#T@<W!A=VYV<"@@4%]704E4+"!A<F=V6S!=
|
||||
M+"!A<F=V("D[#0H@(" @:68@*"!S=&%T=7,@*0T*"7!E<G)O<B@@(F-P(B I
|
||||
M.PT*(" @(')E='5R;B!S=&%T=7,[#0HC96QS90T*(" @($9)3$4@(" @(" J
|
||||
M(&9S.PT*(" @($9)3$4@(" @(" J(&9D.PT*(" @(&-H87()8G5F9F5R6R X
|
||||
M,3DR(%T[#0H@(" @:6YT"0EN.PT*(" @('-T<G5C="!F=&EM90E7:&5N.PT*
|
||||
M(" @('-T<G5C="!S=&%T"0E3=&%T.PT*#0H@(" @9G,@/2!F;W!E;B@@<RP@
|
||||
M(G)B(B I.PT*(" @(&EF("@@9G,@/3T@3E5,3" I("![#0H)<&5R<F]R*"!S
|
||||
M("D[#0H)<F5T=7)N(#$[#0H@(" @?0T*(" @(&9D(#T@9F]P96XH(&0L(")W
|
||||
M8B(@*3L-"B @("!I9B H(&9D(#T]($Y53$P@*2 @>PT*"7!E<G)O<B@@9" I
|
||||
M.PT*"69C;&]S92@@9G,@*3L-"@ER971U<FX@,CL-"B @("!]#0H-"B @("!I
|
||||
M9B H('!R97-E<G9E7W1I;64@*0T*"6EF("@@9V5T9G1I;64H(&9I;&5N;RAF
|
||||
M<RDL("97:&5N("D@*2 @>PT*"2 @("!P97)R;W(H(',@*3L-"@D@(" @<')E
|
||||
M<V5R=F5?=&EM92 ](# [#0H)?0T*#0H@(" @9&\@>PT*"6X@/2!F<F5A9"@@
|
||||
M8G5F9F5R+" Q+"!S:7IE;V8@8G5F9F5R+"!F<R I.PT*"6EF("@@;B ^(# @
|
||||
M*0T*"2 @("!I9B H(&9W<FET92@@8G5F9F5R+" Q+"!N+"!F9" I(#P@," I
|
||||
M("![#0H)"7!E<G)O<B@@9" I.PT*"0ER971U<FX@,SL-"@D@(" @?0T*(" @
|
||||
M('T@=VAI;&4@*"!N(#X@," I.R @(" -"@T*(" @(&9C;&]S92@@9G,@*3L-
|
||||
M"@T*(" @("\J($9I>"!T:6UE('-T86UP("HO#0H@(" @:68@*"!P<F5S97)V
|
||||
M95]T:6UE("D-"@EI9B H('-E=&9T:6UE*"!F:6QE;F\H9F0I+" F5VAE;B I
|
||||
M("D@('L-"@D@(" @<&5R<F]R*"!S("D[#0H)(" @('!R97-E<G9E7W1I;64@
|
||||
M/2 P.PT*"7T-"B @("!F8VQO<V4H(&9D("D[#0H-"B @(" O*B!&:7@@86-C
|
||||
M97-S(')I9VAT<R J+PT*(" @(&EF("@@<W1A="@@<RP@)E-T870@*2 I#0H)
|
||||
M<&5R<F]R*"!S("D[#0H@(" @96QS92!I9B H(&-H;6]D*"!D+"!3=&%T+G-T
|
||||
M7VUO9&4@*2 I#0H)<&5R<F]R*"!D("D[#0H-"B @("!R971U<FX@,#L-"B-E
|
||||
M;F1I9@T*?0T*#0H-"@T*#0H-"FEN="!M86EN*"!I;G0@87)G8RP@8VAA<B J
|
||||
M(&%R9W9;72 I#0I[#0H@(" @8VAA<B J"7!R;V=N86UE.PT*(" @(&EN= D)
|
||||
M=F5R8F]S92 ](# [#0H@(" @:6YT"0EO;FQY7VEF7VYE=V5R/2 P.PT*(" @
|
||||
M(&-H87(@*@ES=69F:7@@(#T@3E5,3#L-"B @("!C:&%R("H);6]D90D]($Y5
|
||||
M3$P[#0H@(" @8VAA<B J( ED97-T.PT*(" @(&-H87(@*BH)<' [#0H-"B @
|
||||
M("!A<F=V(#T@87)G=E]F:7@H("9A<F=C+"!A<F=V("D[#0H-"B @("!P<F]G
|
||||
M;F%M92 ](&)A<V5N86UE*" J87)G=BLK("D[#0H-"B @(" O*B!P<F]C97-S
|
||||
M('1H92!O<'1I;VYS("HO#0H@(" @=VAI;&4@*"!A<F=V6S!=(" F)B @87)G
|
||||
M=ELP75LP72 ]/2 G+2<@*2 @>PT*"7-W:71C:" H(&%R9W9;,%U;,5T@*2 @
|
||||
M>PT*"2 @("!C87-E("=.)SH-"@D@(" @(" @("LK87)G=CL-"@D);VYL>5]I
|
||||
M9E]N97=E<B ](#$[#0H)"6)R96%K.PT*"2 @("!C87-E("=C)SH-"@D@(" @
|
||||
M(" @("LK87)G=CL-"@D)+RH@5V4@86QW87ES(&-O<'DL(')E9V%R9&QE<W,@
|
||||
M*B\-"@D)8G)E86L[#0H)(" @(&-A<V4@)W8G.@T*"0DK*V%R9W8[#0H)"79E
|
||||
M<F)O<V4@/2 Q.PT*"0EB<F5A:SL-"@D@(" @8V%S92 G5B<Z#0H)"2LK87)G
|
||||
M=CL-"@D)<W5F9FEX(#T@*F%R9W8[#0H)"2LK87)G=CL-"@D)8G)E86L[#0H)
|
||||
M(" @(&-A<V4@)VTG.@T*"0DK*V%R9W8[#0H)"6UO9&4@/2 J87)G=CL-"@D)
|
||||
M*RMA<F=V.PT*"0EB<F5A:SL-"@D@(" @9&5F875L=#H-"@D)9F%T86PH($Y5
|
||||
M3$P@*3L-"@E]#0H@(" @?0T*#0H@(" @+RH@4V5P87)A=&4@<V]U<F-E(&9I
|
||||
M;&4H<RD@9G)O;2!D97-T(&1I<F5C=&]R>2!O<B!F:6QE("HO#0HC:68@, T*
|
||||
M(" @(&EF("@@(6%R9W9;,%T@?'P@(6%R9W9;,5T@*0T*"69A=&%L*" B;6ES
|
||||
M<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*(V5L<V4-
|
||||
M"B @(" O*B!792!U<V5D('1O(')E<75I<F4@870@;&5A<W0@;VYE(&9I;&4[
|
||||
M(&YO="!A;GD@;6]R92 J+PT*(" @(&EF("@@(6%R9W9;,%T@*0T*"69A=&%L
|
||||
M*" B;6ES<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*
|
||||
M(" @(&EF("@@(6%R9W9;,5T@*0T*"7)E='5R;B P.PT*(V5N9&EF#0H@(" @
|
||||
M9F]R("@@<' @/2!A<F=V.R J<' [("LK<' @*0T*"6-O;G1I;G5E.PT*(" @
|
||||
M("TM<' [#0H@(" @9&5S=" ]("IP<#L-"B @(" J<' @/2!.54Q,.PT*#0H@
|
||||
M(" @+RH@4')O8V5S<R!T:&4@87)G=6UE;G1S("HO#0H@(" @9F]R("@[("IA
|
||||
M<F=V.R K*V%R9W8@*2 @>PT*"6-H87(@*B!F(#T@*F%R9W8[#0H)8VAA<B J
|
||||
M(&QE868@/2!B87-E;F%M92@@9B I.PT*"6-H87(@=&%R9V5T6R Q,C@@73L-
|
||||
M"@T*"7-T<F-P>2@@=&%R9V5T+"!D97-T("D[#0H-"@EI9B H(&ES7V1I<B@@
|
||||
M=&%R9V5T("D@*2 @>PT*"2 @("!S=')C870H('1A<F=E="P@(B\B("D[#0H)
|
||||
M(" @("\J(&EF('=E('=E<F4@9VEV96X@82!S=69F:7@L('1H96X@861D(&ET
|
||||
M(&%S(&%P<')O<')I871E("HO#0H)(" @(&EF("@@<W5F9FEX("D@('L-"@D)
|
||||
M8VAA<B J(&1O=" ]('-T<F-H<B@@;&5A9BP@)RXG("D[#0H)"6EF("@@9&]T
|
||||
M("D@('L-"@D)(" @('-T<FYC870H('1A<F=E="P@;&5A9BP@9&]T+6QE868@
|
||||
M*3L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!S=69F:7@@*3L-"@D)(" @('-T
|
||||
M<F-A="@@=&%R9V5T+"!D;W0@*3L-"@D)(" @(&EF("@@=F5R8F]S92 I#0H)
|
||||
M"0EP<FEN=&8H("(E<SH@)7,@=VEL;"!B92!I;G-T86QL960@87,@)7,B+ T*
|
||||
M"0D)(" @(" @('!R;V=N86UE+"!F+"!S=')R8VAR*'1A<F=E="PG+R<I*S$@
|
||||
M*3L-"@D)?2!E;'-E('L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!L96%F("D[
|
||||
M#0H)"2 @("!S=')C870H('1A<F=E="P@<W5F9FEX("D[#0H)"7T-"@D@(" @
|
||||
M?2!E;'-E('L-"@D)<W1R8V%T*"!T87)G970L(&QE868@*3L-"@D@(" @?0T*
|
||||
M"7T-"@T*"6EF("@@86-C97-S*"!F+" P("D@*2 @>PT*"2 @("!C:&%R(&)U
|
||||
M9ELR,#!=.PT*"2 @("!S<')I;G1F*"!B=68L(")C86YN;W0@<F5A9" E<R(L
|
||||
M(&8@*3L-"@D@(" @9F%T86PH(&)U9B I.PT*"7T-"@T*"6EF("@@;VYL>5]I
|
||||
M9E]N97=E<B F)B!I<U]F:6QE*"!T87)G970@*2 F)B A;F5W97(H(&8L('1A
|
||||
M<F=E=" I("D@('L-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<')I;G1F*" B
|
||||
M)R5S)R!N;W0@;F5W97(@=&AA;B G)7,G7&XB+"!F+"!T87)G970@*3L-"@D@
|
||||
M(" @8V]N=&EN=64[#0H)?0T*#0H):68@*"!V97)B;W-E("D-"@D@(" @<')I
|
||||
M;G1F*" B<FT@+68@)7-<;B(L('1A<F=E=" I.PT*"6EF("@@8VAM;V0H('1A
|
||||
M<F=E="P@,#<W-R I("D-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<&5R<F]R
|
||||
M*"!T87)G970@*3L-"@EI9B H('5N;&EN:R@@=&%R9V5T("D@*0T*"2 @("!I
|
||||
M9B H('9E<F)O<V4@*0T*"0EP97)R;W(H('1A<F=E=" I.PT*"6EF("@@=F5R
|
||||
M8F]S92 I#0H)(" @('!R:6YT9B@@(F-P("UP("5S("5S7&XB+"!F+"!T87)G
|
||||
M970@*3L-"@EI9B H(&9I;&5C;W!Y*"!T87)G970L(&8L(#$@*2 I#0H)(" @
|
||||
M(')E='5R;B Q.PT*"6EF("@@;6]D92 I("![#0H)(" @(&-H87(@8G5F6R R
|
||||
M-34@73L-"@D@(" @<W!R:6YT9B@@8G5F+" B8VAM;V0@)7,@)7-<;B(L(&UO
|
||||
M9&4L('1A<F=E=" I.PT*"2 @("!I9B H('9E<F)O<V4@*0T*"0EP<FEN=&8H
|
||||
M("(E<UQN(BP@8G5F("D[#0H)(" @('-Y<W1E;2@@8G5F("D[#0H)?0T*(" @
|
||||
:('T-"@T*(" @(')E='5R;B P.PT*?0T*#0IE
|
||||
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
ifc.exe is an MS-DOS executable which is equivalent to the program
|
||||
install-if-change. It was compiled using Borland C 2.00.
|
||||
|
||||
@@ -0,0 +1,331 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <process.h>
|
||||
|
||||
#include <io.h>
|
||||
|
||||
void * xmalloc( int size )
|
||||
{
|
||||
void * p = (void *)malloc( size );
|
||||
if ( !p ) {
|
||||
fprintf( stderr, "out of memory\n" );
|
||||
exit( 1 );
|
||||
}
|
||||
return p;
|
||||
}
|
||||
void * xrealloc( void * old, int size )
|
||||
{
|
||||
void * p = (void *)realloc( old, size );
|
||||
if ( !p ) {
|
||||
fprintf( stderr, "out of memory\n" );
|
||||
exit( 1 );
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
char ** argv_fix( int * argc, char ** argv )
|
||||
{
|
||||
char ** new = NULL;
|
||||
int max = 20;
|
||||
int cnt = 0;
|
||||
int j;
|
||||
|
||||
for ( j = 1; argv[j]; ++j )
|
||||
if ( argv[j][0] == '@' && access(argv[j]+1,0)==0 )
|
||||
break;
|
||||
if ( argv[j] == NULL )
|
||||
return argv;
|
||||
|
||||
new = (char **)xmalloc( max * sizeof *new );
|
||||
new[cnt++] = *argv++;
|
||||
for ( ; *argv; ++argv ) {
|
||||
if ( cnt >= max )
|
||||
new = (char **)realloc( new, (max*=2) * sizeof *new );
|
||||
|
||||
if ( argv[0][0] != '@' || access(argv[0]+1,0) ) {
|
||||
new[cnt++] = *argv;
|
||||
} else {
|
||||
char line[ 1000 ];
|
||||
FILE * f = fopen( argv[0]+1, "r" );
|
||||
if ( !f ) {
|
||||
perror( argv[0]+1 );
|
||||
exit( 2 );
|
||||
}
|
||||
while ( fgets( line, sizeof line, f ) ) {
|
||||
int len = strlen( line );
|
||||
/* delete trailing newlines */
|
||||
while ( line[len-1] == '\n' || line[len-1] == '\r' )
|
||||
line[--len] = '\0';
|
||||
if ( cnt >= max )
|
||||
new = (char **)xrealloc( new, (max*=2) * sizeof *new );
|
||||
new[cnt] = (char *)xmalloc( len+1 );
|
||||
strcpy( new[cnt], line );
|
||||
++cnt;
|
||||
}
|
||||
fclose( f );
|
||||
}
|
||||
}
|
||||
if ( cnt >= max )
|
||||
new = (char **)xrealloc( new, (max+1) * sizeof *new );
|
||||
new[cnt] = NULL;
|
||||
*argc = cnt;
|
||||
return new;
|
||||
}
|
||||
|
||||
|
||||
const char * USAGE =
|
||||
"usage: $progname [ -cNvmV ] file [ file ... ] dest-directory-or-file\n"
|
||||
" -v -- verbose\n"
|
||||
" -V suffix -- suffix to append to targets (before any . suffix)\n"
|
||||
" eg: -V _g would change 'foo' to 'foo_g' and\n"
|
||||
" 'libfoo.a' to 'libfoo_g.a'\n"
|
||||
" -m mode -- mode for new file(s)\n"
|
||||
" -c -- copy instead of move (always on)\n"
|
||||
" -N -- copy only if source is newer than target\n"
|
||||
;
|
||||
|
||||
void fatal( char * msg )
|
||||
{
|
||||
if ( msg )
|
||||
fprintf( stderr, "%s\n", msg );
|
||||
fprintf( stderr, "%s", USAGE );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
char * basename( char * f )
|
||||
{
|
||||
char * b = strrchr( f, '/' );
|
||||
if ( b ) ++b;
|
||||
else b = f;
|
||||
return b;
|
||||
}
|
||||
|
||||
#include <sys/stat.h>
|
||||
int is_dir( char * path )
|
||||
{
|
||||
struct stat buf;
|
||||
if ( stat( path, &buf ) )
|
||||
return 0;
|
||||
return buf.st_mode & S_IFDIR;
|
||||
}
|
||||
int is_file( char * path )
|
||||
{
|
||||
struct stat buf;
|
||||
if ( stat( path, &buf ) )
|
||||
return 0;
|
||||
return buf.st_mode & S_IFREG;
|
||||
}
|
||||
int newer( char * p1, char * p2 )
|
||||
{
|
||||
struct stat buf1;
|
||||
struct stat buf2;
|
||||
if ( stat( p1, &buf1 ) )
|
||||
return 0;
|
||||
if ( stat( p2, &buf2 ) )
|
||||
return 0;
|
||||
return buf1.st_mtime > buf2.st_mtime;
|
||||
}
|
||||
|
||||
int filecopy( char * d, char * s, int preserve_time )
|
||||
{
|
||||
#if 0
|
||||
int status;
|
||||
char * argv[ 5 ];
|
||||
argv[0] = "cp";
|
||||
argv[1] = "-p";
|
||||
argv[2] = s;
|
||||
argv[3] = d;
|
||||
argv[4] = NULL;
|
||||
status = spawnvp( P_WAIT, argv[0], argv );
|
||||
if ( status )
|
||||
perror( "cp" );
|
||||
return status;
|
||||
#else
|
||||
FILE * fs;
|
||||
FILE * fd;
|
||||
char buffer[ 8192 ];
|
||||
int n;
|
||||
struct ftime When;
|
||||
struct stat Stat;
|
||||
|
||||
fs = fopen( s, "rb" );
|
||||
if ( fs == NULL ) {
|
||||
perror( s );
|
||||
return 1;
|
||||
}
|
||||
fd = fopen( d, "wb" );
|
||||
if ( fd == NULL ) {
|
||||
perror( d );
|
||||
fclose( fs );
|
||||
return 2;
|
||||
}
|
||||
|
||||
if ( preserve_time )
|
||||
if ( getftime( fileno(fs), &When ) ) {
|
||||
perror( s );
|
||||
preserve_time = 0;
|
||||
}
|
||||
|
||||
do {
|
||||
n = fread( buffer, 1, sizeof buffer, fs );
|
||||
if ( n > 0 )
|
||||
if ( fwrite( buffer, 1, n, fd ) < 0 ) {
|
||||
perror( d );
|
||||
return 3;
|
||||
}
|
||||
} while ( n > 0 );
|
||||
|
||||
fclose( fs );
|
||||
|
||||
/* Fix time stamp */
|
||||
if ( preserve_time )
|
||||
if ( setftime( fileno(fd), &When ) ) {
|
||||
perror( s );
|
||||
preserve_time = 0;
|
||||
}
|
||||
fclose( fd );
|
||||
|
||||
/* Fix access rights */
|
||||
if ( stat( s, &Stat ) )
|
||||
perror( s );
|
||||
else if ( chmod( d, Stat.st_mode ) )
|
||||
perror( d );
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int main( int argc, char * argv[] )
|
||||
{
|
||||
char * progname;
|
||||
int verbose = 0;
|
||||
int only_if_newer= 0;
|
||||
char * suffix = NULL;
|
||||
char * mode = NULL;
|
||||
char * dest;
|
||||
char ** pp;
|
||||
|
||||
argv = argv_fix( &argc, argv );
|
||||
|
||||
progname = basename( *argv++ );
|
||||
|
||||
/* process the options */
|
||||
while ( argv[0] && argv[0][0] == '-' ) {
|
||||
switch ( argv[0][1] ) {
|
||||
case 'N':
|
||||
++argv;
|
||||
only_if_newer = 1;
|
||||
break;
|
||||
case 'c':
|
||||
++argv;
|
||||
/* We always copy, regardless */
|
||||
break;
|
||||
case 'v':
|
||||
++argv;
|
||||
verbose = 1;
|
||||
break;
|
||||
case 'V':
|
||||
++argv;
|
||||
suffix = *argv;
|
||||
++argv;
|
||||
break;
|
||||
case 'm':
|
||||
++argv;
|
||||
mode = *argv;
|
||||
++argv;
|
||||
break;
|
||||
default:
|
||||
fatal( NULL );
|
||||
}
|
||||
}
|
||||
|
||||
/* Separate source file(s) from dest directory or file */
|
||||
#if 0
|
||||
if ( !argv[0] || !argv[1] )
|
||||
fatal( "missing files or invalid destination" );
|
||||
#else
|
||||
/* We used to require at least one file; not any more */
|
||||
if ( !argv[0] )
|
||||
fatal( "missing files or invalid destination" );
|
||||
if ( !argv[1] )
|
||||
return 0;
|
||||
#endif
|
||||
for ( pp = argv; *pp; ++pp )
|
||||
continue;
|
||||
--pp;
|
||||
dest = *pp;
|
||||
*pp = NULL;
|
||||
|
||||
/* Process the arguments */
|
||||
for (; *argv; ++argv ) {
|
||||
char * f = *argv;
|
||||
char * leaf = basename( f );
|
||||
char target[ 128 ];
|
||||
|
||||
strcpy( target, dest );
|
||||
|
||||
if ( is_dir( target ) ) {
|
||||
strcat( target, "/" );
|
||||
/* if we were given a suffix, then add it as appropriate */
|
||||
if ( suffix ) {
|
||||
char * dot = strchr( leaf, '.' );
|
||||
if ( dot ) {
|
||||
strncat( target, leaf, dot-leaf );
|
||||
strcat( target, suffix );
|
||||
strcat( target, dot );
|
||||
if ( verbose )
|
||||
printf( "%s: %s will be installed as %s",
|
||||
progname, f, strrchr(target,'/')+1 );
|
||||
} else {
|
||||
strcat( target, leaf );
|
||||
strcat( target, suffix );
|
||||
}
|
||||
} else {
|
||||
strcat( target, leaf );
|
||||
}
|
||||
}
|
||||
|
||||
if ( access( f, 0 ) ) {
|
||||
char buf[200];
|
||||
sprintf( buf, "cannot read %s", f );
|
||||
fatal( buf );
|
||||
}
|
||||
|
||||
if ( only_if_newer && is_file( target ) && !newer( f, target ) ) {
|
||||
if ( verbose )
|
||||
printf( "'%s' not newer than '%s'\n", f, target );
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( verbose )
|
||||
printf( "rm -f %s\n", target );
|
||||
if ( chmod( target, 0777 ) )
|
||||
if ( verbose )
|
||||
perror( target );
|
||||
if ( unlink( target ) )
|
||||
if ( verbose )
|
||||
perror( target );
|
||||
if ( verbose )
|
||||
printf( "cp -p %s %s\n", f, target );
|
||||
if ( filecopy( target, f, 1 ) )
|
||||
return 1;
|
||||
if ( mode ) {
|
||||
char buf[ 255 ];
|
||||
sprintf( buf, "chmod %s %s\n", mode, target );
|
||||
if ( verbose )
|
||||
printf( "%s\n", buf );
|
||||
system( buf );
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
|
||||
begin 664 ifc.exe
|
||||
M(VEN8VQU9&4@/'-T9&EO+F@^#0HC:6YC;'5D92 \<W1R:6YG+F@^#0HC:6YC
|
||||
M;'5D92 \<')O8V5S<RYH/@T*#0HC:6YC;'5D92 \:6\N:#X-"@T*=F]I9" J
|
||||
M('AM86QL;V,H(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
|
||||
M("HI;6%L;&]C*"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)9G!R:6YT
|
||||
M9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H(#$@*3L-
|
||||
M"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0IV;VED("H@>')E86QL;V,H('9O
|
||||
M:60@*B!O;&0L(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
|
||||
M("HI<F5A;&QO8R@@;VQD+"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)
|
||||
M9G!R:6YT9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H
|
||||
M(#$@*3L-"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0H-"F-H87(@*BH@87)G
|
||||
M=E]F:7@H(&EN=" J(&%R9V,L(&-H87(@*BH@87)G=B I#0I[#0H@(" @8VAA
|
||||
M<B J*B!N97<@/2!.54Q,.PT*(" @(&EN=" @(" @;6%X(#T@,C [#0H@(" @
|
||||
M:6YT"2 @("!C;G0@/2 P.PT*(" @(&EN= D@(" @:CL-"@T*(" @(&9O<B H
|
||||
M(&H@/2 Q.R!A<F=V6VI=.R K*VH@*0T*"6EF("@@87)G=EMJ75LP72 ]/2 G
|
||||
M0"<@)B8@86-C97-S*&%R9W9;:ETK,2PP*3T]," I#0H)(" @(&)R96%K.PT*
|
||||
M(" @(&EF("@@87)G=EMJ72 ]/2!.54Q,("D-"@ER971U<FX@87)G=CL-"@T*
|
||||
M(" @(&YE=R ]("AC:&%R("HJ*7AM86QL;V,H(&UA>" J('-I>F5O9B J;F5W
|
||||
M("D[#0H@(" @;F5W6V-N="LK72 ]("IA<F=V*RL[#0H@(" @9F]R("@@.R J
|
||||
M87)G=CL@*RMA<F=V("D@('L-"@EI9B H(&-N=" ^/2!M87@@*0T*"2 @("!N
|
||||
M97<@/2 H8VAA<B J*BER96%L;&]C*"!N97<L("AM87@J/3(I("H@<VEZ96]F
|
||||
M("IN97<@*3L-"@D@(" @#0H):68@*"!A<F=V6S!=6S!=("$]("= )R!\?"!A
|
||||
M8V-E<W,H87)G=ELP72LQ+# I("D@('L-"@D@(" @;F5W6V-N="LK72 ]("IA
|
||||
M<F=V.PT*"7T@96QS92R(B I.PT*"2 @("!I
|
||||
M9B H("%F("D@('L-"@D)<&5R<F]R*"!A<F=V6S!=*S$@*3L-"@D)97AI="@@
|
||||
M,B I.PT*"2 @("!]#0H)(" @('=H:6QE("@@9F=E=',H(&QI;F4L('-I>F5O
|
||||
M9B!L:6YE+"!F("D@*2 @>PT*"0EI;G0@;&5N(#T@<W1R;&5N*"!L:6YE("D[
|
||||
M#0H)"2\J(&1E;&5T92!T<F%I;&EN9R!N97=L:6YE<R J+PT*"0EW:&EL92 H
|
||||
M(&QI;F5;;&5N+3%=(#T]("=<;B<@?'P@;&EN95ML96XM,5T@/3T@)UQR)R I
|
||||
M#0H)"2 @("!L:6YE6RTM;&5N72 ]("=<,"<[#0H)"6EF("@@8VYT(#X](&UA
|
||||
M>" I#0H)"2 @("!N97<@/2 H8VAA<B J*BEX<F5A;&QO8R@@;F5W+" H;6%X
|
||||
M*CTR*2 J('-I>F5O9B J;F5W("D[#0H)"6YE=UMC;G1=(#T@*&-H87(@*BEX
|
||||
M;6%L;&]C*"!L96XK,2 I.PT*"0ES=')C<'DH(&YE=UMC;G1=+"!L:6YE("D[
|
||||
M#0H)"2LK8VYT.PT*"2 @("!]#0H)(" @(&9C;&]S92@@9B I.PT*"7T)#0H@
|
||||
M(" @?0T*(" @(&EF("@@8VYT(#X](&UA>" I#0H);F5W(#T@*&-H87(@*BHI
|
||||
M>')E86QL;V,H(&YE=RP@*&UA>"LQ*2 J('-I>F5O9B J;F5W("D[#0H@(" @
|
||||
M;F5W6V-N=%T@/2!.54Q,.PT*(" @("IA<F=C(#T@8VYT.PT*(" @(')E='5R
|
||||
M;B!N97<[#0I]#0H-"@T*8V]N<W0@8VAA<B J(%5304=%(#T@#0HB=7-A9V4Z
|
||||
M("1P<F]G;F%M92!;("UC3G9M5B!=(&9I;&4@6R!F:6QE("XN+B!=(&1E<W0M
|
||||
M9&ER96-T;W)Y+6]R+69I;&5<;B(-"B(@(" @(" @("UV(" @(" @(" @("TM
|
||||
M('9E<F)O<V5<;B(-"B(@(" @(" @("U6('-U9F9I>" @("TM('-U9F9I>"!T
|
||||
M;R!A<'!E;F0@=&\@=&%R9V5T<R H8F5F;W)E(&%N>2 N('-U9F9I>"E<;B(-
|
||||
M"B(@(" @(" @(" @(" @(" @(" @(" @("!E9SH@+58@7V<@=V]U;&0@8VAA
|
||||
M;F=E("=F;V\G('1O("=F;V]?9R<@86YD7&XB#0HB(" @(" @(" @(" @(" @
|
||||
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" G;&EB9F]O+F$G('1O
|
||||
M("=L:6)F;V]?9RYA)UQN(@T*(B @(" @(" @+6T@;6]D92 @(" @+2T@;6]D
|
||||
M92!F;W(@;F5W(&9I;&4H<RE<;B(-"B(@(" @(" @("UC(" @(" @(" @("TM
|
||||
M(&-O<'D@:6YS=&5A9"!O9B!M;W9E("AA;'=A>7,@;VXI7&XB#0HB(" @(" @
|
||||
M(" M3B @(" @(" @(" M+2!C;W!Y(&]N;'D@:68@<V]U<F-E(&ES(&YE=V5R
|
||||
M('1H86X@=&%R9V5T7&XB#0H[#0H-"G9O:60@9F%T86PH(&-H87(@*B!M<V<@
|
||||
M*0T*>PT*(" @(&EF("@@;7-G("D-"@EF<')I;G1F*"!S=&1E<G(L("(E<UQN
|
||||
M(BP@;7-G("D[#0H@(" @9G!R:6YT9B@@<W1D97)R+" B)7,B+"!54T%'12 I
|
||||
M.PT*(" @(&5X:70H(#$@*3L-"GT-"@T*8VAA<B J(&)A<V5N86UE*"!C:&%R
|
||||
M("H@9B I#0I[#0H@(" @8VAA<B J(&(@/2!S=')R8VAR*"!F+" G+R<@*3L-
|
||||
M"B @("!I9B H(&(@*0DK*V([#0H@(" @96QS90EB(#T@9CL-"B @("!R971U
|
||||
M<FX@8CL-"GT-"@T*(VEN8VQU9&4@/'-Y<R]S=&%T+F@^#0II;G0@:7-?9&ER
|
||||
M*"!C:&%R("H@<&%T:" I#0I[#0H@(" @<W1R=6-T('-T870@8G5F.PT*(" @
|
||||
M(&EF("@@<W1A="@@<&%T:"P@)F)U9B I("D-"@ER971U<FX@,#L-"B @("!R
|
||||
M971U<FX@8G5F+G-T7VUO9&4@)B!37TE&1$E2.PT*?0T*:6YT(&ES7V9I;&4H
|
||||
M(&-H87(@*B!P871H("D-"GL-"B @("!S=')U8W0@<W1A="!B=68[#0H@(" @
|
||||
M:68@*"!S=&%T*"!P871H+" F8G5F("D@*0T*"7)E='5R;B P.PT*(" @(')E
|
||||
M='5R;B!B=68N<W1?;6]D92 F(%-?249214<[#0I]#0II;G0@;F5W97(H(&-H
|
||||
M87(@*B!P,2P@8VAA<B J(' R("D-"GL-"B @("!S=')U8W0@<W1A="!B=68Q
|
||||
M.PT*(" @('-T<G5C="!S=&%T(&)U9C([#0H@(" @:68@*"!S=&%T*"!P,2P@
|
||||
M)F)U9C$@*2 I#0H)<F5T=7)N(# [#0H@(" @:68@*"!S=&%T*"!P,BP@)F)U
|
||||
M9C(@*2 I#0H)<F5T=7)N(# [#0H@(" @<F5T=7)N(&)U9C$N<W1?;71I;64@
|
||||
M/B!B=68R+G-T7VUT:6UE.PT*?0T*#0II;G0@9FEL96-O<'DH(&-H87(@*B!D
|
||||
M+"!C:&%R("H@<RP@:6YT('!R97-E<G9E7W1I;64@*0T*>PT*(VEF(# -"B @
|
||||
M("!I;G0)"7-T871U<SL-"B @("!C:&%R(" @(" @*B!A<F=V6R U(%T[#0H@
|
||||
M(" @87)G=ELP72 ](")C<"([#0H@(" @87)G=ELQ72 ]("(M<"([#0H@(" @
|
||||
M87)G=ELR72 ](',[#0H@(" @87)G=ELS72 ](&0[#0H@(" @87)G=ELT72 ]
|
||||
M($Y53$P[#0H@(" @<W1A='5S(#T@<W!A=VYV<"@@4%]704E4+"!A<F=V6S!=
|
||||
M+"!A<F=V("D[#0H@(" @:68@*"!S=&%T=7,@*0T*"7!E<G)O<B@@(F-P(B I
|
||||
M.PT*(" @(')E='5R;B!S=&%T=7,[#0HC96QS90T*(" @($9)3$4@(" @(" J
|
||||
M(&9S.PT*(" @($9)3$4@(" @(" J(&9D.PT*(" @(&-H87()8G5F9F5R6R X
|
||||
M,3DR(%T[#0H@(" @:6YT"0EN.PT*(" @('-T<G5C="!F=&EM90E7:&5N.PT*
|
||||
M(" @('-T<G5C="!S=&%T"0E3=&%T.PT*#0H@(" @9G,@/2!F;W!E;B@@<RP@
|
||||
M(G)B(B I.PT*(" @(&EF("@@9G,@/3T@3E5,3" I("![#0H)<&5R<F]R*"!S
|
||||
M("D[#0H)<F5T=7)N(#$[#0H@(" @?0T*(" @(&9D(#T@9F]P96XH(&0L(")W
|
||||
M8B(@*3L-"B @("!I9B H(&9D(#T]($Y53$P@*2 @>PT*"7!E<G)O<B@@9" I
|
||||
M.PT*"69C;&]S92@@9G,@*3L-"@ER971U<FX@,CL-"B @("!]#0H-"B @("!I
|
||||
M9B H('!R97-E<G9E7W1I;64@*0T*"6EF("@@9V5T9G1I;64H(&9I;&5N;RAF
|
||||
M<RDL("97:&5N("D@*2 @>PT*"2 @("!P97)R;W(H(',@*3L-"@D@(" @<')E
|
||||
M<V5R=F5?=&EM92 ](# [#0H)?0T*#0H@(" @9&\@>PT*"6X@/2!F<F5A9"@@
|
||||
M8G5F9F5R+" Q+"!S:7IE;V8@8G5F9F5R+"!F<R I.PT*"6EF("@@;B ^(# @
|
||||
M*0T*"2 @("!I9B H(&9W<FET92@@8G5F9F5R+" Q+"!N+"!F9" I(#P@," I
|
||||
M("![#0H)"7!E<G)O<B@@9" I.PT*"0ER971U<FX@,SL-"@D@(" @?0T*(" @
|
||||
M('T@=VAI;&4@*"!N(#X@," I.R @(" -"@T*(" @(&9C;&]S92@@9G,@*3L-
|
||||
M"@T*(" @("\J($9I>"!T:6UE('-T86UP("HO#0H@(" @:68@*"!P<F5S97)V
|
||||
M95]T:6UE("D-"@EI9B H('-E=&9T:6UE*"!F:6QE;F\H9F0I+" F5VAE;B I
|
||||
M("D@('L-"@D@(" @<&5R<F]R*"!S("D[#0H)(" @('!R97-E<G9E7W1I;64@
|
||||
M/2 P.PT*"7T-"B @("!F8VQO<V4H(&9D("D[#0H-"B @(" O*B!&:7@@86-C
|
||||
M97-S(')I9VAT<R J+PT*(" @(&EF("@@<W1A="@@<RP@)E-T870@*2 I#0H)
|
||||
M<&5R<F]R*"!S("D[#0H@(" @96QS92!I9B H(&-H;6]D*"!D+"!3=&%T+G-T
|
||||
M7VUO9&4@*2 I#0H)<&5R<F]R*"!D("D[#0H-"B @("!R971U<FX@,#L-"B-E
|
||||
M;F1I9@T*?0T*#0H-"@T*#0H-"FEN="!M86EN*"!I;G0@87)G8RP@8VAA<B J
|
||||
M(&%R9W9;72 I#0I[#0H@(" @8VAA<B J"7!R;V=N86UE.PT*(" @(&EN= D)
|
||||
M=F5R8F]S92 ](# [#0H@(" @:6YT"0EO;FQY7VEF7VYE=V5R/2 P.PT*(" @
|
||||
M(&-H87(@*@ES=69F:7@@(#T@3E5,3#L-"B @("!C:&%R("H);6]D90D]($Y5
|
||||
M3$P[#0H@(" @8VAA<B J( ED97-T.PT*(" @(&-H87(@*BH)<' [#0H-"B @
|
||||
M("!A<F=V(#T@87)G=E]F:7@H("9A<F=C+"!A<F=V("D[#0H-"B @("!P<F]G
|
||||
M;F%M92 ](&)A<V5N86UE*" J87)G=BLK("D[#0H-"B @(" O*B!P<F]C97-S
|
||||
M('1H92!O<'1I;VYS("HO#0H@(" @=VAI;&4@*"!A<F=V6S!=(" F)B @87)G
|
||||
M=ELP75LP72 ]/2 G+2<@*2 @>PT*"7-W:71C:" H(&%R9W9;,%U;,5T@*2 @
|
||||
M>PT*"2 @("!C87-E("=.)SH-"@D@(" @(" @("LK87)G=CL-"@D);VYL>5]I
|
||||
M9E]N97=E<B ](#$[#0H)"6)R96%K.PT*"2 @("!C87-E("=C)SH-"@D@(" @
|
||||
M(" @("LK87)G=CL-"@D)+RH@5V4@86QW87ES(&-O<'DL(')E9V%R9&QE<W,@
|
||||
M*B\-"@D)8G)E86L[#0H)(" @(&-A<V4@)W8G.@T*"0DK*V%R9W8[#0H)"79E
|
||||
M<F)O<V4@/2 Q.PT*"0EB<F5A:SL-"@D@(" @8V%S92 G5B<Z#0H)"2LK87)G
|
||||
M=CL-"@D)<W5F9FEX(#T@*F%R9W8[#0H)"2LK87)G=CL-"@D)8G)E86L[#0H)
|
||||
M(" @(&-A<V4@)VTG.@T*"0DK*V%R9W8[#0H)"6UO9&4@/2 J87)G=CL-"@D)
|
||||
M*RMA<F=V.PT*"0EB<F5A:SL-"@D@(" @9&5F875L=#H-"@D)9F%T86PH($Y5
|
||||
M3$P@*3L-"@E]#0H@(" @?0T*#0H@(" @+RH@4V5P87)A=&4@<V]U<F-E(&9I
|
||||
M;&4H<RD@9G)O;2!D97-T(&1I<F5C=&]R>2!O<B!F:6QE("HO#0HC:68@, T*
|
||||
M(" @(&EF("@@(6%R9W9;,%T@?'P@(6%R9W9;,5T@*0T*"69A=&%L*" B;6ES
|
||||
M<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*(V5L<V4-
|
||||
M"B @(" O*B!792!U<V5D('1O(')E<75I<F4@870@;&5A<W0@;VYE(&9I;&4[
|
||||
M(&YO="!A;GD@;6]R92 J+PT*(" @(&EF("@@(6%R9W9;,%T@*0T*"69A=&%L
|
||||
M*" B;6ES<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*
|
||||
M(" @(&EF("@@(6%R9W9;,5T@*0T*"7)E='5R;B P.PT*(V5N9&EF#0H@(" @
|
||||
M9F]R("@@<' @/2!A<F=V.R J<' [("LK<' @*0T*"6-O;G1I;G5E.PT*(" @
|
||||
M("TM<' [#0H@(" @9&5S=" ]("IP<#L-"B @(" J<' @/2!.54Q,.PT*#0H@
|
||||
M(" @+RH@4')O8V5S<R!T:&4@87)G=6UE;G1S("HO#0H@(" @9F]R("@[("IA
|
||||
M<F=V.R K*V%R9W8@*2 @>PT*"6-H87(@*B!F(#T@*F%R9W8[#0H)8VAA<B J
|
||||
M(&QE868@/2!B87-E;F%M92@@9B I.PT*"6-H87(@=&%R9V5T6R Q,C@@73L-
|
||||
M"@T*"7-T<F-P>2@@=&%R9V5T+"!D97-T("D[#0H-"@EI9B H(&ES7V1I<B@@
|
||||
M=&%R9V5T("D@*2 @>PT*"2 @("!S=')C870H('1A<F=E="P@(B\B("D[#0H)
|
||||
M(" @("\J(&EF('=E('=E<F4@9VEV96X@82!S=69F:7@L('1H96X@861D(&ET
|
||||
M(&%S(&%P<')O<')I871E("HO#0H)(" @(&EF("@@<W5F9FEX("D@('L-"@D)
|
||||
M8VAA<B J(&1O=" ]('-T<F-H<B@@;&5A9BP@)RXG("D[#0H)"6EF("@@9&]T
|
||||
M("D@('L-"@D)(" @('-T<FYC870H('1A<F=E="P@;&5A9BP@9&]T+6QE868@
|
||||
M*3L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!S=69F:7@@*3L-"@D)(" @('-T
|
||||
M<F-A="@@=&%R9V5T+"!D;W0@*3L-"@D)(" @(&EF("@@=F5R8F]S92 I#0H)
|
||||
M"0EP<FEN=&8H("(E<SH@)7,@=VEL;"!B92!I;G-T86QL960@87,@)7,B+ T*
|
||||
M"0D)(" @(" @('!R;V=N86UE+"!F+"!S=')R8VAR*'1A<F=E="PG+R<I*S$@
|
||||
M*3L-"@D)?2!E;'-E('L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!L96%F("D[
|
||||
M#0H)"2 @("!S=')C870H('1A<F=E="P@<W5F9FEX("D[#0H)"7T-"@D@(" @
|
||||
M?2!E;'-E('L-"@D)<W1R8V%T*"!T87)G970L(&QE868@*3L-"@D@(" @?0T*
|
||||
M"7T-"@T*"6EF("@@86-C97-S*"!F+" P("D@*2 @>PT*"2 @("!C:&%R(&)U
|
||||
M9ELR,#!=.PT*"2 @("!S<')I;G1F*"!B=68L(")C86YN;W0@<F5A9" E<R(L
|
||||
M(&8@*3L-"@D@(" @9F%T86PH(&)U9B I.PT*"7T-"@T*"6EF("@@;VYL>5]I
|
||||
M9E]N97=E<B F)B!I<U]F:6QE*"!T87)G970@*2 F)B A;F5W97(H(&8L('1A
|
||||
M<F=E=" I("D@('L-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<')I;G1F*" B
|
||||
M)R5S)R!N;W0@;F5W97(@=&AA;B G)7,G7&XB+"!F+"!T87)G970@*3L-"@D@
|
||||
M(" @8V]N=&EN=64[#0H)?0T*#0H):68@*"!V97)B;W-E("D-"@D@(" @<')I
|
||||
M;G1F*" B<FT@+68@)7-<;B(L('1A<F=E=" I.PT*"6EF("@@8VAM;V0H('1A
|
||||
M<F=E="P@,#<W-R I("D-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<&5R<F]R
|
||||
M*"!T87)G970@*3L-"@EI9B H('5N;&EN:R@@=&%R9V5T("D@*0T*"2 @("!I
|
||||
M9B H('9E<F)O<V4@*0T*"0EP97)R;W(H('1A<F=E=" I.PT*"6EF("@@=F5R
|
||||
M8F]S92 I#0H)(" @('!R:6YT9B@@(F-P("UP("5S("5S7&XB+"!F+"!T87)G
|
||||
M970@*3L-"@EI9B H(&9I;&5C;W!Y*"!T87)G970L(&8L(#$@*2 I#0H)(" @
|
||||
M(')E='5R;B Q.PT*"6EF("@@;6]D92 I("![#0H)(" @(&-H87(@8G5F6R R
|
||||
M-34@73L-"@D@(" @<W!R:6YT9B@@8G5F+" B8VAM;V0@)7,@)7-<;B(L(&UO
|
||||
M9&4L('1A<F=E=" I.PT*"2 @("!I9B H('9E<F)O<V4@*0T*"0EP<FEN=&8H
|
||||
M("(E<UQN(BP@8G5F("D[#0H)(" @('-Y<W1E;2@@8G5F("D[#0H)?0T*(" @
|
||||
:('T-"@T*(" @(')E='5R;B P.PT*?0T*#0IE
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user