/** * @file mystrtok.c * * * @brief 文字列をクォーテーションを考慮してトークンに分割する * * 文字列を空白等でトークンに分割します.このとき,指定された * クォーテーション記号で囲まれた部分は必ず1つのトークンとして扱われます. * * * * @brief Extract tokens from strings, with quotation handling. * * When extracting tokens from strings, the part enclosed by the specified * braces are forced to be treated as a single token. * * * @author Akinobu LEE * @date Thu Feb 17 16:31:39 2005 * * $Revision: 1.4 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #include /* strtok with quotation handling */ /// Abbreviation macro to find if A is included in string delim #define ISTOKEN(A) strchr(delim, A) /** * Generic function to extract tokens from strings, with quotation handling. * The usage is as the same as strtok. * * @param str [i/o] source string, or NULL when this is a continuous call from previous call. Will be truncated in this function. * @param delim [in] string to specify the delimiters. * @param left_paren [in] left brace * @param right_paren [in] right brace * @param mode [in] if 1, just move to the beginning of next token * * @return pointer to the next extracted token. */ char * mystrtok_quotation(char *str, char *delim, int left_paren, int right_paren, int mode) { static char *buf; /* target string buffer */ static char *pos; /* current pointer position */ char *p; char *from; int c; if (str != NULL) { pos = buf = str; } /* find start point */ p = pos; while (*p != '\0' && ISTOKEN(*p)) p++; if (*p == '\0') return NULL; /* no token left */ /* if mode == 1, exit here */ if (mode == 1) { pos = p; return p; } /* copy to ret_buf until end point is found */ c = *p; if (c == left_paren) { p++; if (*p == '\0') return NULL; from = p; while ((c = *p) != '\0' && ((c != right_paren) || (*(p+1) != '\0' && !ISTOKEN(*(p+1))))) p++; /* if quotation not terminated, allow the rest as one token */ /* if (*p == '\0') return NULL; */ } else { from = p; while ((c = *p) != '\0' && (!ISTOKEN(c))) p++; } if (*p != '\0') { *p = '\0'; p++; } pos = p; return from; } /** * Extract tokens considering quotation by double quotation mark. * * @param str [i/o] source string, will be truncated. * @param delim [in] string of all token delimiters * * @return pointer to the next extracted token, or NULL when no token found. */ char * mystrtok_quote(char *str, char *delim) { return(mystrtok_quotation(str, delim, 34, 34, 0)); /* "\"" == 34 */ } /** * Extract tokens, not considering quotation, just as the same as strtok. * * @param str [i/o] source string, will be truncated. * @param delim [in] string of all token delimiters * * @return pointer to the next extracted token, or NULL when no token found. */ char * mystrtok(char *str, char *delim) { return(mystrtok_quotation(str, delim, -1, -1, 0)); } /** * Just move to the beginning of the next token, without modifying the @a str. * * @param str [i/o] source string, will be truncated. * @param delim [in] string of all token delimiters * * @return pointer to the next extracted token, or NULL when no token found. */ char * mystrtok_movetonext(char *str, char *delim) { return(mystrtok_quotation(str, delim, -1, -1, 1)); }