1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms
5 * of the Common Development and Distribution License
6 * (the "License").  You may not use this file except
7 * in compliance with the License.
8 *
9 * You can obtain a copy of the license at
10 * src/OPENSOLARIS.LICENSE
11 * or http://www.opensolaris.org/os/licensing.
12 * See the License for the specific language governing
13 * permissions and limitations under the License.
14 *
15 * When distributing Covered Code, include this CDDL
16 * HEADER in each file and include the License file at
17 * usr/src/OPENSOLARIS.LICENSE.  If applicable,
18 * add the following below this CDDL HEADER, with the
19 * fields enclosed by brackets "[]" replaced with your
20 * own identifying information: Portions Copyright [yyyy]
21 * [name of copyright owner]
22 *
23 * CDDL HEADER END
24 */
25
26/*
27 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
28 * Use is subject to license terms.
29 */
30
31#include <unistd.h>
32#include <stdlib.h>
33#include <stdio.h>
34#include <string.h>
35
36#include "libmicro.h"
37
38
39static int unaligned = 0;
40static int opts = 100;
41
42typedef struct {
43	int	ts_once;
44	char 	*ts_a;
45	char 	*ts_b;
46	int	ts_fakegcc;
47} tsd_t;
48
49int
50benchmark_init()
51{
52
53	lm_tsdsize = sizeof (tsd_t);
54
55	(void) sprintf(lm_optstr, "s:n");
56
57	(void) sprintf(lm_usage,
58	    "       [-s string size (default %d)]\n"
59	    "       [-n causes unaligned cmp]\n"
60	    "notes: measures strcasecmp()\n",
61	    opts);
62
63	(void) sprintf(lm_header, "%8s", "size");
64
65	return (0);
66}
67
68int
69benchmark_optswitch(int opt, char *optarg)
70{
71	switch (opt) {
72	case 'n':
73		unaligned = 1;
74		break;
75	case 's':
76		opts = sizetoll(optarg);
77		break;
78	default:
79		return (-1);
80	}
81	return (0);
82}
83
84int
85benchmark_initbatch(void *tsd)
86{
87	tsd_t			*ts = (tsd_t *)tsd;
88
89	static char *demo =
90	    "The quick brown fox jumps over the lazy dog.";
91
92	if (ts->ts_once++ == 0) {
93		int l = strlen(demo);
94		int i;
95
96		ts->ts_a = malloc(opts + 1);
97		ts->ts_b = malloc(opts + 1 + unaligned);
98		ts->ts_b += unaligned;
99
100		for (i = 0; i < opts; i++) {
101			ts->ts_a[i] = ts->ts_b[i] = demo[i%l];
102		}
103		ts->ts_a[opts] = 0;
104		ts->ts_b[opts] = 0;
105	}
106	return (0);
107}
108
109int
110benchmark(void *tsd, result_t *res)
111{
112	int			i;
113	tsd_t			*ts = (tsd_t *)tsd;
114
115	char 	*src 	= ts->ts_a;
116	char 	*src2 	= ts->ts_b;
117	int	*sum 	= &ts->ts_fakegcc;
118
119	res->re_errors = 0;
120
121	for (i = 0; i < lm_optB; i += 10) {
122		*sum += strcasecmp(src, src2);
123		*sum += strcasecmp(src, src2);
124		*sum += strcasecmp(src, src2);
125		*sum += strcasecmp(src, src2);
126		*sum += strcasecmp(src, src2);
127		*sum += strcasecmp(src, src2);
128		*sum += strcasecmp(src, src2);
129		*sum += strcasecmp(src, src2);
130		*sum += strcasecmp(src, src2);
131		*sum += strcasecmp(src, src2);
132	}
133
134	res->re_count = i;
135
136	return (0);
137}
138
139char *
140benchmark_result()
141{
142	static char	result[256];
143
144	if (unaligned == 0)
145		(void) sprintf(result, "%8d", opts);
146	else
147		(void) sprintf(result, "%8d <unaligned>", opts);
148
149	return (result);
150}
151