⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 str.c

📁 纯C数据结构
💻 C
字号:
#include <string.h>#include <limits.h>#include "assert.h"#include "fmt.h"#include "str.h"#include "mem.h"#define idx(i,len) ((i) <= 0 ? (i) + (len) : (i) - 1)	#define swap(i,j) do { \		int tt = (i); (i) = (j); (j) = tt; } while (0)char *Str_sub(const char *s, int i, int j) {	int len;	char *str, *p;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	p = str = ALLOC(j - i + 1);	while (i < j)		*p++ = s[i++];	*p = 0;	return str;}char *Str_dup(const char *s, int i, int j, int n) {	int len, k;	char *str, *p;	assert(s);	assert(n >= 0);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	p = str = ALLOC(n*(j - i) + 1);	while (n-- > 0)		for (k = i; k < j; k++)			*p++ = s[k];	*p = 0;	return str;}char *Str_reverse(const char *s, int i, int j) {	int len;	char *str, *p;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	p = str = ALLOC(j - i + 1);	while (j > i)		*p++ = s[--j];	*p = 0;	return str;}char *Str_cat(const char *s1, int i1, int j1,	const char *s2, int i2, int j2) {	assert(s1);	assert(s2);	return Str_catv(s1, i1, i2, s2, i2, j2, NULL);}char *Str_catv(const char *s, ...) {	char *str, *p;	int i, j, len, newlen = 0;	va_list ap;	va_start(ap, s);	while (s) {		i = va_arg(ap, int);		j = va_arg(ap, int);		len = strlen(s);		i = idx(i, len);		j = idx(j, len);		if (i > j)			swap(i,j);		assert(i >= 0 && i <= len);		assert(j >= 0 && j <= len);		newlen += j - i;		s = va_arg(ap, char *);	}	va_end(ap);	p = str = ALLOC(newlen + 1);	va_start(ap, s);	while (s) {		i = va_arg(ap, int);		j = va_arg(ap, int);		len = strlen(s);		i = idx(i, len);		j = idx(j, len);		if (i > j)			swap(i,j);		assert(i >= 0 && i <= len);		assert(j >= 0 && j <= len);		while (i < j)			*p++ = s[i++];		s = va_arg(ap, char *);	}	va_end(ap);	*p = 0;	return str;}char *Str_map(const char *s, int i, int j,	const char *from, const char *to) {	static char map[256] = { 0 };	if (from && to) {		int k;		for (k = 0; k < (int)sizeof map; k++)			map[k] = k;		while (*from && *to)			map[(unsigned char)*from++] = *to++;		assert(*from == 0 && *to == 0);	} else {		assert(from == NULL && to == NULL && s);		assert(map['a']);	}	if (s) {		char *str, *p;		int len = strlen(s);i = idx(i, len);j = idx(j, len);if (i > j)	swap(i,j);assert(i >= 0 && i <= len);assert(j >= 0 && j <= len);		p = str = ALLOC(j - i + 1);		while (i < j)			*p++ = map[(unsigned char)s[i++]];		*p = 0;		return str;	} else		return NULL;}int Str_pos(const char *s, int i) {	int len;	assert(s);	len = strlen(s);	i = idx(i, len);	assert(i >= 0 && i <= len);	return i + 1;}int Str_len(const char *s, int i, int j) {	int len;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	return j - i;}int Str_cmp(const char *s1, int i1, int j1,	const char *s2, int i2, int j2) {	int len;	assert(s1);	len = strlen(s1);	i1 = idx(i1, len);	j1 = idx(j1, len);	if (i1 > j1)		swap(i1, j1);	assert(i1 >= 0 && i1 <= len && j1 >= 0 && j1 <= len);	assert(s2);	len = strlen(s2);	i2 = idx(i2, len);	j2 = idx(j2, len);	if (i2 > j2)		swap(i2, j2);	assert(i2 >= 0 && i2 <= len && j2 >= 0 && j2 <= len);	if (j1 - i1 < j2 - i2)		len = j1 - i1;	else		len = j2 - i2;	s1 += i1;	s2 += i2;	for ( ; len-- > 0; s1++, s2++)		if (*s1 != *s2)			return (unsigned char)*s1 - (unsigned char)*s2;	if (j1 - i1 < j2 - i2)		return -1;	else if (j1 - i1 < j2 - i2)		return +1;	else		return 0;}int Str_chr(const char *s, int i, int j, int c) {	int len;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	for ( ; i < j; i++)		if (s[i] == c)			return i + 1;	return 0;}int Str_rchr(const char *s, int i, int j, int c) {	int len;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	while (j > i)		if (s[--j] == c)			return j + 1;	return 0;}int Str_upto(const char *s, int i, int j, const char *set) {	int len;	assert(s);	assert(set);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	for ( ; i < j; i++)		if (strchr(set, s[i]))			return i + 1;	return 0;}int Str_rupto(const char *s, int i, int j, const char *set) {	int len;	assert(s);	assert(set);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	while (j > i)		if (strchr(set, s[--j]))			return j + 1;	return 0;}int Str_find(const char *s, int i, int j, const char *pat) {	int len, plen;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	assert(pat);	plen = strlen(pat);	if (plen == 0)		return i + 1;	else if (plen == 1) {		for ( ; i < j; i++)			if (s[i] == *pat)				return i + 1;	} else		for ( ; i + plen <= j; i++)			if ((strncmp(&s[i], pat, plen) == 0))				return i + 1;	return 0;}int Str_rfind(const char *s, int i, int j, const char *pat) {	int len, plen;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	assert(pat);	plen = strlen(pat);	if (plen == 0)		return j;	else if (plen == 1) {		while (j > i)			if (s[--j] == *pat)				return j + 1;	} else		for ( ; j - plen >= i; j--)			if (strncmp(&s[j-plen], pat, plen) == 0)				return j - plen + 1;	return 0;}int Str_any(const char *s, int i, const char *set) {	int len;	assert(s);	assert(set);	len = strlen(s);	i = idx(i, len);	assert(i >= 0 && i <= len);	if (strchr(set, s[i]))		return i + 2;	return 0;}int Str_many(const char *s, int i, int j, const char *set) {	int len;	assert(s);	assert(set);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	if (strchr(set, s[i])) {		do			i++;		while (i < j && strchr(set, s[i]));		return i + 1;	}	return 0;}int Str_rmany(const char *s, int i, int j, const char *set) {	int len;	assert(s);	assert(set);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	if (strchr(set, s[j-1])) {		do			--j;		while (j >= i && strchr(set, s[j]));		return j + 1;	}	return 0;}int Str_match(const char *s, int i, int j, const char *pat) {	int len, plen;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	assert(pat);	plen = strlen(pat);	if (plen == 0)		return i + 1; 	else if (plen == 1) {		if (s[i] == *pat)			return i + 2;	} else if (i + plen <= j && (strncmp(&s[i], pat, plen) == 0))		return i + plen + 1;	return 0;}int Str_rmatch(const char *s, int i, int j, const char *pat) {	int len, plen;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	assert(pat);	plen = strlen(pat);	if (plen == 0)		return j + 1;	else if (plen == 1) {		if (s[j-1] == *pat)			return j;	} else if (j - plen >= i	&& strncmp(&s[j-plen], pat, plen) == 0)		return j - plen + 1;	return 0;}void Str_cvt(int code, va_list *app,	int put(int c, void *cl), void *cl,	unsigned char flags[], int width, int precision) {	char *s = va_arg(*app, char *);	int i = va_arg(*app, int), j = va_arg(*app, int), len;	assert(s);	len = strlen(s);	i = idx(i, len);	j = idx(j, len);	if (i > j)		swap(i,j);	assert(i >= 0 && i <= len);	assert(j >= 0 && j <= len);	Fmt_puts(s + i, j - i, put, cl, flags, width, precision);}static char rcsid[] = "$RCSfile: RCS/str.doc,v $ $Revision: 1.2 $";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -