All pastes #25730 Raw Edit

C function for string replacement

public text v1 · immutable
#25730 ·published 2005-10-17 06:06 UTC
rendered paste body
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


static void check_replace(const char *src, const char *key, const char *replacement, size_t resultsize);
static void replace(const char *src, const char *key, const char *replacement, char *result, size_t resultsize);


int main(int argc, char *argv[]);
int main(int argc, char *argv[])
{
	/* destination string too small */
	check_replace("abcdefgh", "def", "ghij", 8);

	check_replace("abcdefgh", "def", "", 100);
	check_replace("abcdefgh", "", "#", 100);
	check_replace("abcdefgh", "", "", 100);

	check_replace("source string to be replaced--e e r r", "e r", "xxxx", 100);

	return(EXIT_SUCCESS);
}

static void check_replace(const char *src, const char *key, const char *replacement, size_t resultsize)
{
	char result[256];

	assert(resultsize+1 <= sizeof(result));

	replace(src, key, replacement, result, resultsize+1);
	printf("replace(src=%s, key=%s, replacement=%s)=%s\n", src, key, replacement, result);
}

/**
 * Replace in string src all occurrences of key by replacement. The resulting
 * string is put into result; at most resultsize characters (including the
 * terminating null character) will be written to result.
 */
static void replace(const char *src, const char *key, const char *replacement, char *result, size_t resultsize)
{
	size_t resultlen;
	size_t keylen;

	assert(resultsize > 0);

	/* special case to prevent infinite loop if key==replacement=="" */
	if(strcmp(key, replacement) == 0)
	{
		snprintf(result, resultsize, "%s", src);
		return;
	}

	keylen = strlen(key);

	resultlen = 0;
	while(*src != '\0' && resultlen+1 < resultsize)
	{
		if(strncmp(src, key, keylen) == 0)
		{
			snprintf(result+resultlen, resultsize-resultlen, "%s", replacement);
			resultlen += strlen(result+resultlen);
			src += keylen;
		}
		else
		{
			result[resultlen++] = *src++;
		}
	}
	result[resultlen] = '\0';
}