Setup 2.218.2.6 [Was: Re: Setup 2.218.2.4] (new version uploaded)

Christopher Faylor cgf@redhat.com
Tue May 14 15:56:00 GMT 2002


On Tue, May 14, 2002 at 01:27:46PM -0400, Christopher Faylor wrote:
>On Tue, May 14, 2002 at 01:10:05PM -0400, Charles Wilson wrote:
>>Christopher Faylor wrote:
>>
>>>On Tue, May 14, 2002 at 10:40:19AM -0400, Charles Wilson wrote:
>>>
>>>>Still doesn't work when installing from a "local" directory (although it 
>>>>works fine when installing from internet)
>>>>
>>>>Once it begins parsing setup.ini, it dies almost immediately.  But, 
>>>>there is no warning or error popup.
>>>>
>>>
>>>If I send you a debuggable setup.exe, would you mind running it and
>>>getting a back trace?
>>
>>Yeah, I could do that.
>
>Actually, I think I duplicated the problem.
>
>Stay tuned.

The attached patch seems to fix this and some other problems.

I've uploaded a new version to sourceware.

At least some of the below should be useful on the trunk, too.

cgf

2002-05-14  Christopher Faylor  <cgf@redhat.com>

        * filemanip.h (trail): Declare.
        * filemanip.cc (trail): New function.
        (find_tar_ext): Use trail() instead of strstr().
        * fromcwd.cc (check_ini): Ditto.
        * ini.cc (find_routine): Ditto.  Don't tack local_dir to path since it
        should now be fully qualified.  Set ini_filename.  Reset error_buf and
        error_count for any subsequent ini file parsing.
        (ini_filename): New static variable for parse error reporting.
        (yyerror): Use full path of setup.ini in error message.  Subtract one
        from line number if at bol.
        * find.cc (found_part): Eliminate.
        (find_sub): Call for_each with full path found rather than just file
        component.
        (find): Don't calculate found_part.
        * inilex.l (ini_init): Flush input buffer and reset line number.
        (yybol): New function.  Exports YY_AT_BOL.
        * iniparse.y: Increase stack depth to allow more tokens to be processed.
        (yyparse): Remove newline from error condition to allow subsequent
        per-line error processing to proceed normally.

Index: ChangeLog
===================================================================
RCS file: /cvs/cygwin-apps/setup/ChangeLog,v
retrieving revision 2.218.2.6
diff -u -p -r2.218.2.6 ChangeLog
--- ChangeLog	14 May 2002 04:32:44 -0000	2.218.2.6
+++ ChangeLog	14 May 2002 22:45:15 -0000
@@ -1,5 +1,27 @@
 2002-05-14  Christopher Faylor  <cgf@redhat.com>
 
+	* filemanip.h (trail): Declare.
+	* filemanip.cc (trail): New function.
+	(find_tar_ext): Use trail() instead of strstr().
+	* fromcwd.cc (check_ini): Ditto.
+	* ini.cc (find_routine): Ditto.  Don't tack local_dir to path since it
+	should now be fully qualified.  Set ini_filename.  Reset error_buf and
+	error_count for any subsequent ini file parsing.
+	(ini_filename): New static variable for parse error reporting.
+	(yyerror): Use full path of setup.ini in error message.  Subtract one
+	from line number if at bol.
+	* find.cc (found_part): Eliminate.
+	(find_sub): Call for_each with full path found rather than just file
+	component.
+	(find): Don't calculate found_part.
+	* inilex.l (ini_init): Flush input buffer and reset line number.
+	(yybol): New function.  Exports YY_AT_BOL.
+	* iniparse.y: Increase stack depth to allow more tokens to be processed.
+	(yyparse): Remove newline from error condition to allow subsequent
+	per-line error processing to proceed normally.
+
+2002-05-14  Christopher Faylor  <cgf@redhat.com>
+
 	* find.cc (find_sub): Be more defensive in preserving trailing parts of
 	components when doing recursive directory searches or calling user
 	supplied for_each().
Index: filemanip.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/filemanip.cc,v
retrieving revision 2.6
diff -u -p -r2.6 filemanip.cc
--- filemanip.cc	19 Feb 2002 04:33:28 -0000	2.6
+++ filemanip.cc	14 May 2002 22:45:16 -0000
@@ -72,12 +72,12 @@ find_tar_ext (const char *path)
 {
   char *end = strchr (path, '\0');
   /* check in longest first order */
-  char *ext;
-  if ((ext = strstr (path, ".tar.bz2")) && (end - ext) == 8)
+  const char *ext;
+  if ((ext = trail (path, ".tar.bz2")) && (end - ext) == 8)
     return ext - path;
-  if ((ext = strstr (path, ".tar.gz")) && (end - ext) == 7)
+  if ((ext = trail (path, ".tar.gz")) && (end - ext) == 7)
     return ext - path;
-  if ((ext = strstr (path, ".tar")) && (end - ext) == 4)
+  if ((ext = trail (path, ".tar")) && (end - ext) == 4)
     return ext - path;
   return 0;
 }
@@ -140,6 +140,19 @@ parse_filename (String const &in_fn, fil
   f.ver = *ver ? ver : "0.0";
   delete[] p;
   return 1;
+}
+
+const char *
+trail (const char *haystack, const char *needle)
+{
+  /* See if the path ends in a trailing setup.ini component.
+     Just return if it doesn't. */
+  unsigned len = strlen (haystack);
+  int prefix_len = len - strlen (needle);
+  if (prefix_len < 0
+      || strcasecmp (haystack += prefix_len, needle) != 0)
+    return NULL;
+  return haystack;
 }
 
 String
Index: filemanip.h
===================================================================
RCS file: /cvs/cygwin-apps/setup/filemanip.h,v
retrieving revision 1.7
diff -u -p -r1.7 filemanip.h
--- filemanip.h	19 Feb 2002 04:33:28 -0000	1.7
+++ filemanip.h	14 May 2002 22:45:16 -0000
@@ -30,3 +30,4 @@ int parse_filename (String const & in_fn
 String base (String const &);
 unsigned int get_file_size (String const &);
 String backslash (String const &);
+const char * trail (const char *, const char *);
Index: find.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/find.cc,v
retrieving revision 2.3.6.1
diff -u -p -r2.3.6.1 find.cc
--- find.cc	14 May 2002 04:32:44 -0000	2.3.6.1
+++ find.cc	14 May 2002 22:45:16 -0000
@@ -30,7 +30,7 @@ static const char *cvsid =
 #include "String++.h"
 #include "find.h"
 
-static char dir[_MAX_PATH], *found_part;
+static char dir[_MAX_PATH];
 
 static int
 find_sub (void (*for_each) (char *, unsigned int))
@@ -60,7 +60,7 @@ find_sub (void (*for_each) (char *, unsi
 	find_sub (for_each);
       else
 	{
-	  for_each (found_part, wfd.nFileSizeLow);
+	  for_each (dir, wfd.nFileSizeLow);
 	  rv++;
 	}
 
@@ -75,7 +75,6 @@ int
 find (String const &starting_dir, void (*_for_each) (char *, unsigned int))
 {
   strcpy (dir, starting_dir.cstr_oneuse());
-  found_part = dir + strlen (dir) + 1;
 
   return find_sub (_for_each);
 }
Index: fromcwd.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/fromcwd.cc,v
retrieving revision 2.22
diff -u -p -r2.22 fromcwd.cc
--- fromcwd.cc	18 Feb 2002 13:53:06 -0000	2.22
+++ fromcwd.cc	14 May 2002 22:45:18 -0000
@@ -141,7 +141,7 @@ static bool found_ini;
 static void
 check_ini (char *path, unsigned int fsize)
 {
-  if (fsize && strstr (path, "setup.ini"))
+  if (fsize && trail (path, "setup.ini"))
     found_ini = true;
 }
 
Index: ini.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/ini.cc,v
retrieving revision 2.22.2.1
diff -u -p -r2.22.2.1 ini.cc
--- ini.cc	14 May 2002 04:32:45 -0000	2.22.2.1
+++ ini.cc	14 May 2002 22:45:19 -0000
@@ -43,6 +43,7 @@ static const char *cvsid =
 #include "site.h"
 #include "rfc1738.h"
 #include "find.h"
+#include "filemanip.h"
 
 #include "io_stream.h"
 
@@ -62,27 +63,28 @@ static int error_count = 0;
 
 static int local_ini;
 
+static const char *ini_filename;
+
 static void
 find_routine (char *path, unsigned int fsize)
 {
-  /* See if the path ends in a trailing setup.ini component.
-     Just return if it doesn't. */
-  unsigned pathlen = strlen (path);
-  unsigned pathprefix_len = pathlen - 10;
-  if (pathlen < strlen ("setup.ini")
-      || strcasecmp (path + pathprefix_len, "\\setup.ini") != 0)
+  const char *setup_ini = trail (path, "\\setup.ini");
+
+  if (setup_ini == NULL)
     return;
 
-  io_stream *ini_file = io_stream::open (String ("file://") + local_dir + "/" +
+  unsigned pathprefix_len = setup_ini - path;
+
+  io_stream *ini_file = io_stream::open (String ("file://") +
 					 path, "rb");
   if (!ini_file)
     {
-    note (NULL, IDS_SETUPINI_MISSING, (String ("file://") + local_dir + "/" +
+    note (NULL, IDS_SETUPINI_MISSING, (String ("file://") +
 				       path).cstr_oneuse());
     return;
     }
   else
-    log (LOG_BABBLE, String ("Found ini file - file://") + local_dir + "/" + path);
+    log (LOG_BABBLE, String ("Found ini file - file://") + path);
 
   /* FIXME: only use most recent copy */
   setup_timestamp = 0;
@@ -96,12 +98,15 @@ find_routine (char *path, unsigned int f
   String mirror = rfc1738_unescape_part (path_prefix);
   ini_init (ini_file, mirror);
 
-  /*yydebug = 1; */
+  /*yydebug = 1;*/
 
+  ini_filename = path;
   if (yyparse () || error_count > 0)
     MessageBox (0, error_buf, error_count == 1 ? "Parse Error" : "Parse Errors", 0);
   else
     local_ini++;
+  *error_buf = '\0';
+  error_count = 0;
 }
 
 static int
@@ -251,15 +256,15 @@ do_ini (HINSTANCE h, HWND owner)
   CreateThread (NULL, 0, do_ini_thread_reflector, context, 0, &threadID);
 }
 
-
 extern int yylineno;
+extern int yybol ();
 
 extern "C" int
 yyerror (char *s, ...)
 {
-  char buf[1000];
+  char buf[MAX_PATH + 1000];
   int len;
-  sprintf (buf, "setup.ini line %d: ", yylineno);
+  sprintf (buf, "%s line %d: ", ini_filename, yylineno - yybol ());
   va_list args;
   va_start (args, s);
   vsprintf (buf + strlen (buf), s, args);
Index: iniparse.y
===================================================================
RCS file: /cvs/cygwin-apps/setup/iniparse.y,v
retrieving revision 2.27.2.1
diff -u -p -r2.27.2.1 iniparse.y
--- iniparse.y	10 May 2002 10:59:05 -0000	2.27.2.1
+++ iniparse.y	14 May 2002 22:45:20 -0000
@@ -37,6 +37,7 @@ int yylex ();
 #include "cygpackage.h"
 
 #define YYERROR_VERBOSE 1
+#define YYINITDEPTH 1000
 /*#define YYDEBUG 1*/
 
 static packagemeta *cp = 0;
@@ -108,9 +109,8 @@ simple_line
  | T_TEST			{ trust = TRUST_TEST; cpv = new cygpackage (cp->name); }
  | T_UNKNOWN			{ trust = TRUST_UNKNOWN; }
  | /* empty */
- | error '\n' { yylineno --;
-		yyerror ("unrecognized line in package %s (do you have the latest setup?)", cp->name.cstr_oneuse());
-		yylineno ++;
+ | error  {	yyerror ("unrecognized line in package %s (do you have the latest setup?)", cp->name.cstr_oneuse());
+		yyerrok;
 	      }
  ;
 
Index: inilex.l
===================================================================
RCS file: /cvs/cygwin-apps/setup/inilex.l,v
retrieving revision 2.14.2.1
retrieving revision 2.14.2.3
diff -u -p -r2.14.2.1 -r2.14.2.3
--- inilex.l	4 May 2002 01:21:59 -0000	2.14.2.1
+++ inilex.l	14 May 2002 22:49:19 -0000	2.14.2.3
@@ -113,6 +113,8 @@ ini_init(io_stream *stream, String const
   if (parse_mirror)
     delete[] parse_mirror;
   parse_mirror = mirror.cstr();
+  YY_FLUSH_BUFFER;
+  yylineno = 1;
 }
 
 static int
@@ -142,4 +144,10 @@ ignore_line ()
       if (c == '\n')
 	return;
     }
+}
+
+int
+yybol ()
+{
+  return !!YY_AT_BOL ();
 }



More information about the Cygwin-apps mailing list