From 83803754b372d99b5da0233ffd772268f9fe5731 Mon Sep 17 00:00:00 2001 From: "William F. Jolitz" Date: Sun, 5 Nov 1989 22:39:57 -0800 Subject: [PATCH] 386BSD 0.1 development Work on file usr/src/usr.bin/grep/README.sunos4 Co-Authored-By: Lynne Greer Jolitz Synthesized-from: 386BSD-0.1 --- usr/src/usr.bin/grep/README.sunos4 | 99 ++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 usr/src/usr.bin/grep/README.sunos4 diff --git a/usr/src/usr.bin/grep/README.sunos4 b/usr/src/usr.bin/grep/README.sunos4 new file mode 100644 index 0000000000..fc01d2aead --- /dev/null +++ b/usr/src/usr.bin/grep/README.sunos4 @@ -0,0 +1,99 @@ +[ 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: mike@wheaties.ai.mit.edu +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 '^': -- 2.20.1