libbb/trim.c

souf souf_oued at yahoo.fr
Thu Jun 14 21:42:57 UTC 2007


Le jeudi 14 juin 2007 à 10:14 +0200, Denis Vlasenko a écrit :
> From name I can infer that this function trims something from a string.
> What does it trim? where (from the start, end, both)?

if we can understand strchr() and strrchr(), we can naturally understand bb_strtrim() and bb_strrtrim()
example:
char s[] = "    BusyBox: The Swiss Army Knife of Embedded Linux      ";

bb_strtrim(s, ':') = ": The Swiss Army Knife of Embedded Linux      "
bb_strtrim(s, 0) = "BusyBox: The Swiss Army Knife of Embedded Linux      "
we can rename it : bb_trim_leading()

bb_strrtrim(s, ':') = "    BusyBox"
bb_strrtrim(s, 0) = "    BusyBox: The Swiss Army Knife of Embedded Linux"
we can rename it : bb_trim_trailing()

bb_strtrim_index(s, 11) = ": The Swiss Army Knife of Embedded Linux      "
bb_trim_leading_index()

bb_strrtrim_index(s, 11) = "    BusyBox"
bb_trim_trailing_index()

bb_trimmed_slice(s, ':', 'K') = ": The Swiss Army"

bb_trim(s) = "BusyBox: The Swiss Army Knife of Embedded Linux"

> Try to have more descriptive names. This helps in understanding code,
> especially _at _callsites_.
> 
> > {
> > 	char *t = NULL;
> > 
> > 	if (!s) return NULL;
> > 
> > 	if (c)
> > 		t = strchr(s, c);
> > 	else
> > 		t = s;
> 
> First t = NULL is superfluous.
> > 
> > 	t = skip_whitespace(t);
> 
> If c!=0 and it is not found, we're toast (t==NULL).

Ok, I replaced strchr() by strchrnul()

> > 	memmove(s, t, strlen(t));
> > 	memset(s+strlen(t), 0, strlen(s)-strlen(t));
> > 	return s;
> 
> Maybe just return strcpy(s,t) ?

In all cases the s is modified and memmove() authorizes the overlapping.

trim.c ================================================================
#include "libbb.h"

/*
 * Beware: these functions modify the buffer
 * The return value is there to simplify the tests:
 * if (bb_strtrim(s, '#'))
 *	...
 */

char *bb_strtrim(char *s, int c)
{
	char *t;

	if (!s) return NULL;

	t = c ? strchrnul(s, c) : s;

	if (t) {
		t = skip_whitespace(t);
		memmove(s, t, strlen(t));
		memset(s+strlen(t), 0, strlen(s)-strlen(t));
	}

	return s;
}

char *bb_strrtrim(char *s, int c)
{
	char *t;

	if (!s) return NULL;

	t = c ? strrchr(s, c) : s;

	while (t-- > s) {
		if (!isspace(*t)) {
			t[1] = '\0';
			break;
		}
	}

	return s;
}

char *bb_strtrim_index(char *s, unsigned int i)
{
	if (!s || i > strlen(s)) {
		return (s = NULL);
	}

	return bb_strtrim(s, s[i]);
}

char *bb_strrtrim_index(char *s, unsigned int i)
{
	if (!s || i > strlen(s)) {
		return (s = NULL);
	}

	return bb_strrtrim(s, s[i]);
}

char *bb_trimmed_slice(char *s, int start_c, int end_c)
{
	bb_strtrim(s, start_c);
	bb_strrtrim(s, end_c);

	return s;
}

char *bb_trim(char *s)
{
	return bb_trimmed_slice(s, 0, 0);
}







More information about the busybox mailing list