strtok.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1988 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the University of
  16.  * California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33. #if defined(LIBC_SCCS) && !defined(lint)
  34. /*static char *sccsid = "from: @(#)strtok.c 5.8 (Berkeley) 2/24/91";*/
  35. static char *rcsid = "$Id$";
  36. #endif /* LIBC_SCCS and not lint */
  37. #include <pthread.h>
  38. #include <string.h>
  39. #include <stdlib.h>
  40. char *
  41. strtok(s, delim)
  42. register char *s;
  43. register const char *delim;
  44. {
  45. static pthread_mutex_t strtok_mutex = PTHREAD_MUTEX_INITIALIZER;
  46. static pthread_key_t strtok_key = -1;
  47. char **lasts;
  48. pthread_mutex_lock(&strtok_mutex);
  49. if (strtok_key < 0) {
  50. if (pthread_key_create(&strtok_key, free) < 0) {
  51. pthread_mutex_unlock(&strtok_mutex);
  52. return(NULL);
  53. }
  54. }
  55. pthread_mutex_unlock(&strtok_mutex);
  56. if ((lasts = pthread_getspecific(strtok_key)) == NULL) {
  57. if ((lasts = (char **)malloc(sizeof(char *))) == NULL) {
  58. return(NULL);
  59. }
  60. pthread_setspecific(strtok_key, lasts);
  61. }
  62. return(strtok_r(s, delim, lasts));
  63. }
  64. char *
  65. strtok_r(s, delim, lasts)
  66. register char *s;
  67. register const char *delim;
  68. register char **lasts;
  69. {
  70. register char *spanp;
  71. register int c, sc;
  72. char *tok;
  73. if (s == NULL && (s = *lasts) == NULL)
  74. return (NULL);
  75. /*
  76.  * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
  77.  */
  78. cont:
  79. c = *s++;
  80. for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
  81. if (c == sc)
  82. goto cont;
  83. }
  84. if (c == 0) { /* no non-delimiter characters */
  85. *lasts = NULL;
  86. return (NULL);
  87. }
  88. tok = s - 1;
  89. /*
  90.  * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
  91.  * Note that delim must have one NUL; we stop if we see that, too.
  92.  */
  93. for (;;) {
  94. c = *s++;
  95. spanp = (char *)delim;
  96. do {
  97. if ((sc = *spanp++) == c) {
  98. if (c == 0)
  99. s = NULL;
  100. else
  101. s[-1] = 0;
  102. *lasts = s;
  103. return (tok);
  104. }
  105. } while (sc != 0);
  106. }
  107. /* NOTREACHED */
  108. }