util_arg.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2001-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: util_arg.c,v 1.4 2002/02/01 18:15:30 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. static char *__db_strsep __P((char **, const char *));
  16. /*
  17.  * __db_util_arg --
  18.  * Convert a string into an argc/argv pair.
  19.  *
  20.  * PUBLIC: int __db_util_arg __P((char *, char *, int *, char ***));
  21.  */
  22. int
  23. __db_util_arg(arg0, str, argcp, argvp)
  24. char *arg0, *str, ***argvp;
  25. int *argcp;
  26. {
  27. int n, ret;
  28. char **ap, **argv;
  29. #define MAXARGS 25
  30. if ((ret =
  31.     __os_malloc(NULL, (MAXARGS + 1) * sizeof(char **), &argv)) != 0)
  32. return (ret);
  33. ap = argv;
  34. *ap++ = arg0;
  35. for (n = 1; (*ap = __db_strsep(&str, " t")) != NULL;)
  36. if (**ap != '') {
  37. ++ap;
  38. if (++n == MAXARGS)
  39. break;
  40. }
  41. *ap = NULL;
  42. *argcp = ap - argv;
  43. *argvp = argv;
  44. return (0);
  45. }
  46. /*-
  47.  * Copyright (c) 1990, 1993
  48.  * The Regents of the University of California.  All rights reserved.
  49.  *
  50.  * Redistribution and use in source and binary forms, with or without
  51.  * modification, are permitted provided that the following conditions
  52.  * are met:
  53.  * 1. Redistributions of source code must retain the above copyright
  54.  *    notice, this list of conditions and the following disclaimer.
  55.  * 2. Redistributions in binary form must reproduce the above copyright
  56.  *    notice, this list of conditions and the following disclaimer in the
  57.  *    documentation and/or other materials provided with the distribution.
  58.  * 3. All advertising materials mentioning features or use of this software
  59.  *    must display the following acknowledgement:
  60.  * This product includes software developed by the University of
  61.  * California, Berkeley and its contributors.
  62.  * 4. Neither the name of the University nor the names of its contributors
  63.  *    may be used to endorse or promote products derived from this software
  64.  *    without specific prior written permission.
  65.  *
  66.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  67.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  68.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  69.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  70.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  71.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  72.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  73.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  74.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  75.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  76.  * SUCH DAMAGE.
  77.  */
  78. /*
  79.  * Get next token from string *stringp, where tokens are possibly-empty
  80.  * strings separated by characters from delim.
  81.  *
  82.  * Writes NULs into the string at *stringp to end tokens.
  83.  * delim need not remain constant from call to call.
  84.  * On return, *stringp points past the last NUL written (if there might
  85.  * be further tokens), or is NULL (if there are definitely no more tokens).
  86.  *
  87.  * If *stringp is NULL, strsep returns NULL.
  88.  */
  89. static char *
  90. __db_strsep(stringp, delim)
  91. char **stringp;
  92. const char *delim;
  93. {
  94. const char *spanp;
  95. int c, sc;
  96. char *s, *tok;
  97. if ((s = *stringp) == NULL)
  98. return (NULL);
  99. for (tok = s;;) {
  100. c = *s++;
  101. spanp = delim;
  102. do {
  103. if ((sc = *spanp++) == c) {
  104. if (c == 0)
  105. s = NULL;
  106. else
  107. s[-1] = 0;
  108. *stringp = s;
  109. return (tok);
  110. }
  111. } while (sc != 0);
  112. }
  113. /* NOTREACHED */
  114. }