Mail Archives: cygwin-apps/2002/05/14/18:56:17
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 AT redhat DOT 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 AT redhat DOT 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 AT redhat DOT 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 ();
}
- Raw text -