On Tue, Apr 6, 2021 at 1:30 PM Bruno Haible <br...@clisp.org> wrote: > Paul Eggert wrote: > > Yes, that would be portable. But that cast indicates another problem > > with the API. It should return void *, not void const * (think of strchr > > as the model here). > > strchr is a bad model here: You pass it a pointer to a read-only storage > (such as a literal string) and receive a pointer that you "can" write > to: The compiler cannot warn about > strchr ("literal", 'e') [2] = 'x';
I've gotten in the habit of having two functions in cases like this. If strchr were designed according to the principles that I try to apply, we'd have functions like this: const char *strchr (const char *, int); char *strchr_rw (char *, int); The implementation of strchr is then just a wrapper around the strchr_rw(): const char * strchr (const char *s, int c) { return strchr_rw ((char *) s, c); } although if I'm doing this in PSPP I would probably use CONST_CAST: return strchr_rw (CONST_CAST (char *, s), c);