386BSD 0.1 development
[unix-history] / usr / src / usr.bin / grep / README.sunos4
CommitLineData
83803754
WJ
1[ N.B. This bug strikes on a Sun 3 running SunOS 4 with the cc -O4 option
2 as well as on the sparc. -Mike ]
3
4Date: Fri, 24 Feb 89 15:36:40 -0600
5To: mike@wheaties.ai.mit.edu
6From: Dave Cohrs <dave@cs.wisc.edu>
7Subject: bug + fix in gnu grep 1.2 (from prep.ai.mit.edu)
8
9I tried installing the GNU grep 1.2 on a Sun4 running 4.0.1 and
10"Spencer test #36" failed. After some experimenting, I found and
11fixed the bug. Well, actually, the bug in the the C compiler, but
12I managed a workaround.
13
14Description:
15
16The Sun4 4.0.1 C compiler with -O doesn't generate the correct for
17statements of the form
18 if("string")
19 x;
20 else
21 y;
22To be exact, "y;" gets executed, while "x;" should. This causes the
23#define FETCH() to fail for test #36.
24
25Fix:
26
27In an #ifdef sparc in dfa.c, I made two versions of FETCH, FETCH0() and
28the regular FETCH(). The former takes only one argument, the latter
29expects its 2nd argument to contain a non-nil string. This removes
30the need to test the constant strings, and the compiler bug isn't
31exercised. I then changed the one instance of FETCH() with a nil
32second argument to be FETCH0() instead.
33
34dave cohrs
35
36===================================================================
37RCS file: RCS/dfa.c,v
38retrieving revision 1.1
39diff -c -r1.1 dfa.c
40*** /tmp/,RCSt1a05930 Fri Feb 24 15:32:33 1989
41--- dfa.c Fri Feb 24 15:23:34 1989
42***************
43*** 285,293 ****
44--- 285,315 ----
45 is turned off). */
46
47 /* Note that characters become unsigned here. */
48+ #ifdef sparc
49+ /*
50+ * Sun4 4.0.1 C compiler can't compare constant strings correctly.
51+ * e.g. if("test") { x; } else { y; }
52+ * the compiler will not generate code to execute { x; }, but
53+ * executes { y; } instead.
54+ */
55+ #define FETCH0(c) \
56+ { \
57+ if (! lexleft) \
58+ return _END; \
59+ (c) = (unsigned char) *lexptr++; \
60+ --lexleft; \
61+ }
62 #define FETCH(c, eoferr) \
63 { \
64 if (! lexleft) \
65+ regerror(eoferr); \
66+ (c) = (unsigned char) *lexptr++; \
67+ --lexleft; \
68+ }
69+ #else
70+ #define FETCH(c, eoferr) \
71+ { \
72+ if (! lexleft) \
73 if (eoferr) \
74 regerror(eoferr); \
75 else \
76***************
77*** 295,300 ****
78--- 317,323 ----
79 (c) = (unsigned char) *lexptr++; \
80 --lexleft; \
81 }
82+ #endif sparc
83
84 static _token
85 lex()
86***************
87*** 303,309 ****
88--- 326,336 ----
89 int invert;
90 _charset cset;
91
92+ #ifdef sparc
93+ FETCH0(c);
94+ #else
95 FETCH(c, (char *) 0);
96+ #endif sparc
97 switch (c)
98 {
99 case '^':