strtoken.cpp


/* \file strtoken.cpp
*
*/
#include <stdio.h>
#include <stdlib.h>

//! skips whitespace and returns next token (or null pointer)
/*!
 * \param str is input c-string (modified to point to character after
 * delimiter
 * \param delimiter marks the end of a token (usually a blank)
 * \retval c-string pointing to start of delimiter.
 * The delimiter character in the input string is replaced by a null
 * character.
 */

char *strtoken(char* &str, char delimiter)
{
	//char *str = *inp;
	if (str==0) return 0;
	while (*str == ' ') str++; // skip whitespace
	//*inp = str;
	if (*str==0) return 0;
	char *token = str;
	while (*str && *str!=delimiter) str++;
	if (*str) *str++ = 0; // substitute null for delimiter to terminate token
	//*inp = str;
	return token;
}


//! terminates string at specified character
/*! This routine terminates a string at the specified character and
*   returns a c-string pointer to the character following the delimiter.
*   @param str input c-string
*   @param delimiter token delimiter character
*   @retval c-string to character following the delimiter
*
*   For example: Suppose the string str = "name=value";
*   then char * token = strtrm(str,"=");
*   would return "value" as the token, but str would now be "name" since
*   the character '=' is replaced by a null.
*/

char *strtrm(char *str, char delimiter)
{
	if (str==0) return 0;
	while (*str && *str!=delimiter) str++;
	if (*str==0) return 0;
	*str++ = 0;
	return str;
}


//! count occurences of specified character in a string.

int strcnt(char *str, char delimiter)
{
	int n = 0;
	while (*str) {
		if (*str++ == delimiter) n++;
	}
	return n;
}

//! return pointer to character after delimiter, ignoring quoted text
/*!
 *  This routine returns a pointer (c-string) to character after the
 *  delimiter, ignoring text between quotes. Returns null if delimiter not found.
*/

char *strqtrm(char *str, char delimiter)
{
	if (str==0) return 0;
	while (*str && *str!=delimiter) {
		if (*str=='\"') {
			str++;
			while (*str && *str!='\"') str++;
			if (*str==0) return 0;
		}
		str++;
	}
	if (*str==0) return 0;
	*str++ = 0;
	return str;
}


//!  convert two digit hex string to an ASCII character

char x2c(char *str)
{
	char digit;
	/* The operation (*str & 0xdf) converts lower case to upper case */
	digit = (*str >= 'A' ? ((*str & 0xdf) - 'A')+10 : (*str - '0'));
	digit *= 16;
	str++;
	digit += (*str >= 'A' ? ((*str & 0xdf) - 'A')+10 : (*str - '0'));
	return(digit);
}

//! convert '+' to ' ' and two digit hex escape sequences to ASCII character

void unescape_url(char *url)
{
	char *cp;
	for (cp=url; *url; cp++, url++) {
		if (*url == '+') *cp = ' ';
		else if (*url == '%') {
			*cp = x2c(url+1);
			url += 2;
		}
		else *cp = *url;
	}
	*cp = '\0';
}


Results




Maintained by John Loomis, updated Tue Mar 01 09:09:08 2011