diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2023-12-17 14:18:49 +0100 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2023-12-17 14:18:49 +0100 | 
| commit | 96da31f8cb9ec57313ab496a9ce07b108ec3914f (patch) | |
| tree | 18ce4d6e2adcf5303c77cc03c9c468a7afa251f9 /src/tc-string.c | |
| parent | 5400fb6e98435efe682b4a9de7266579b634de3c (diff) | |
| parent | eece9692d707ccb20356ec06955f8308c4e59ca7 (diff) | |
Update upstream source from tag 'upstream/4.19'
Update to upstream version '4.19'
with Debian dir a79aeedeffb7d90638e4dcbdae78296b59e0c285
Diffstat (limited to 'src/tc-string.c')
| -rw-r--r-- | src/tc-string.c | 173 | 
1 files changed, 60 insertions, 113 deletions
| diff --git a/src/tc-string.c b/src/tc-string.c index 1c7ed09..e7f90c2 100644 --- a/src/tc-string.c +++ b/src/tc-string.c @@ -197,93 +197,6 @@ static void t_split2(void)  	HX_zvecfree(a);  } -/* avoid these being inlined */ -extern char *f_strlcpy_str(char *, const char *, size_t); -extern char *f_strlcpy_mem(char *, const char *, size_t); - -EXPORT_SYMBOL char *f_strlcpy_str(char *d, const char *s, size_t n) -{ -	if (n == 0) -		return d; -	strncpy(d, s, n); -	d[n-1] = '\0'; -	return d; -} - -EXPORT_SYMBOL char *f_strlcpy_mem(char *dest, const char *src, size_t dsize) -{ -	size_t slen = strlen(src); -	if (slen < dsize) -		return static_cast(char *, memcpy(dest, src, slen + 1)); -	if (dsize > 0) { -		memcpy(dest, src, dsize - 1); -		dest[dsize-1] = '\0'; -	} -	return dest; -} - -static const char s_lorem_ipsum[] = /* 1368 chars */ -"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo " -"ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis " -"parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, " -"pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec " -"pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, " -"rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede " -"mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper " -"nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, " -"consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra " -"quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. " -"Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur " -"ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, " -"tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing " -"sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit " -"id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut " -"libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros " -"faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec " -"sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit " -"cursus nunc,"; - -static void t_strlcpy(void) -{ -	static const size_t picksizes[] = -		{4, 8, 16, 32, 64, 80, 128, 256, 1024, 2048}; -	char ibuf[2048], obuf[2048]; -	size_t ipick, opick, k, runs = 10000000 + HX_irand(0, 1); -	struct timespec start, stop, d1, d2, d3; - -	for (ipick = 0; ipick < ARRAY_SIZE(picksizes); ++ipick) { -		/* Select string size */ -		HX_strlcpy(ibuf, s_lorem_ipsum, picksizes[ipick]); - -		for (opick = 0; opick < ARRAY_SIZE(picksizes); ++opick) { -			/* Select buffer size */ -			clock_gettime(CLOCK_MONOTONIC, &start); -			for (k = 0; k < runs; ++k) -				f_strlcpy_str(reinterpret_cast(char *, obuf), -					ibuf, picksizes[opick]); -			clock_gettime(CLOCK_MONOTONIC, &stop); -			HX_timespec_sub(&d1, &stop, &start); - -			clock_gettime(CLOCK_MONOTONIC, &start); -			for (k = 0; k < runs; ++k) -				f_strlcpy_mem(reinterpret_cast(char *, obuf), -					ibuf, picksizes[opick]); -			clock_gettime(CLOCK_MONOTONIC, &stop); -			HX_timespec_sub(&d2, &stop, &start); - -			HX_timespec_sub(&d3, &d1, &d2); -			printf("%4zu->%4zu: " HX_TIMESPEC_FMT -			       " (str=" HX_TIMESPEC_FMT -			       " mem=" HX_TIMESPEC_FMT ")\n", -				strlen(ibuf), picksizes[opick], -				HX_TIMESPEC_EXP(&d3), -				HX_TIMESPEC_EXP(&d1), -				HX_TIMESPEC_EXP(&d2) -				); -		} -	} -} -  static void t_strlcpy2(void)  {  	char a[3] = {49, 49, 49}; @@ -381,8 +294,8 @@ static int t_units_strto(void)  		unsigned long long expect_out;  		const char expect_rem[8];  	} vt[] = { -		{"-5k", 1000, ULLONG_MAX, "-5k"}, -		{" -5.2k", 1000, ULLONG_MAX, "-5.2k"}, +		{"-5k", 1000, -5000ULL, ""}, +		{" -5.2k", 1000, -5200ULL, ""},  		{"1", 9999, 1, ""},  		{"1024", 9999, 1ULL << 10, ""},  		{"1048576", 9999, 1ULL << 20, ""}, @@ -403,6 +316,10 @@ static int t_units_strto(void)  		{"1T", 1024, 1ULL << 40, ""},  		{"1P", 1024, 1ULL << 50, ""},  		{"1E", 1024, 1ULL << 60, ""}, +		{"15E", 1024, 15ULL << 60, ""}, +		{"16E", 1024, ULLONG_MAX, ""}, +		{"16.0E", 1024, ULLONG_MAX, ""}, +		{"1Z", 1024, ULLONG_MAX, ""},  		{"0", 0, 0, ""},  		{"0k", 0, 0, ""},  		{"0  Z", 0, 0, ""}, @@ -412,18 +329,28 @@ static int t_units_strto(void)  		{"0.00000000000000001E", 1024, 11, ""},  		{"1.525444GiB", 1000, 1525444000, "iB"},  		{"1.525444GiB", 1024, 1637933022, "iB"}, +		{"2M4k", 1000, 2000000, "4k"}, +		{"18446744073709551614", 0, 18446744073709551614ULL, ""}, +		{"18446744073709551615", 0, ULLONG_MAX, ""}, +		{"18446744073709551616", 0, ULLONG_MAX, ""}, +		{"-18446744073709551614", 0, 2, ""}, +		{"-18446744073709551615", 0, 1, ""}, +		{"-18446744073709551616", 0, ULLONG_MAX, ""},  	};  	char *end;  	for (size_t i = 0; i < ARRAY_SIZE(vt); ++i) {  		unsigned long long q = HX_strtoull_unit(vt[i].input, &end, vt[i].exponent); -		printf("%s -> %llu __ %s\n", vt[i].input, q, end); -		if (q != vt[i].expect_out || strcmp(end, vt[i].expect_rem) != 0) +		printf("Observed: %s -> %llu __ %s\n", vt[i].input, q, end); +		if (q != vt[i].expect_out || strcmp(end, vt[i].expect_rem) != 0) { +			printf("Expected: %s -> %llu __ %s\n", vt[i].input, +				vt[i].expect_out, vt[i].expect_rem);  			return EXIT_FAILURE; +		}  	}  	return EXIT_SUCCESS;  } -static void t_time_units(void) +static int t_time_units(void)  {  	static const struct {  		unsigned long long input; @@ -432,10 +359,13 @@ static void t_time_units(void)  	} vt[] = {  		{31536000, 0, "365d"},  		{31622400, 0, "366d"}, -		{31622400, HXUNIT_YEARS, "1y18h"}, -		{31622400, HXUNIT_MONTHS, "1y"}, -		{31622400, HXUNIT_WEEKS, "1y"}, -		{31622400, HXUNIT_MONTHS | HXUNIT_WEEKS, "1y"}, +		{34819200, HXUNIT_WEEKS, "57weeks4d"}, +		{34819200, HXUNIT_MONTHS, "13months7d7h30min"}, +		{34819200, HXUNIT_MONTHS | HXUNIT_WEEKS, "13months1week7h30min"}, +		{34819200, HXUNIT_YEARS, "1y37d18h"}, +		{34819200, HXUNIT_YEARS | HXUNIT_WEEKS, "1y5weeks2d18h"}, +		{34819200, HXUNIT_YEARS | HXUNIT_MONTHS, "1y1month7d7h30min"}, +		{34819200, HXUNIT_YEARS | HXUNIT_MONTHS | HXUNIT_WEEKS, "1y1month1week7h30min"},  		{2678400, HXUNIT_MONTHS, "1month13h30min"},  		{2592000, HXUNIT_MONTHS, "30d"},  		{608400, HXUNIT_WEEKS, "1week1h"}, @@ -449,41 +379,55 @@ static void t_time_units(void)  	for (size_t i = 0; i < ARRAY_SIZE(vt); ++i) {  		char out[60];  		char *ret = HX_unit_seconds(out, ARRAY_SIZE(out), vt[i].input, vt[i].flags); -		printf("%llus => \"%s\"\n", vt[i].input, ret); -		if (strcmp(ret, vt[i].expect_out) != 0) -			printf("\tBUG, expected \"%s\"\n", vt[i].expect_out); +		printf("Observed: %llus => \"%s\"\n", vt[i].input, ret); +		if (strcmp(ret, vt[i].expect_out) != 0) { +			printf("Expected: \"%s\"\n", vt[i].expect_out); +			return EXIT_FAILURE; +		}  	} +	return EXIT_SUCCESS;  } -static void t_time_strto(void) +static int t_time_strto(void)  {  	#define NS_PER_S 1000000000ULL  	static const struct {  		const char *input;  		unsigned long long expect_s, expect_ns; -		const char expect_rem[8]; +		const char expect_rem[16];  	} vt[] = {  		{"29µs", 0, 29000, ""},  		{"1y", 31557600, NS_PER_S * 31557600, ""},  		{"1y1month1week1d1h1min1s ", 31557600+2629800+86400*8+3600+60+1, NS_PER_S * (31557600+2629800+86400*8+3600+60+1), ""},  		{" -1d", 0, 0, "-1d"}, -		{"1 -", 1, NS_PER_S, "-"}, +		{"1 -", 0, 0, "1 -"},  		{"12.5 hours .5 hours 240 minutes 25200 seconds", 86400, NS_PER_S * 86400, ""},  		{"1s", 1, NS_PER_S, ""},  		{"1min", 60, 60 * NS_PER_S, ""},  		{"0", 0, 0, ""}, +		{"0.0", 0, 0, ""}, +		{"1s0", 1, NS_PER_S, ""}, +		{"1s0.0", 1, NS_PER_S, ""}, +		{"1s1s", 2, 2 * NS_PER_S, ""}, +		{"1s1", 1, 1 * NS_PER_S, "1"}, +		{"584542046091y", ULLONG_MAX, ULLONG_MAX, "584542046091y"},  	};  	char *end;  	printf("===== t_time_strto\n");  	for (size_t i = 0; i < ARRAY_SIZE(vt); ++i) {  		unsigned long long q = HX_strtoull_sec(vt[i].input, &end);  		unsigned long long qn = HX_strtoull_nsec(vt[i].input, &end); -		printf("\"%s\" => %llus [%lluns] + \"%s\"\n", vt[i].input, q, qn, end); -		if (q != vt[i].expect_s || qn != vt[i].expect_ns) -			printf("\tBUG: expected %llus [%lluns]\n", vt[i].expect_s, vt[i].expect_ns); -		if (strcmp(end, vt[i].expect_rem) != 0) -			printf("\tBUG: expected remainder \"%s\"\n", vt[i].expect_rem); +		printf("Observed: \"%s\" => %llus [%lluns] + \"%s\"\n", vt[i].input, q, qn, end); +		if (q != vt[i].expect_s || qn != vt[i].expect_ns) { +			printf("Expected: %llus [%lluns]\n", vt[i].expect_s, vt[i].expect_ns); +			return EXIT_FAILURE; +		} +		if (strcmp(end, vt[i].expect_rem) != 0) { +			printf("Expected: remainder \"%s\"\n", vt[i].expect_rem); +			return EXIT_FAILURE; +		}  	} +	return EXIT_SUCCESS;  }  static int t_strmid(void) @@ -515,7 +459,7 @@ static int t_strmid(void)  #undef T  } -static int runner(int argc, const char **argv) +static int runner(int argc, char **argv)  {  	hxmc_t *tx = NULL;  	const char *file = (argc >= 2) ? argv[1] : "tx-string.cpp"; @@ -559,19 +503,22 @@ static int runner(int argc, const char **argv)  	ret = t_units_strto();  	if (ret != EXIT_SUCCESS)  		return EXIT_FAILURE; -	t_time_units(); -	t_time_strto(); -	t_strlcpy(); +	ret = t_time_units(); +	if (ret != EXIT_SUCCESS) +		return EXIT_FAILURE; +	ret = t_time_strto(); +	if (ret != EXIT_SUCCESS) +		return EXIT_FAILURE;  	t_strlcpy2();  	HXmc_free(tx);  	HX_exit();  	return EXIT_SUCCESS;  } -int main(int argc, const char **argv) +int main(int argc, char **argv)  {  	int ret = runner(argc, argv); -	if (ret != EXIT_FAILURE) +	if (ret == EXIT_FAILURE)  		fprintf(stderr, "FAILED\n");  	return ret;  } | 
