Commit 62a99405 by Bruce Korb

Implement, but leave disabled, MSDOS functionality

From-SVN: r35479
parent d6777972
2000-08-04 Bruce Korb <bkorb@gnu.org>
* fixinc/: Verified that the MSDOS patch does not break
the UNIX functionality and applied the next three patches
from July:
2000-07-28 Eli Zaretskii <eliz@is.elta.co.il>
* fixinc/fixfixes.c (main) [__MSDOS__]: Avoid overwriting the
output file with the temporary one by appending ".X" to generate
the temporary fuile's name. If the output file already has an
extension, replace it with ".X".
* fixinc/fixincl.c (fix_with_system) [__MSDOS__]: Use $ORIGDIR,
not $DESTDIR, to find applyfix. Use sprintf instead of snprintf;
reallocate the command buffer while copying the command-line
argument. Redirect the output directly to the temporary file,
instead of going through another temporary file.
(process): Close the temporary file before unlinking it.
(machine_matches) [__MSDOS__]: If the machine doesn't match, set
the FD_SKIP_TEST flag. Pay attention to the FD_MACH_IFNOT flag.
(run_compiles): Pass p_fixd argument to machine_matches, as it
expects.
* fixinc/fixincl.sh: Export ORIGDIR. If $DJDIR is set in the
environment, assume there are no symlinks in the include
directory. When cleaning up the DONE files, look for them
case-insensitively. Don't try to remove symlinks if they aren't
there.
* fixinc/fixlib.c (make_raw_shell_str): Accept new argument smax;
all callers changed. Declare pz "const char *", to avoid compiler
warnings.
* fixinc/fixlib.h (ENV_TABLE): Get ORIGDIR from the environment.
Change prototype of make_raw_shell_str.
2000-07-27 Eli Zaretskii <eliz@is.elta.co.il>
* fixinc/fixincl.c [__MSDOS__]: Don't include "server.h".
(initialize) [__MSDOS__]: Use tempnam.
(initialize): Don't use SIGPIPE if it is not defined.
* fixinc/fixfixes.c (main) [__MSDOS__]: freopen for stdout should
return stdout.
2000-07-25 Bruce Korb <bkorb@gnu.org>
* fixinc/fix*.[ch]: substantially reworked to make it possible
to run this program without using fork(2) or pipe(2) (i.e. in
a DOS environment).
2000-08-04 Joseph S. Myers <jsm28@cam.ac.uk> 2000-08-04 Joseph S. Myers <jsm28@cam.ac.uk>
* cppdefault.h (WINT_TYPE): Define. * cppdefault.h (WINT_TYPE): Define.
......
...@@ -67,7 +67,7 @@ Here are the rules for making fixes in the inclhack.def file: ...@@ -67,7 +67,7 @@ Here are the rules for making fixes in the inclhack.def file:
It is nice if: It is nice if:
3. The expression is as simple as possible to both 3. The expression is as simple as possible to both
process and uderstand by people. :-) process and understand by people. :-)
Please take advantage of the fact AutoGen will glue Please take advantage of the fact AutoGen will glue
together string fragments. It helps. Also take note together string fragments. It helps. Also take note
......
...@@ -19,8 +19,9 @@ SRCDIR=`pwd`/inc ...@@ -19,8 +19,9 @@ SRCDIR=`pwd`/inc
FIND_BASE='.' FIND_BASE='.'
VERBOSE=1 VERBOSE=1
INPUT=`pwd` INPUT=`pwd`
ORIGDIR=${INPUT}
export TARGET_MACHINE DESTDIR SRCDIR FIND_BASE VERBOSE INPUT export TARGET_MACHINE DESTDIR SRCDIR FIND_BASE VERBOSE INPUT ORIGDIR
rm -rf ${DESTDIR} ${SRCDIR} rm -rf ${DESTDIR} ${SRCDIR}
mkdir ${DESTDIR} ${SRCDIR} mkdir ${DESTDIR} ${SRCDIR}
......
...@@ -60,6 +60,10 @@ Boston, MA 02111-1307, USA. */ ...@@ -60,6 +60,10 @@ Boston, MA 02111-1307, USA. */
#include "fixlib.h" #include "fixlib.h"
#define GTYPE_SE_CT 1 #define GTYPE_SE_CT 1
#ifdef __MSDOS__
#include "fixincl.x"
#endif
tSCC zNeedsArg[] = "fixincl error: `%s' needs %s argument (c_fix_arg[%d])\n"; tSCC zNeedsArg[] = "fixincl error: `%s' needs %s argument (c_fix_arg[%d])\n";
typedef struct { typedef struct {
...@@ -725,3 +729,79 @@ apply_fix( p_fixd, filname ) ...@@ -725,3 +729,79 @@ apply_fix( p_fixd, filname )
buf = load_file_data (stdin); buf = load_file_data (stdin);
(*pfe->fix_proc)( filname, buf, p_fixd ); (*pfe->fix_proc)( filname, buf, p_fixd );
} }
#ifdef __MSDOS__
tSCC z_usage[] =
"USAGE: applyfix <fix-name> <file-to-fix> <file-source> <file-destination>\n";
tSCC z_reopen[] =
"FS error %d (%s) reopening %s as std%s\n";
int
main( argc, argv )
int argc;
char** argv;
{
tFixDesc* pFix;
char* pz_tmptmp;
char* pz_tmp_base;
char* pz_tmp_dot;
if (argc != 5)
{
usage_failure:
fputs( z_usage, stderr );
return EXIT_FAILURE;
}
{
char* pz = argv[1];
long idx;
if (! isdigit( *pz ))
goto usage_failure;
idx = strtol( pz, &pz, 10 );
if ((*pz != NUL) || ((unsigned)idx >= FIX_COUNT))
goto usage_failure;
pFix = fixDescList + idx;
}
if (freopen( argv[3], "r", stdin ) != stdin)
{
fprintf( stderr, z_reopen, errno, strerror( errno ), argv[3], "in" );
return EXIT_FAILURE;
}
pz_tmptmp = (char*)xmalloc( strlen( argv[4] ) + 5 );
strcpy( pz_tmptmp, argv[4] );
/* Don't lose because "12345678" and "12345678X" map to the same
file under DOS restricted 8+3 file namespace. Note that DOS
doesn't allow more than one dot in the trunk of a file name. */
pz_tmp_base = basename( pz_tmptmp );
pz_tmp_dot = strchr( pz_tmp_base, '.' );
if (pathconf( pz_tmptmp, _PC_NAME_MAX ) <= 12 /* is this DOS or Windows9X? */
&& pz_tmp_dot != (char*)NULL)
strcpy( pz_tmp_dot+1, "X" ); /* nuke the original extension */
else
strcat( pz_tmptmp, ".X" );
if (freopen( pz_tmptmp, "w", stdout ) != stdout)
{
fprintf( stderr, z_reopen, errno, strerror( errno ), pz_tmptmp, "out" );
return EXIT_FAILURE;
}
apply_fix( pFix, argv[1] );
close( STDOUT_FILENO );
close( STDIN_FILENO );
unlink( argv[4] );
if (rename( pz_tmptmp, argv[4] ) != 0)
{
fprintf( stderr, "error %d (%s) renaming %s to %s\n", errno,
strerror( errno ), pz_tmptmp, argv[4] );
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
#endif
...@@ -30,8 +30,9 @@ Boston, MA 02111-1307, USA. */ ...@@ -30,8 +30,9 @@ Boston, MA 02111-1307, USA. */
#endif #endif
#include <signal.h> #include <signal.h>
#ifndef __MSDOS__
#include "server.h" #include "server.h"
#endif
/* The contents of this string are not very important. It is mostly /* The contents of this string are not very important. It is mostly
just used as part of the "I am alive and working" test. */ just used as part of the "I am alive and working" test. */
...@@ -74,6 +75,8 @@ pid_t process_chain_head = (pid_t) -1; ...@@ -74,6 +75,8 @@ pid_t process_chain_head = (pid_t) -1;
char* pz_curr_file; /* name of the current file under test/fix */ char* pz_curr_file; /* name of the current file under test/fix */
char* pz_curr_data; /* original contents of that file */ char* pz_curr_data; /* original contents of that file */
char* pz_temp_file; /* for DOS, a place to stash the temporary
fixed data between system(3) calls */
t_bool curr_data_mapped; t_bool curr_data_mapped;
int data_map_fd; int data_map_fd;
size_t data_map_size; size_t data_map_size;
...@@ -178,6 +181,10 @@ Altering %5d of them\n"; ...@@ -178,6 +181,10 @@ Altering %5d of them\n";
fixed_ct, altered_ct); fixed_ct, altered_ct);
} }
#endif /* DO_STATS */ #endif /* DO_STATS */
# ifdef __MSDOS__
unlink( pz_temp_file );
# endif
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
...@@ -195,8 +202,12 @@ do_version () ...@@ -195,8 +202,12 @@ do_version ()
*/ */
run_compiles (); run_compiles ();
sprintf (zBuf, zFmt, program_id); sprintf (zBuf, zFmt, program_id);
#ifndef __MSDOS__
puts (zBuf + 5); puts (zBuf + 5);
exit (strcmp (run_shell (zBuf), program_id)); exit (strcmp (run_shell (zBuf), program_id));
#else
exit (system (zBuf));
#endif
} }
/* * * * * * * * * * * * */ /* * * * * * * * * * * * */
...@@ -287,11 +298,19 @@ ENV_TABLE ...@@ -287,11 +298,19 @@ ENV_TABLE
*/ */
run_compiles (); run_compiles ();
# ifdef __MSDOS__
/* NULL as the first argument to `tempnam' causes it to DTRT
wrt the temporary directory where the file will be created. */
pz_temp_file = tempnam( NULL, "fxinc" );
# endif
signal (SIGQUIT, SIG_IGN); signal (SIGQUIT, SIG_IGN);
#ifdef SIGIOT #ifdef SIGIOT
signal (SIGIOT, SIG_IGN); signal (SIGIOT, SIG_IGN);
#endif #endif
#ifdef SIGPIPE
signal (SIGPIPE, SIG_IGN); signal (SIGPIPE, SIG_IGN);
#endif
signal (SIGALRM, SIG_IGN); signal (SIGALRM, SIG_IGN);
signal (SIGTERM, SIG_IGN); signal (SIGTERM, SIG_IGN);
} }
...@@ -348,54 +367,11 @@ load_file ( fname ) ...@@ -348,54 +367,11 @@ load_file ( fname )
return res; return res;
} }
int
/* * * * * * * * * * * * * machine_matches( p_fixd )
tFixDesc *p_fixd;
run_compiles run all the regexp compiles for all the fixes once.
*/
void
run_compiles ()
{
tFixDesc *p_fixd = fixDescList;
int fix_ct = FIX_COUNT;
tTestDesc *p_test;
int test_ct;
const char *pz_err;
regex_t *p_re = (regex_t *) malloc (REGEX_COUNT * sizeof (regex_t));
if (p_re == (regex_t *) NULL)
{
fprintf (stderr, "fixincl ERROR: cannot allocate %d bytes for regex\n",
REGEX_COUNT * sizeof (regex_t));
exit (EXIT_FAILURE);
}
/* Make sure compile_re does not stumble across invalid data */
memset ( (void*)p_re, '\0', REGEX_COUNT * sizeof (regex_t) );
memset ( (void*)&incl_quote_re, '\0', sizeof (regex_t) );
compile_re (incl_quote_pat, &incl_quote_re, 1,
"quoted include", "run_compiles");
/* Allow machine name tests to be ignored (testing, mainly) */
if (pz_machine && ((*pz_machine == '\0') || (*pz_machine == '*')))
pz_machine = (char*)NULL;
/* FOR every fixup, ... */
do
{
p_test = p_fixd->p_test_desc;
test_ct = p_fixd->test_ct;
/* IF the machine type pointer is not NULL (we are not in test mode)
AND this test is for or not done on particular machines
THEN ... */
if ( (pz_machine != NULL)
&& (p_fixd->papz_machs != (const char**) NULL) )
{ {
# ifndef __MSDOS__
tSCC case_fmt[] = "case %s in\n"; /* 9 bytes, plus string */ tSCC case_fmt[] = "case %s in\n"; /* 9 bytes, plus string */
tSCC esac_fmt[] = tSCC esac_fmt[] =
" )\n echo %s ;;\n* ) echo %s ;;\nesac";/* 4 bytes */ " )\n echo %s ;;\n* ) echo %s ;;\nesac";/* 4 bytes */
...@@ -457,10 +433,74 @@ run_compiles () ...@@ -457,10 +433,74 @@ run_compiles ()
if (skip) if (skip)
{ {
p_fixd->fd_flags |= FD_SKIP_TEST; p_fixd->fd_flags |= FD_SKIP_TEST;
continue; return BOOL_FALSE;
} }
} }
}
return BOOL_TRUE;
# else /* is __MSDOS__ */
const char **papz_machs = p_fixd->papz_machs;
int invert = (p_fixd->fd_flags & FD_MACH_IFNOT) != 0;
for (;;)
{
const char* pz_mach = *(papz_machs++);
if (pz_mach == (const char*) NULL)
break;
if (strstr (pz_mach, "dos") != NULL && !invert)
return BOOL_TRUE;
}
p_fixd->fd_flags |= FD_SKIP_TEST;
return BOOL_FALSE;
# endif
}
/* * * * * * * * * * * * *
run_compiles run all the regexp compiles for all the fixes once.
*/
void
run_compiles ()
{
tFixDesc *p_fixd = fixDescList;
int fix_ct = FIX_COUNT;
regex_t *p_re = (regex_t *) malloc (REGEX_COUNT * sizeof (regex_t));
if (p_re == (regex_t *) NULL)
{
fprintf (stderr, "fixincl ERROR: cannot allocate %d bytes for regex\n",
REGEX_COUNT * sizeof (regex_t));
exit (EXIT_FAILURE);
}
/* Make sure compile_re does not stumble across invalid data */
memset ( (void*)p_re, '\0', REGEX_COUNT * sizeof (regex_t) );
memset ( (void*)&incl_quote_re, '\0', sizeof (regex_t) );
compile_re (incl_quote_pat, &incl_quote_re, 1,
"quoted include", "run_compiles");
/* Allow machine name tests to be ignored (testing, mainly) */
if (pz_machine && ((*pz_machine == '\0') || (*pz_machine == '*')))
pz_machine = (char*)NULL;
/* FOR every fixup, ... */
do
{
tTestDesc *p_test = p_fixd->p_test_desc;
int test_ct = p_fixd->test_ct;
/* IF the machine type pointer is not NULL (we are not in test mode)
AND this test is for or not done on particular machines
THEN ... */
if ( (pz_machine != NULL)
&& (p_fixd->papz_machs != (const char**) NULL)
&& ! machine_matches (p_fixd) )
continue;
/* FOR every test for the fixup, ... */ /* FOR every test for the fixup, ... */
...@@ -470,17 +510,6 @@ run_compiles () ...@@ -470,17 +510,6 @@ run_compiles ()
{ {
case TT_EGREP: case TT_EGREP:
case TT_NEGREP: case TT_NEGREP:
#ifdef DEBUG
{
static int re_ct = REGEX_COUNT;
if (--re_ct < 0)
{
fputs ("out of RE's\n", stderr);
exit (EXIT_FAILURE);
}
}
#endif
p_test->p_test_regex = p_re++; p_test->p_test_regex = p_re++;
compile_re (p_test->pz_test_text, p_test->p_test_regex, 0, compile_re (p_test->pz_test_text, p_test->p_test_regex, 0,
"select test", p_fixd->fix_name); "select test", p_fixd->fix_name);
...@@ -578,7 +607,7 @@ create_file () ...@@ -578,7 +607,7 @@ create_file ()
the name of the file that we might want to fix the name of the file that we might want to fix
Result: APPLY_FIX or SKIP_FIX, depending on the result of the Result: APPLY_FIX or SKIP_FIX, depending on the result of the
shell script we run. */ shell script we run. */
#ifndef __MSDOS__
int int
test_test (p_test, pz_test_file) test_test (p_test, pz_test_file)
tTestDesc *p_test; tTestDesc *p_test;
...@@ -616,7 +645,13 @@ fi"; ...@@ -616,7 +645,13 @@ fi";
free ((void *) pz_res); free ((void *) pz_res);
return res; return res;
} }
#else
/*
* IF we are in MS-DOS land, then whatever shell-type test is required
* will, by definition, fail
*/
#define test_test(t,tf) SKIP_FIX
#endif
/* * * * * * * * * * * * * /* * * * * * * * * * * * *
...@@ -728,7 +763,7 @@ extract_quoted_files (pz_data, pz_fixed_file, p_re_match) ...@@ -728,7 +763,7 @@ extract_quoted_files (pz_data, pz_fixed_file, p_re_match)
/* Skip forward to the included file name */ /* Skip forward to the included file name */
while (ISSPACE (*pz_incl_quot)) while (ISSPACE (*pz_incl_quot))
pz_incl_quot++; pz_incl_quot++;
/* ISSPACE() may evaluate is argument more than once! */ /* ISSPACE() may evaluate its argument more than once! */
while (++pz_incl_quot, ISSPACE (*pz_incl_quot)) while (++pz_incl_quot, ISSPACE (*pz_incl_quot))
; ;
pz_incl_quot += sizeof ("include") - 1; pz_incl_quot += sizeof ("include") - 1;
...@@ -767,7 +802,7 @@ extract_quoted_files (pz_data, pz_fixed_file, p_re_match) ...@@ -767,7 +802,7 @@ extract_quoted_files (pz_data, pz_fixed_file, p_re_match)
Somebody wrote a *_fix subroutine that we must call. Somebody wrote a *_fix subroutine that we must call.
*/ */
#ifndef __MSDOS__
int int
internal_fix (read_fd, p_fixd) internal_fix (read_fd, p_fixd)
int read_fd; int read_fd;
...@@ -833,7 +868,135 @@ internal_fix (read_fd, p_fixd) ...@@ -833,7 +868,135 @@ internal_fix (read_fd, p_fixd)
apply_fix (p_fixd, pz_curr_file); apply_fix (p_fixd, pz_curr_file);
exit (0); exit (0);
} }
#endif /* !__MSDOS__ */
#ifdef __MSDOS__
static void
fix_with_system (p_fixd, pz_fix_file, pz_file_source, pz_temp_file)
tFixDesc* p_fixd;
tCC* pz_fix_file;
tCC* pz_file_source;
tCC* pz_temp_file;
{
char* pz_cmd;
char* pz_scan;
size_t argsize;
if (p_fixd->fd_flags & FD_SUBROUTINE)
{
tSCC z_applyfix_prog[] = "/fixinc/applyfix";
argsize = 32
+ strlen( pz_orig_dir )
+ sizeof( z_applyfix_prog )
+ strlen( pz_fix_file )
+ strlen( pz_file_source )
+ strlen( pz_temp_file );
pz_cmd = (char*)xmalloc( argsize );
strcpy( pz_cmd, pz_orig_dir );
pz_scan = pz_cmd + strlen( pz_orig_dir );
strcpy( pz_scan, z_applyfix_prog );
pz_scan += sizeof( z_applyfix_prog ) - 1;
*(pz_scan++) = ' ';
/*
* Now add the fix number and file names that may be needed
*/
sprintf (pz_scan, "%ld %s %s %s", p_fixd - fixDescList,
pz_fix_file, pz_file_source, pz_temp_file);
}
else /* NOT an "internal" fix: */
{
size_t parg_size;
/* Don't use the "src > dstX; rm -f dst; mv -f dstX dst" trick:
dst is a temporary file anyway, so we know there's no other
file by that name; and DOS's system(3) doesn't mind to
clobber existing file in redirection. Besides, with DOS 8+3
limited file namespace, we can easily lose if dst already has
an extension that is 3 or more characters long. */
tSCC z_cmd_fmt[] = " %s > %s";
tCC** ppArgs = p_fixd->patch_args;
argsize = sizeof( z_cmd_fmt ) + strlen( pz_temp_file )
+ strlen( pz_file_source );
parg_size = argsize;
/*
* Compute the size of the command line. Add lotsa extra space
* because some of the args to sed use lotsa single quotes.
* (This requires three extra bytes per quote. Here we allow
* for up to 8 single quotes for each argument, including the
* command name "sed" itself. Nobody will *ever* need more. :)
*/
for (;;)
{
tCC* p_arg = *(ppArgs++);
if (p_arg == NULL)
break;
argsize += 24 + strlen( p_arg );
}
/* Estimated buffer size we will need. */
pz_scan = pz_cmd = (char*)xmalloc( argsize );
/* How much of it do we allot to the program name and its
arguments. */
parg_size = argsize - parg_size;
ppArgs = p_fixd->patch_args;
/*
* Copy the program name, unquoted
*/
{
tCC* pArg = *(ppArgs++);
for (;;)
{
char ch = *(pArg++);
if (ch == NUL)
break;
*(pz_scan++) = ch;
}
}
/*
* Copy the program arguments, quoted
*/
for (;;)
{
tCC* pArg = *(ppArgs++);
char* pz_scan_save;
if (pArg == NULL)
break;
*(pz_scan++) = ' ';
pz_scan = make_raw_shell_str( pz_scan_save = pz_scan, pArg,
parg_size - (pz_scan - pz_cmd) );
/*
* Make sure we don't overflow the buffer due to sloppy
* size estimation.
*/
while (pz_scan == (char*)NULL)
{
size_t already_filled = pz_scan_save - pz_cmd;
pz_cmd = (char*)xrealloc( pz_cmd, argsize += 100 );
pz_scan_save = pz_scan = pz_cmd + already_filled;
parg_size += 100;
pz_scan = make_raw_shell_str( pz_scan, pArg,
parg_size - (pz_scan - pz_cmd) );
}
}
/*
* add the file machinations.
*/
sprintf( pz_scan, z_cmd_fmt, pz_file_source, pz_temp_file );
}
system( pz_cmd );
free( (void*)pz_cmd );
}
/* * * * * * * * * * * * * /* * * * * * * * * * * * *
...@@ -842,6 +1005,7 @@ internal_fix (read_fd, p_fixd) ...@@ -842,6 +1005,7 @@ internal_fix (read_fd, p_fixd)
its stdin and returns the new fd this process will use its stdin and returns the new fd this process will use
for stdout. */ for stdout. */
#else /* is *NOT* __MSDOS__ */
int int
start_fixer (read_fd, p_fixd, pz_fix_file) start_fixer (read_fd, p_fixd, pz_fix_file)
int read_fd; int read_fd;
...@@ -912,6 +1076,7 @@ start_fixer (read_fd, p_fixd, pz_fix_file) ...@@ -912,6 +1076,7 @@ start_fixer (read_fd, p_fixd, pz_fix_file)
return read_fd; return read_fd;
} }
#endif
/* * * * * * * * * * * * * /* * * * * * * * * * * * *
...@@ -924,17 +1089,23 @@ t_bool ...@@ -924,17 +1089,23 @@ t_bool
fix_applies (p_fixd) fix_applies (p_fixd)
tFixDesc *p_fixd; tFixDesc *p_fixd;
{ {
#ifdef DEBUG
static const char z_failed[] = "not applying %s %s to %s - \
test %d failed\n";
#endif
const char *pz_fname = pz_curr_file; const char *pz_fname = pz_curr_file;
const char *pz_scan = p_fixd->file_list; const char *pz_scan = p_fixd->file_list;
int test_ct; int test_ct;
tTestDesc *p_test; tTestDesc *p_test;
# ifdef __MSDOS__
/*
* There is only one fix that uses a shell script as of this writing.
* I hope to nuke it anyway, it does not apply to DOS and it would
* be painful to implement. Therefore, no "shell" fixes for DOS.
*/
if (p_fixd->fd_flags & (FD_SHELL_SCRIPT | FD_SKIP_TEST))
return BOOL_FALSE;
# else
if (p_fixd->fd_flags & FD_SKIP_TEST) if (p_fixd->fd_flags & FD_SKIP_TEST)
return BOOL_FALSE; return BOOL_FALSE;
# endif
/* IF there is a file name restriction, /* IF there is a file name restriction,
THEN ensure the current file name matches one in the pattern */ THEN ensure the current file name matches one in the pattern */
...@@ -952,14 +1123,8 @@ test %d failed\n"; ...@@ -952,14 +1123,8 @@ test %d failed\n";
pz_scan = strstr (pz_scan + 1, pz_fname); pz_scan = strstr (pz_scan + 1, pz_fname);
/* IF we can't match the string at all, /* IF we can't match the string at all,
THEN bail */ THEN bail */
if (pz_scan == (char *) NULL) { if (pz_scan == (char *) NULL)
#ifdef DEBUG
if (VLEVEL( VERB_EVERYTHING ))
fprintf (stderr, "file %s not in list for %s\n",
pz_fname, p_fixd->fix_name );
#endif
return BOOL_FALSE; return BOOL_FALSE;
}
/* IF the match is surrounded by the '|' markers, /* IF the match is surrounded by the '|' markers,
THEN we found a full match -- time to run the tests */ THEN we found a full match -- time to run the tests */
...@@ -1133,11 +1298,14 @@ test_for_changes (read_fd) ...@@ -1133,11 +1298,14 @@ test_for_changes (read_fd)
void void
process () process ()
{ {
static char env_current_file[1024];
tFixDesc *p_fixd = fixDescList; tFixDesc *p_fixd = fixDescList;
int todo_ct = FIX_COUNT; int todo_ct = FIX_COUNT;
int read_fd = -1; int read_fd = -1;
# ifndef __MSDOS__
int num_children = 0; int num_children = 0;
# else /* is __MSDOS__ */
char* pz_file_source = pz_curr_file;
# endif
if (access (pz_curr_file, R_OK) != 0) if (access (pz_curr_file, R_OK) != 0)
{ {
...@@ -1158,6 +1326,7 @@ process () ...@@ -1158,6 +1326,7 @@ process ()
if (VLEVEL( VERB_PROGRESS ) && have_tty) if (VLEVEL( VERB_PROGRESS ) && have_tty)
fprintf (stderr, "%6d %-50s \r", data_map_size, pz_curr_file ); fprintf (stderr, "%6d %-50s \r", data_map_size, pz_curr_file );
# ifndef __MSDOS__
process_chain_head = NOPROCESS; process_chain_head = NOPROCESS;
/* For every fix in our fix list, ... */ /* For every fix in our fix list, ... */
...@@ -1218,5 +1387,34 @@ process () ...@@ -1218,5 +1387,34 @@ process ()
} while (--num_children > 0); } while (--num_children > 0);
} }
# else /* is __MSDOS__ */
for (; todo_ct > 0; p_fixd++, todo_ct--)
{
if (! fix_applies (p_fixd))
continue;
if (VLEVEL( VERB_APPLIES ))
fprintf (stderr, "Applying %-24s to %s\n",
p_fixd->fix_name, pz_curr_file);
if (p_fixd->fd_flags & FD_REPLACEMENT)
{
write_replacement (p_fixd);
UNLOAD_DATA();
return;
}
fix_with_system (p_fixd, pz_curr_file, pz_file_source, pz_temp_file);
pz_file_source = pz_temp_file;
}
read_fd = open( pz_temp_file, O_RDONLY );
test_for_changes( read_fd );
/* Unlinking a file while it is still open is a Bad Idea on
DOS/Windows. */
close( read_fd );
unlink( pz_temp_file );
# endif
UNLOAD_DATA(); UNLOAD_DATA();
} }
...@@ -95,6 +95,7 @@ esac ...@@ -95,6 +95,7 @@ esac
# Original directory. # Original directory.
ORIGDIR=`${PWDCMD}` ORIGDIR=`${PWDCMD}`
export ORIGDIR
FIXINCL=${ORIGDIR}/fixinc/fixincl FIXINCL=${ORIGDIR}/fixinc/fixincl
export FIXINCL export FIXINCL
...@@ -111,7 +112,9 @@ if test $VERBOSE -gt 0 ...@@ -111,7 +112,9 @@ if test $VERBOSE -gt 0
then echo Fixing headers into ${LIB} for ${target_canonical} target ; fi then echo Fixing headers into ${LIB} for ${target_canonical} target ; fi
# Determine whether this system has symbolic links. # Determine whether this system has symbolic links.
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then if test -n "$DJDIR"; then
LINKS=false
elif ln -s X $LIB/ShouldNotExist 2>/dev/null; then
rm -f $LIB/ShouldNotExist rm -f $LIB/ShouldNotExist
LINKS=true LINKS=true
elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then
...@@ -422,7 +425,9 @@ done ...@@ -422,7 +425,9 @@ done
if test $VERBOSE -gt 2 if test $VERBOSE -gt 2
then echo 'Cleaning up DONE files.' ; fi then echo 'Cleaning up DONE files.' ; fi
cd $LIB cd $LIB
find . -name DONE -exec rm -f '{}' ';' # Look for files case-insensitively, for the benefit of
# DOS/Windows filesystems.
find . -name '[Dd][Oo][Nn][Ee]' -exec rm -f '{}' ';'
if test $VERBOSE -gt 1 if test $VERBOSE -gt 1
then echo 'Cleaning up unneeded directories:' ; fi then echo 'Cleaning up unneeded directories:' ; fi
...@@ -435,20 +440,25 @@ for file in $all_dirs; do ...@@ -435,20 +440,25 @@ for file in $all_dirs; do
fi fi
done 2> /dev/null done 2> /dev/null
test $VERBOSE -gt 2 && echo "Removing unused symlinks" # On systems which don't support symlinks, `find' may barf
# if called with "-type l" predicate. So only use that if
# we know we should look for symlinks.
if $LINKS; then
test $VERBOSE -gt 2 && echo "Removing unused symlinks"
all_dirs=`find . -type l -print` all_dirs=`find . -type l -print`
for file in $all_dirs for file in $all_dirs
do do
if ls -lLd $file > /dev/null if ls -lLd $file > /dev/null
then : then :
else rm -f $file else rm -f $file
test $VERBOSE -gt 3 && echo " removed $file" test $VERBOSE -gt 3 && echo " removed $file"
rmdir `dirname $file` > /dev/null && \ rmdir `dirname $file` > /dev/null && \
test $VERBOSE -gt 3 && \ test $VERBOSE -gt 3 && \
echo " removed `dirname $file`" echo " removed `dirname $file`"
fi fi
done 2> /dev/null done 2> /dev/null
fi
if test $VERBOSE -gt 0 if test $VERBOSE -gt 0
then echo fixincludes is done ; fi then echo fixincludes is done ; fi
......
...@@ -245,3 +245,57 @@ mn_get_regexps( label_re, name_re, who ) ...@@ -245,3 +245,57 @@ mn_get_regexps( label_re, name_re, who )
*name_re = &mn_name_re; *name_re = &mn_name_re;
} }
#endif #endif
#ifdef __MSDOS__
char*
make_raw_shell_str( pz_d, pz_s, smax )
char* pz_d;
tCC* pz_s;
size_t smax;
{
tSCC zQ[] = "'\\''";
size_t dtaSize;
char* pz_d_start = pz_d;
smax--; /* adjust for trailing NUL */
dtaSize = strlen( pz_s ) + 3;
{
const char* pz = pz_s - 1;
for (;;) {
pz = strchr( pz+1, '\'' );
if (pz == (char*)NULL)
break;
dtaSize += sizeof( zQ )-1;
}
}
if (dtaSize > smax)
return (char*)NULL;
*(pz_d++) = '\'';
for (;;) {
if (pz_d - pz_d_start >= smax)
return (char*)NULL;
switch (*(pz_d++) = *(pz_s++)) {
case NUL:
goto loopDone;
case '\'':
if (pz_d - pz_d_start >= smax - sizeof( zQ )-1)
return (char*)NULL;
strcpy( pz_d-1, zQ );
pz_d += sizeof( zQ )-2;
}
} loopDone:;
pz_d[-1] = '\'';
*pz_d = NUL;
return pz_d;
}
#endif
...@@ -100,6 +100,9 @@ typedef int apply_fix_p_t; /* Apply Fix Predicate Type */ ...@@ -100,6 +100,9 @@ typedef int apply_fix_p_t; /* Apply Fix Predicate Type */
_ENV_( pz_machine, BOOL_TRUE, "TARGET_MACHINE", \ _ENV_( pz_machine, BOOL_TRUE, "TARGET_MACHINE", \
"output from config.guess" ) \ "output from config.guess" ) \
\ \
_ENV_( pz_orig_dir, BOOL_TRUE, "ORIGDIR", \
"directory of fixincl and applyfix" ) \
\
_ENV_( pz_src_dir, BOOL_TRUE, "SRCDIR", \ _ENV_( pz_src_dir, BOOL_TRUE, "SRCDIR", \
"directory of original files" ) \ "directory of original files" ) \
\ \
...@@ -204,6 +207,10 @@ void compile_re _P_(( tCC* pat, regex_t* re, int match, ...@@ -204,6 +207,10 @@ void compile_re _P_(( tCC* pat, regex_t* re, int match,
void apply_fix _P_(( tFixDesc* p_fixd, tCC* filname )); void apply_fix _P_(( tFixDesc* p_fixd, tCC* filname ));
apply_fix_p_t run_test _P_((tCC* t_name, tCC* f_name, tCC* text )); apply_fix_p_t run_test _P_((tCC* t_name, tCC* f_name, tCC* text ));
#ifdef __MSDOS__
char* make_raw_shell_str _P_(( char* pz_d, tCC* pz_s, size_t smax ));
#endif
#ifdef MN_NAME_PAT #ifdef MN_NAME_PAT
void mn_get_regexps _P_(( regex_t** label_re, regex_t** name_re, void mn_get_regexps _P_(( regex_t** label_re, regex_t** name_re,
tCC *who )); tCC *who ));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment