home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / c / 11599 < prev    next >
Encoding:
Text File  |  1992-07-25  |  2.0 KB  |  69 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!munnari.oz.au!cs.mu.OZ.AU!munta.cs.mu.OZ.AU!fjh
  3. From: fjh@munta.cs.mu.OZ.AU (Fergus James HENDERSON)
  4. Subject: Re: HIgher problems at hand. HELP!
  5. Message-ID: <9220806.7841@mulga.cs.mu.OZ.AU>
  6. Sender: news@cs.mu.OZ.AU
  7. Organization: Computer Science, University of Melbourne, Australia
  8. References: <Brv6oD.Dq5@usenet.ucs.indiana.edu> <1992Jul25.142216.5636@druid.uucp>
  9. Date: Sat, 25 Jul 1992 20:29:41 GMT
  10. Lines: 57
  11.  
  12. darcy@druid.uucp (D'Arcy J.M. Cain) writes:
  13.  
  14. >/*
  15. > * strstr - find first occurrence of wanted in s
  16. > *
  17. > * based on code by Henry Spencer
  18. > * modified for ANSI by D'Arcy J.M. Cain
  19. > */
  20. >
  21. >/* The following define required for full checking.  The problem is that */
  22. >/* the function has to ultimately assign a const char * to the return */
  23. >/* value which has to be char *.  The answer is to drop the use of */
  24. >/* const in this module and trust the code to do the right thing */
  25. >#define        const
  26.  
  27. Yuck!
  28. Do *not* #define keywords unless you have absolutely no alternative.
  29.  
  30. >#include    <string.h>
  31.  
  32. Now what happens if string.h happens to contain
  33.     const CHAR_BIT = 8;
  34. or some such?
  35.  
  36. >char    *strstr(const char *s, const char *wanted)
  37.  
  38. This is a *different* prototype to the externally visible one, since
  39. this one doesn't include "const". An implementation is well within it's
  40. rights to give you a warning at link time, and probably even an error.
  41.  
  42. >{
  43. >    size_t len;
  44. >    char firstc;
  45. >
  46. >    /*
  47. >     * The odd placement of the two tests is so "" is findable.
  48. >     * Also, we inline the first char for speed.
  49. >     */
  50. >    firstc = *wanted;
  51. >    len = strlen(wanted);
  52. >
  53. >    while (*s != firstc || strncmp(s, wanted, len) != 0)
  54. >        if (*s++ == '\0')
  55. >            return(NULL);
  56. >
  57. >    return(s);
  58. >}
  59.  
  60. The solution to the const problem is just to put a cast in the final return
  61. statement:
  62.     return (const char *) s;
  63.  
  64. -- 
  65. Fergus Henderson             fjh@munta.cs.mu.OZ.AU      
  66. This .signature VIRUS is a self-referential statement that is true - but 
  67. you will only be able to consistently believe it if you copy it to your own
  68. .signature file!
  69.