delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2000/01/05/17:25:21

Message-Id: <200001052159.PAA23361@mercury.xraylith.wisc.edu>
To: djgpp-workers AT delorie DOT com
Subject: protoize fixes (starting point for djgpp?)
Date: Wed, 05 Jan 2000 15:59:48 -0600
From: Mumit Khan <khan AT nanotech DOT wisc DOT edu>
Reply-To: djgpp-workers AT delorie DOT com

Here's the diff against my current gcc-2.95.2 protoize that works for Mingw;
It should work for djgpp with a few tweaks, eg., definition of the "null" 
device. Then again, I know nothing about djgpp, so may be missing the whole 
point there.

Note that the macro to indicate dos based file system is inconsistent in
2.95.2 (fixed in 2.96), so you'll need to deal with that; I suggest 
changing all the DOS_BASED_FILESYSTEM to DOS_BASED_FILE_SYSTEM, which is
what is in the dev sources.

Do not try this against 2.96 -- just won't work. I'll submit that to gcc
folks sometime soon.

Note the binary mode when reading/creating files, needed to make sure 
line-endings don't change (source to source translation should never
munge these things), and also to get the file sizes correct from stat.
I assume that djgpp `open' flag can contain O_BINARY, as well as the
existence of setmode --
  
  #ifdef O_BINARY
  setmode (fd, O_BINARY)
  #endif

If you relocate your GCC distribution (ie., install to a directory different 
than where you told the prefix to be at build time), it won't find 
SYSCALLS.c.X; this is not a djgpp or win32 problem, but a general protoize
problem. My local changes find out where the file is dynamically, but it
won't work for distributions that don't use the "relative pathname" patch,
which is now finally incorporated in the dev sources. Of course, you can
always use -B<prefix>/ option if you need protoize to find SYSCALLS.c.X.

Absolute minimal testing so far, so caveat emptore.

Regards,
Mumit

2000-01-05  Mumit Khan  <khan AT xraylith DOT wisc DOT edu>

	* protoize.c (DIR_SEPARATOR): Provide default. 
	(IS_DIR_SEPARATOR): Define macro.
	(my_link): Delete macro.
	(my_rename): New macro.
	(rename_c_file): Use.
	(edit_file): Likewise.
	(is_abspath): New static function.
	(in_system_include_dir): Handle DOS style pathnames.
	(file_could_be_converted): Likewise.
	(file_normally_convertible): Likewise.
	(directory_specified_p): Likewise.
	(file_excluded_p): Likewise.
	(abspath): Likewise.
	(shortpath): Likewise.
	(referenced_file_is_newer): Likewise.
	(save_def_or_dec): Likewise.
	(do_processing): Likewise.
	(main): Likewise.
	(munge_compile_params): Define null device for Mingw.
	(process_aux_info_file): Use binary mode if appliable.
	(edit_file): Likewise.

Index: protoize.c
===================================================================
RCS file: /homes/khan/src/CVSROOT/gcc-2.95.2/gcc/protoize.c,v
retrieving revision 1.1.1.1
diff -u -3 -p -r1.1.1.1 protoize.c
--- protoize.c	1999/11/05 01:09:44	1.1.1.1
+++ protoize.c	2000/01/05 20:39:39
@@ -61,6 +61,18 @@ Boston, MA 02111-1307, USA.  */
 #include "intl.h"
 #undef abort
 
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+/* Define IS_DIR_SEPARATOR.  */
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
 #if ! defined (_WIN32) || defined (__CYGWIN__) || defined (_UWIN)
 #if defined(POSIX) || defined(CONCURRENT)
 #include <dirent.h>
@@ -69,6 +81,9 @@ Boston, MA 02111-1307, USA.  */
 #endif
 #endif
 #include <setjmp.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 /* Some systems like Linux don't declare rindex if _POSIX_SOURCE is declared,
    but it normally does declare it.  This means that configure thinks we don't
@@ -100,11 +115,7 @@ extern char *version_string;
 
 #define my_access(file,flag)	access((char *)file, flag)
 #define my_stat(file,pkt)	stat((char *)file, pkt)
-#ifdef __MINGW32__
-#define my_link(file1, file2)	-1
-#else
-#define my_link(file1, file2)	link((char *)file1, (char *)file2)
-#endif
+#define my_rename(file1, file2)	rename((char *)file1, (char *)file2)
 #define my_unlink(file)		unlink((char *)file)
 #define my_open(file, mode, flag)	open((char *)file, mode, flag)
 #define my_chmod(file, mode)	chmod((char *)file, mode)
@@ -567,6 +578,7 @@ static char * saved_repl_write_ptr;
 /* Forward declaration.  */
 
 static const char *shortpath ();
+static int is_abspath PVPROTO ((const char *));
 
 /* Translate and output an error message.  */
 static void notice			PVPROTO ((const char *, ...))
@@ -843,12 +855,12 @@ in_system_include_dir (path)
 {
   struct default_include *p;
 
-  if (path[0] != '/')
+  if (! is_abspath (path))
     abort ();		/* Must be an absolutized filename.  */
 
   for (p = include_defaults; p->fname; p++)
     if (!strncmp (path, p->fname, strlen (p->fname))
-	&& path[strlen (p->fname)] == '/')
+	&& IS_DIR_SEPARATOR (path[strlen (p->fname)]))
       return 1;
   return 0;
 }
@@ -870,9 +882,18 @@ file_could_be_converted (const char *pat
     char *dir_last_slash;
 
     strcpy (dir_name, path);
-    dir_last_slash = strrchr (dir_name, '/');
+    dir_last_slash = strrchr (dir_name, DIR_SEPARATOR);
     if (dir_last_slash)
-      *dir_last_slash = '\0';
+      {
+#ifdef DIR_SEPARATOR_2
+        char *slash;
+
+	slash = strrchr (dir_last_slash, DIR_SEPARATOR_2);
+	if (slash)
+	  dir_last_slash = slash;
+#endif
+	*dir_last_slash = '\0';
+      }
     else
       abort ();  /* Should have been an absolutized filename.  */
   }
@@ -904,9 +925,18 @@ file_normally_convertible (const char *p
     char *dir_last_slash;
 
     strcpy (dir_name, path);
-    dir_last_slash = strrchr (dir_name, '/');
+    dir_last_slash = strrchr (dir_name, DIR_SEPARATOR);
     if (dir_last_slash)
-      *dir_last_slash = '\0';
+      {
+#ifdef DIR_SEPARATOR_2
+        char *slash;
+
+	slash = strrchr (dir_last_slash, DIR_SEPARATOR_2);
+	if (slash)
+	  dir_last_slash = slash;
+#endif
+	*dir_last_slash = '\0';
+      }
     else
       abort ();  /* Should have been an absolutized filename.  */
   }
@@ -1011,14 +1041,14 @@ directory_specified_p (name)
 
   for (p = directory_list; p; p = p->next)
     if (!strncmp (name, p->name, strlen (p->name))
-	&& name[strlen (p->name)] == '/')
+	&& IS_DIR_SEPARATOR (name[strlen (p->name)]))
       {
 	const char *q = name + strlen (p->name) + 1;
 
 	/* If there are more slashes, it's in a subdir, so
 	   this match doesn't count.  */
-	while (*q)
-	  if (*q++ == '/')
+	while (*q++)
+	  if (IS_DIR_SEPARATOR (*(q-1)))
 	    goto lose;
 	return 1;
 
@@ -1039,7 +1069,7 @@ file_excluded_p (name)
 
   for (p = exclude_list; p; p = p->next)
     if (!strcmp (name + len - strlen (p->name), p->name)
-	&& name[len - strlen (p->name) - 1] == '/')
+	&& IS_DIR_SEPARATOR (name[len - strlen (p->name) - 1]))
       return 1;
 
   return 0;
@@ -1243,6 +1273,20 @@ continue_outer: ;
   return (got_unexpanded ? savestring (line_buf, copy_p - line_buf) : 0);
 }
 
+/* Return 1 if pathname is absolute. */
+
+static int
+is_abspath (path)
+     const char *path;
+{
+  return (IS_DIR_SEPARATOR (path[0])
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+          /* Check for disk name on MS-DOS-based systems.  */
+          || (path[0] && path[1] == ':' && IS_DIR_SEPARATOR (path[2]))
+#endif
+          );
+}
+
 /* Return the absolutized filename for the given relative
    filename.  Note that if that filename is already absolute, it may
    still be returned in a modified form because this routine also
@@ -1271,12 +1315,12 @@ abspath (cwd, rel_filename)
   {
     const char *src_p;
 
-    if (rel_filename[0] != '/')
+    if (! is_abspath (rel_filename))
       {
         src_p = cwd2;
         while ((*endp++ = *src_p++))
           continue;
-        *(endp-1) = '/';        		/* overwrite null */
+        *(endp-1) = DIR_SEPARATOR;     		/* overwrite null */
       }
     src_p = rel_filename;
     while ((*endp++ = *src_p++))
@@ -1289,32 +1333,33 @@ abspath (cwd, rel_filename)
   outp = inp = abs_buffer;
   *outp++ = *inp++;        	/* copy first slash */
 #if defined (apollo) || defined (_WIN32) || defined (__INTERIX)
-  if (inp[0] == '/')
+  if (IS_DIR_SEPARATOR (inp[0]))
     *outp++ = *inp++;        	/* copy second slash */
 #endif
   for (;;)
     {
       if (!inp[0])
         break;
-      else if (inp[0] == '/' && outp[-1] == '/')
+      else if (IS_DIR_SEPARATOR (inp[0]) && IS_DIR_SEPARATOR (outp[-1]))
         {
           inp++;
           continue;
         }
-      else if (inp[0] == '.' && outp[-1] == '/')
+      else if (inp[0] == '.' && IS_DIR_SEPARATOR (outp[-1]))
         {
           if (!inp[1])
                   break;
-          else if (inp[1] == '/')
+          else if (IS_DIR_SEPARATOR (inp[1]))
             {
                     inp += 2;
                     continue;
             }
-          else if ((inp[1] == '.') && (inp[2] == 0 || inp[2] == '/'))
+          else if ((inp[1] == '.') && (inp[2] == 0 
+	                               || IS_DIR_SEPARATOR (inp[2])))
             {
-                    inp += (inp[2] == '/') ? 3 : 2;
+                    inp += (IS_DIR_SEPARATOR (inp[2])) ? 3 : 2;
                     outp -= 2;
-                    while (outp >= abs_buffer && *outp != '/')
+                    while (outp >= abs_buffer && ! IS_DIR_SEPARATOR (*outp))
               	outp--;
                     if (outp < abs_buffer)
 		      {
@@ -1337,7 +1382,7 @@ abspath (cwd, rel_filename)
      the last character of the returned string is *not* a slash.  */
 
   *outp = '\0';
-  if (outp[-1] == '/')
+  if (IS_DIR_SEPARATOR (outp[-1]))
     *--outp  = '\0';
 
   /* Make a copy (in the heap) of the stuff left in the absolutization
@@ -1380,8 +1425,9 @@ shortpath (cwd, filename)
       cwd_p++;
       path_p++;
     }
-  if (!*cwd_p && (!*path_p || *path_p == '/'))	/* whole pwd matched */
+  if (!*cwd_p && (!*path_p || IS_DIR_SEPARATOR (*path_p)))
     {
+      /* whole pwd matched */
       if (!*path_p)        	/* input *is* the current path! */
         return ".";
       else
@@ -1393,7 +1439,7 @@ shortpath (cwd, filename)
         {
           --cwd_p;
           --path_p;
-          while (*cwd_p != '/')        	/* backup to last slash */
+          while (! IS_DIR_SEPARATOR (*cwd_p))     /* backup to last slash */
             {
               --cwd_p;
               --path_p;
@@ -1404,8 +1450,8 @@ shortpath (cwd, filename)
         }
 
       /* Find out how many directory levels in cwd were *not* matched.  */
-      while (*cwd_p)
-        if (*cwd_p++ == '/')
+      while (*cwd_p++)
+        if (IS_DIR_SEPARATOR (*(cwd_p-1)))
 	  unmatched_slash_count++;
 
       /* Now we know how long the "short name" will be.
@@ -1422,7 +1468,7 @@ shortpath (cwd, filename)
 	    return filename;
           *rel_buf_p++ = '.';
           *rel_buf_p++ = '.';
-          *rel_buf_p++ = '/';
+          *rel_buf_p++ = DIR_SEPARATOR;
         }
 
       /* Then tack on the unmatched part of the desired file's name.  */
@@ -1434,7 +1480,7 @@ shortpath (cwd, filename)
       while ((*rel_buf_p++ = *path_p++));
 
       --rel_buf_p;
-      if (*(rel_buf_p-1) == '/')
+      if (IS_DIR_SEPARATOR (*(rel_buf_p-1)))
         *--rel_buf_p = '\0';
       return rel_buffer;
     }
@@ -1557,7 +1603,11 @@ referenced_file_is_newer (l, aux_info_mt
   {
     const char *filename_start = p = l + 3;
 
-    while (*p != ':')
+    while (*p != ':'
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+           || (*p == ':' && *p && *(p+1) && IS_DIR_SEPARATOR (*(p+1)))
+#endif
+           )
       p++;
     filename = (char *) alloca ((size_t) (p - filename_start) + 1);
     strncpy (filename, filename_start, (size_t) (p - filename_start));
@@ -1615,7 +1665,11 @@ save_def_or_dec (l, is_syscalls)
     const char *filename_start = p = l + 3;
     char *filename;
 
-    while (*p != ':')
+    while (*p != ':'
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+           || (*p == ':' && *p && *(p+1) && IS_DIR_SEPARATOR (*(p+1)))
+#endif
+           )
       p++;
     filename = (char *) alloca ((size_t) (p - filename_start) + 1);
     strncpy (filename, filename_start, (size_t) (p - filename_start));
@@ -1642,7 +1696,11 @@ save_def_or_dec (l, is_syscalls)
     const char *line_number_start = ++p;
     char line_number[10];
 
-    while (*p != ':')
+    while (*p != ':'
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+           || (*p == ':' && *p && *(p+1) && IS_DIR_SEPARATOR (*(p+1)))
+#endif
+           )
       p++;
     strncpy (line_number, line_number_start, (size_t) (p - line_number_start));
     line_number[p-line_number_start] = '\0';
@@ -2032,7 +2090,11 @@ munge_compile_params (params_list)
 
   temp_params[param_count++] = "-S";
   temp_params[param_count++] = "-o";
+#if defined (_WIN32) && ! defined (__CYGWIN__) && ! defined (_UWIN)
+  temp_params[param_count++] = "NUL:";
+#else
   temp_params[param_count++] = "/dev/null";
+#endif
 
   /* Leave room for the input file name argument.  */
   input_file_name_index = param_count;
@@ -2256,10 +2318,16 @@ start_over: ;
 
   {
     int aux_info_file;
+    int fd_flags;
 
     /* Open the aux_info file.  */
   
-    if ((aux_info_file = my_open (aux_info_filename, O_RDONLY, 0444 )) == -1)
+    fd_flags = O_RDONLY;
+#ifdef O_BINARY
+    /* Use binary mode to avoid having to deal with different EOL characters. */
+    fd_flags |= O_BINARY;
+#endif
+    if ((aux_info_file = my_open (aux_info_filename, fd_flags, 0444 )) == -1)
       {
 	int errno_val = errno;
         notice ("%s: can't open aux info file `%s' for reading: %s\n",
@@ -2324,7 +2392,11 @@ start_over: ;
   {
     char *p = aux_info_base;
 
-    while (*p != ':')
+    while (*p != ':'
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+           || (*p == ':' && *p && *(p+1) && IS_DIR_SEPARATOR (*(p+1)))
+#endif
+           )
       p++;
     p++;
     while (*p == ' ')
@@ -2332,22 +2404,31 @@ start_over: ;
     invocation_filename = p;	/* Save a pointer to first byte of path.  */
     while (*p != ' ')
       p++;
-    *p++ = '/';
+    *p++ = DIR_SEPARATOR;
     *p++ = '\0';
     while (*p++ != '\n')
       continue;
     aux_info_second_line = p;
     aux_info_relocated_name = 0;
-    if (invocation_filename[0] != '/')
+    if (! is_abspath (invocation_filename))
       {
 	/* INVOCATION_FILENAME is relative;
 	   append it to BASE_SOURCE_FILENAME's dir.  */
 	char *dir_end;
 	aux_info_relocated_name = xmalloc (base_len + (p-invocation_filename));
 	strcpy (aux_info_relocated_name, base_source_filename);
-	dir_end = strrchr (aux_info_relocated_name, '/');
+	dir_end = strrchr (aux_info_relocated_name, DIR_SEPARATOR);
 	if (dir_end)
-	  dir_end++;
+          {
+#ifdef DIR_SEPARATOR_2
+	    char *slash;
+
+	    slash = strrchr (dir_end, DIR_SEPARATOR_2);
+	    if (slash)
+	      dir_end = slash;
+#endif
+	    dir_end++;
+	  }
 	else
 	  dir_end = aux_info_relocated_name;
 	strcpy (dir_end, invocation_filename);
@@ -2451,24 +2532,15 @@ rename_c_file (hp)
   strcpy (new_filename, filename);
   new_filename[last_char_index] = 'C';
 
-  if (my_link (filename, new_filename) == -1)
+  if (my_rename (filename, new_filename))
     {
       int errno_val = errno;
-      notice ("%s: warning: can't link file `%s' to `%s': %s\n",
+      notice ("%s: warning: can't rename file `%s' to `%s': %s\n",
 	      pname, shortpath (NULL, filename),
 	      shortpath (NULL, new_filename), xstrerror (errno_val));
       errors++;
       return;
     }
-
-  if (my_unlink (filename) == -1)
-    {
-      int errno_val = errno;
-      notice ("%s: warning: can't delete file `%s': %s\n",
-	      pname, shortpath (NULL, filename), xstrerror (errno_val));
-      errors++;
-      return;
-    }
 }
 
 #endif /* !defined (UNPROTOIZE) */
@@ -4197,10 +4269,16 @@ edit_file (hp)
 
   {
     int input_file;
+    int fd_flags;
 
     /* Open the file to be converted in READ ONLY mode.  */
 
-    if ((input_file = my_open (convert_filename, O_RDONLY, 0444)) == -1)
+    fd_flags = O_RDONLY;
+#ifdef O_BINARY
+    /* Use binary mode to avoid having to deal with different EOL characters. */
+    fd_flags |= O_BINARY;
+#endif
+    if ((input_file = my_open (convert_filename, fd_flags, 0444)) == -1)
       {
 	int errno_val = errno;
         notice ("%s: can't open file `%s' for reading: %s\n",
@@ -4347,36 +4425,38 @@ edit_file (hp)
   
       strcpy (new_filename, convert_filename);
       strcat (new_filename, save_suffix);
-      if (my_link (convert_filename, new_filename) == -1)
+
+      if (my_access (new_filename, F_OK) == 0)
+	{
+	  if (!quiet_flag)
+	    notice ("%s: warning: file `%s' already saved in `%s'\n",
+		    pname,
+		    shortpath (NULL, convert_filename),
+		    shortpath (NULL, new_filename));
+	}
+      else if (my_rename (convert_filename, new_filename) == -1)
         {
 	  int errno_val = errno;
-	  if (errno_val == EEXIST)
-            {
-              if (!quiet_flag)
-                notice ("%s: warning: file `%s' already saved in `%s'\n",
-			pname,
-			shortpath (NULL, convert_filename),
-			shortpath (NULL, new_filename));
-            }
-          else
-            {
-              notice ("%s: can't link file `%s' to `%s': %s\n",
-		      pname,
-		      shortpath (NULL, convert_filename),
-		      shortpath (NULL, new_filename),
-		      xstrerror (errno_val));
-              return;
-            }
+	  notice ("%s: can't rename file `%s' to `%s': %s\n",
+		  pname,
+		  shortpath (NULL, convert_filename),
+		  shortpath (NULL, new_filename),
+		  xstrerror (errno_val));
+	  return;
         }
     }
 
   if (my_unlink (convert_filename) == -1)
     {
       int errno_val = errno;
-      notice ("%s: can't delete file `%s': %s\n",
-	      pname, shortpath (NULL, convert_filename),
-	      xstrerror (errno_val));
-      return;
+      /* The file may have already been renamed.  */
+      if (errno_val != ENOENT)
+        {
+	  notice ("%s: can't delete file `%s': %s\n",
+		  pname, shortpath (NULL, convert_filename),
+		  xstrerror (errno_val));
+	  return;
+	}
     }
 
   {
@@ -4392,6 +4472,10 @@ edit_file (hp)
 		xstrerror (errno_val));
         return;
       }
+#ifdef O_BINARY
+    /* Use binary mode to avoid changing the existing EOL character.  */
+    setmode (output_file, O_BINARY);
+#endif
   
     /* Write the output file.  */
   
@@ -4471,9 +4555,9 @@ do_processing ()
     }
 
   syscalls_len = strlen (syscalls_absolute_filename);
-  if (*(syscalls_absolute_filename + syscalls_len - 1) != '/')
+  if (! IS_DIR_SEPARATOR (*(syscalls_absolute_filename + syscalls_len - 1)))
     {
-      *(syscalls_absolute_filename + syscalls_len++) = '/';
+      *(syscalls_absolute_filename + syscalls_len++) = DIR_SEPARATOR;
       *(syscalls_absolute_filename + syscalls_len) = '\0';
     }
   strcat (syscalls_absolute_filename, syscalls_filename);
@@ -4555,7 +4639,17 @@ main (argc, argv)
   int c;
   const char *params = "";
 
-  pname = strrchr (argv[0], '/');
+  pname = strrchr (argv[0], DIR_SEPARATOR);
+#ifdef DIR_SEPARATOR_2
+  if (pname)
+    {
+      char *slash;
+
+      slash = strrchr (pname, DIR_SEPARATOR_2);
+      if (slash)
+	pname = slash;
+    }
+#endif
   pname = pname ? pname+1 : argv[0];
 
 #ifdef HAVE_LC_MESSAGES

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019