strtok_r.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:3k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /* $NetBSD: strtok_r.c,v 1.9 2003/08/07 16:43:53 agc Exp $ */
  2. /*
  3.  * Copyright (c) 1988 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Neither the name of the University nor the names of its contributors
  15.  *    may be used to endorse or promote products derived from this software
  16.  *    without specific prior written permission.
  17.  *
  18.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  19.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  22.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  23.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  24.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  25.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  26.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  27.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28.  * SUCH DAMAGE.
  29.  */
  30. #include <net-snmp/net-snmp-config.h>
  31. #if !HAVE_STRTOK_R
  32. #ifndef WIN32
  33. #include <sys/cdefs.h>
  34. #endif
  35. #include <string.h>
  36. /*
  37.  * thread-save version of strtok
  38.  */
  39. char *
  40. strtok_r(char *s, const char *delim, char **lasts)
  41. {
  42. const char *spanp;
  43. int c, sc;
  44. char *tok;
  45. /* s may be NULL */
  46. /*assert(delim != NULL);*/
  47. /*assert(lasts != NULL);*/
  48. if (s == NULL && (s = *lasts) == NULL)
  49. return (NULL);
  50. /*
  51.  * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
  52.  */
  53. cont:
  54. c = *s++;
  55. for (spanp = delim; (sc = *spanp++) != 0;) {
  56. if (c == sc)
  57. goto cont;
  58. }
  59. if (c == 0) { /* no non-delimiter characters */
  60. *lasts = NULL;
  61. return (NULL);
  62. }
  63. tok = s - 1;
  64. /*
  65.  * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
  66.  * Note that delim must have one NUL; we stop if we see that, too.
  67.  */
  68. for (;;) {
  69. c = *s++;
  70. spanp = delim;
  71. do {
  72. if ((sc = *spanp++) == c) {
  73. if (c == 0)
  74. s = NULL;
  75. else
  76. s[-1] = 0;
  77. *lasts = s;
  78. return (tok);
  79. }
  80. } while (sc != 0);
  81. }
  82. /* NOTREACHED */
  83. }
  84. #endif                          /* !HAVE_STRTOK_R */