Category : OS/2 Files
Archive   : GNUGREP.ZIP
Filename : README.SUN

 
Output of file : README.SUN contained in archive : GNUGREP.ZIP
[ N.B. This bug strikes on a Sun 3 running SunOS 4 with the cc -O4 option
as well as on the sparc. -Mike ]

Date: Fri, 24 Feb 89 15:36:40 -0600
To: [email protected]
From: Dave Cohrs
Subject: bug + fix in gnu grep 1.2 (from prep.ai.mit.edu)

I tried installing the GNU grep 1.2 on a Sun4 running 4.0.1 and
"Spencer test #36" failed. After some experimenting, I found and
fixed the bug. Well, actually, the bug in the the C compiler, but
I managed a workaround.

Description:

The Sun4 4.0.1 C compiler with -O doesn't generate the correct for
statements of the form
if("string")
x;
else
y;
To be exact, "y;" gets executed, while "x;" should. This causes the
#define FETCH() to fail for test #36.

Fix:

In an #ifdef sparc in dfa.c, I made two versions of FETCH, FETCH0() and
the regular FETCH(). The former takes only one argument, the latter
expects its 2nd argument to contain a non-nil string. This removes
the need to test the constant strings, and the compiler bug isn't
exercised. I then changed the one instance of FETCH() with a nil
second argument to be FETCH0() instead.

dave cohrs

===================================================================
RCS file: RCS/dfa.c,v
retrieving revision 1.1
diff -c -r1.1 dfa.c
*** /tmp/,RCSt1a05930 Fri Feb 24 15:32:33 1989
--- dfa.c Fri Feb 24 15:23:34 1989
***************
*** 285,293 ****
--- 285,315 ----
is turned off). */

/* Note that characters become unsigned here. */
+ #ifdef sparc
+ /*
+ * Sun4 4.0.1 C compiler can't compare constant strings correctly.
+ * e.g. if("test") { x; } else { y; }
+ * the compiler will not generate code to execute { x; }, but
+ * executes { y; } instead.
+ */
+ #define FETCH0(c) \
+ { \
+ if (! lexleft) \
+ return _END; \
+ (c) = (unsigned char) *lexptr++; \
+ --lexleft; \
+ }
#define FETCH(c, eoferr) \
{ \
if (! lexleft) \
+ regerror(eoferr); \
+ (c) = (unsigned char) *lexptr++; \
+ --lexleft; \
+ }
+ #else
+ #define FETCH(c, eoferr) \
+ { \
+ if (! lexleft) \
if (eoferr) \
regerror(eoferr); \
else \
***************
*** 295,300 ****
--- 317,323 ----
(c) = (unsigned char) *lexptr++; \
--lexleft; \
}
+ #endif sparc

static _token
lex()
***************
*** 303,309 ****
--- 326,336 ----
int invert;
_charset cset;

+ #ifdef sparc
+ FETCH0(c);
+ #else
FETCH(c, (char *) 0);
+ #endif sparc
switch (c)
{
case '^':


  3 Responses to “Category : OS/2 Files
Archive   : GNUGREP.ZIP
Filename : README.SUN

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/