view src/os/string.c @ 126:de391a7d85b1

Created strtok_r, now using it
author Jonathan Pevarnek <pevarnj@gmail.com>
date Fri, 24 Jun 2011 10:50:09 -0400
parents 56447a5e2d2f
children 2d47a53a5736
line wrap: on
line source

#include <string.h>

//returns true if c is a character in the c-string characters, false otherwise
static char isChar(const char c, const char *characters);

int strcmp(const char *a, const char *b)
{
	while(1) {
		if(*a - *b) return *a - *b;
		if(*a == '\0') return 0;
		a++;
		b++;
	}
	return -1;
}

void strcpy(char *dest, const char *src)
{
	while((*dest++ = *src++));
}

char* strcat(char *dest, const char *src)
{
	char *ret = dest;
	while(*dest&& *++dest); //get to null in first string
	while((*dest++ = *src++));
	return ret;
}

void* memcpy(void *dest, const void *src, size_t num)
{
	size_t i;
	const u8 *from = src;
	u8 *to = dest;
	for(i = 0; i < num; i++)
		to[i] = from[i];
	return dest;
}

void* memset(void *dest, u8 value, size_t num)
{
	size_t i;
	u8 *ptr = dest;
	for(i = 0; i < num; i++, ptr++) {
		*ptr = value;
	}
	return dest;
}

size_t strlen(const char *str)
{
	const char *ptr = str;
	while(*ptr && *++ptr);
	return ptr - str;
}

char *strtok(char *str, const char *delimiters)
{
	static char* last = NULL;
	return strtok_r(str, delimiters, &last);
}

char *strtok_r(char *str, const char *delimiters, char **loc)
{
	char *track = *loc, *ret;
	if(str) track = str;
	if(!track) return track; //return null if done
	while(isChar(*track, delimiters)) track++;
	ret = track; //first non-deliminator character, start of string
	while(*track && !isChar(*track, delimiters)) track++;
	if(!*track) track = NULL;
	else *track++ = '\0';
	*loc = track;
	return ret;
}

static char isChar(const char c, const char *characters)
{
	while(*characters) {
		if(*characters == c) return *characters;
		characters++;
	}
	return '\0';
}