[net.lang.c++] porting C++ to SUN3

josw@mcvax.uucp (Jos Warmer) (07/25/86)

I have just managed to make a port to SUN3 
(SUN 3/75, running Sun UNIX 4.2 release 3.0).
Thanks for all the suggestions about how to port C++, they were very
helpfull and I couldn't have done without them.
There are however some special fixes needed for the SUN3, which
I have not seen before on the net, so I will summarize them:

---------------------------------------------------------------------
strlen:
On a VAX strlen can handle nil-argument and delivers the value 0.
On the SUN strlen can't handle a nil-argument and a segmentation violation
occurs. To fix this change every call to strlen into a call to sun_strlen.
Add the next line as the first line to cfront.h:

	#define   strlen(string)   sun_strlen(string)

and add a new procedure sun_strlen at the end of main.c:

	#undef strlen
	int sun_strlen(char* s)
	{
	    if( s == 0 ) {
		return 0;
	    } else {
		return strlen(s);
	    }
	}

The #undef is needed to stop sun_strlen from calling itself recursively.

The C library function fputs also uses strlen, so it can not handle
nil-arguments too. Fputs and fprintf are used in the macros putst 
and putstring in token.h. To fix this redefine these macros in token.h
into :

	#define putstring(s)	( s == 0 ? 0 : fputs(s,out_file) )
	#define putst(ss)	( ss == 0 ? 0 : fprintf(out_file,"%s ",ss) )
---------------------------------------------------------------------
BUG in lex.c:
The cfront program assumes that cpp lines are of the form:

# <nr> "<filename>"<NL>

where <nr>       is a number
      <filename> is the name of a source file
      <NL>       is the newline character '\n'

There may be no characters between the last quote(") and the newline 
character. If there are such characters you get the following error message:

    un expected eol on # line

Which is a strange message anyway, because this error is reported
only if cfront does not find a newline character.
On the SUN3 cpp puts a space after the last quote, and sometimes
even a number.  I don't know the meaning of this number,
but it makes cfront creating this error message and it stops compiling.

The fix I made is to ignore everything between the last quote and the
newline character. The change is made in src/lex.c.
This is the diff file:

diff lex.c.original lex.c.fixed
950c950
< 				if (get(c) != '\n') error("unX eol on # line");
---
> 				while (get(c) != '\n') ;

---------------------------------------------------------------------
BUG in simpl.c:
Problem with de-refencing nil pointer. The next file makes the C++
compiler dump core on the SUN3. On our VAX11/780 running Unix4.3BSD
it produces the warning:
    "a.c", line 7: warning: maybe no value returned from hoi()

This error occurs when there is a return statement between "{" and "}"
and after the final "}" follows a ";".

a.c:
	int hoi()
	{
	    {
		return(9);
	    }   
	    ;
	}

The remedy is to delete the final ";".


This problem isn't really fixed, because I don't know where the nil pointer
comes from. It only gives an internal error with a line number instead
of dumping core.
Here is the diff file:

diff simpl.c.original simpl.c.fixed
540a541,545
> 				Pexpr Pexpr_tmp = tail->e;
> 				if( Pexpr_tmp == 0 ){
> 				    error('i',"fct.simpl() deref nil");
> 				}
> 

The error report of the fixed compiler is:
    "a.c", line 7: internal <<cfront 10/10/85>> error: fct.simpl() deref nil
---------------------------------------------------------------------
-- 

	Jos Warmer,       josw@mcvax.UUCP