3 * @author Shinichiro Nakamura
4 * @brief NT-Shell用オプション解析モジュールの実装。
8 * ===============================================================
9 * Natural Tiny Shell (NT-Shell)
11 * ===============================================================
12 * Copyright (c) 2010-2011 Shinichiro Nakamura
14 * Permission is hereby granted, free of charge, to any person
15 * obtaining a copy of this software and associated documentation
16 * files (the "Software"), to deal in the Software without
17 * restriction, including without limitation the rights to use,
18 * copy, modify, merge, publish, distribute, sublicense, and/or
19 * sell copies of the Software, and to permit persons to whom the
20 * Software is furnished to do so, subject to the following
23 * The above copyright notice and this permission notice shall be
24 * included in all copies or substantial portions of the Software.
26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
28 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
30 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
31 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
32 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
33 * OTHER DEALINGS IN THE SOFTWARE.
34 * ===============================================================
40 * @brief 与えられた文字がデリミタであるかどうかを判定する。
42 * @retval true デリミタである。
43 * @retval false デリミタでない。
46 (((c) == '\r') || ((c) == '\n') || ((c) == '\t') || ((c) == '\0') || ((c) == ' '))
48 static int ntopt_get_count(const char *str);
49 static char *ntopt_get_text(
50 const char *str, const int n, char *buf, int siz, int *len);
53 * @brief 与えられた文字列のセンテンス数を取得する。
57 static int ntopt_get_count(const char *str)
61 char *p = (char *)str;
77 * @brief 与えられた文字列のセンテンスを取得する。
79 * @param n センテンス。(0からntopt-get_count(str) - 1までの値。)
81 * @param siz 格納バッファのサイズ。
82 * @param len 格納した文字列のサイズ。
83 * @retval !NULL 取得成功。格納バッファへのポインタ。
86 static char *ntopt_get_text(
87 const char *str, const int n, char *buf, int siz, int *len)
91 char *p = (char *)str;
100 while (!IS_DELIM(*p)) {
124 * @brief 与えられた文字列をデリミタで分割する。
126 * @param func コールバック関数。
127 * @param extobj 拡張オブジェクト。
128 * @return コールバック関数が返した値。
132 int (*func)(int argc, char **argv, void *extobj),
136 char argv[NTOPT_TEXT_MAXLEN];
137 char *argvp[NTOPT_TEXT_MAXARGS];
142 argc = ntopt_get_count(str);
143 if (NTOPT_TEXT_MAXARGS <= argc) {
144 argc = NTOPT_TEXT_MAXARGS;
149 for (i = 0; i < argc; i++) {
151 argvp[i] = ntopt_get_text(
152 str, i, p, NTOPT_TEXT_MAXLEN - total, &len);
153 if (total + len + 1 < NTOPT_TEXT_MAXLEN) {
161 return func(argc, &argvp[0], extobj);