Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Aug 1998 13:38:11 +1000
From:      Bruce Evans <bde@zeta.org.au>
To:        bde@zeta.org.au, jdp@polstra.com
Cc:        bugs@FreeBSD.ORG, dmm125@bellatlantic.net
Subject:   Re: error in libcompat (2.2.7)
Message-ID:  <199808280338.NAA22459@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>> Not a bug.  The prototype must declare the arg as an int to match the
>> old-style-but-still-ANSI definition.  The definition uses char for
>> historical reasons.  Changing it would be incompatible.  See rev.1.4
>> of ftok.3 for some notes about this.
>
>I don't agree.  If the prototype says it's an int, then it should be
>declared as int in the definition too.  The definition should look
>like this:
>
>key_t
>ftok(path, id)
>	const char *path;
>	int id;
>{
>	struct stat st;
>
>	if (stat(path, &st) < 0)
>		return (key_t)-1;
>
>	return (key_t) ((char)id << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff));
>}
>
>Here, I changed the type of "id" to int, and added a (char) cast in
>front of its only use.

This is just doing the compiler's work for it.  The `char id' arg in the
definition causes the `int id' arg in the prototype to be converted to a
char on entry to the function, as if by assignment (ISO 6.7.1).  Your cast
is equivalent to such an assignment, modulo compiler optimizations,
compiler warnings (compilers tend to warn more about assignments than
casts) and style bugs.

Bruce

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199808280338.NAA22459>