示例#1
0
/*
 * Cut a field according to the key specs
 */
static struct bwstring *
cut_field(const struct bwstring *s, struct key_specs *ks)
{
	struct bwstring *ret = NULL;

	if (s && ks) {
		size_t field_start, key_end, key_start, sz;
		bool empty_field, empty_key;

		field_start = 0;
		key_start = 0;
		empty_field = false;
		empty_key = false;

		find_field_start(s, ks, &field_start, &key_start,
		    &empty_field, &empty_key);

		if (empty_key)
			sz = 0;
		else {
			key_end = find_field_end(s, ks);
			sz = (key_end < key_start) ? 0 : (key_end - key_start);
		}

		ret = bwsalloc(sz);
		if (sz)
			bwsnocpy(ret, s, key_start, sz);
	} else
		ret = bwsalloc(0);

	return (ret);
}
示例#2
0
/*
 * Create a new binary string from a raw binary buffer.
 */
struct bwstring *
bwssbdup(const wchar_t *str, size_t len)
{

	if (str == NULL)
		return ((len == 0) ? bwsalloc(0) : NULL);
	else {
		struct bwstring *ret;

		ret = bwsalloc(len);

		if (MB_CUR_MAX == 1)
			for (size_t i = 0; i < len; ++i)
				ret->data.cstr[i] = (unsigned char) str[i];
		else
			memcpy(ret->data.wstr, str, SIZEOF_WCHAR_STRING(len));

		return (ret);
	}
}
示例#3
0
/*
 * Create a new binary string from a raw binary buffer.
 */
struct bwstring *
bwscsbdup(const unsigned char *str, size_t len)
{
	struct bwstring *ret;

	ret = bwsalloc(len);

	if (str) {
		if (MB_CUR_MAX == 1)
			memcpy(ret->data.cstr, str, len);
		else {
			mbstate_t mbs;
			const char *s;
			size_t charlen, chars, cptr;

			charlen = chars = 0;
			cptr = 0;
			s = (const char *) str;

			memset(&mbs, 0, sizeof(mbs));

			while (cptr < len) {
				size_t n = MB_CUR_MAX;

				if (n > len - cptr)
					n = len - cptr;
				charlen = mbrlen(s + cptr, n, &mbs);
				switch (charlen) {
				case 0:
					/* FALLTHROUGH */
				case (size_t) -1:
					/* FALLTHROUGH */
				case (size_t) -2:
					ret->data.wstr[chars++] =
					    (unsigned char) s[cptr];
					++cptr;
					break;
				default:
					n = mbrtowc(ret->data.wstr + (chars++),
					    s + cptr, charlen, &mbs);
					if ((n == (size_t)-1) || (n == (size_t)-2))
						/* NOTREACHED */
						err(2, "mbrtowc error");
					cptr += charlen;
				};
			}

			ret->len = chars;
			ret->data.wstr[ret->len] = L'\0';
		}
	}
	return (ret);
}
示例#4
0
/*
 * Create a copy of binary string.
 * New string size equals the length of the old string.
 */
struct bwstring *
bwsdup(const struct bwstring *s)
{

	if (s == NULL)
		return (NULL);
	else {
		struct bwstring *ret = bwsalloc(s->len);

		if (MB_CUR_MAX == 1)
			memcpy(ret->data.cstr, s->data.cstr, (s->len));
		else
			memcpy(ret->data.wstr, s->data.wstr,
			    SIZEOF_WCHAR_STRING(s->len));

		return (ret);
	}
}