1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#pragma ident	"@(#)tst.substr.d	1.2	08/04/09 SMI"
28
29#pragma D option quiet
30#pragma D option strsize=32
31
32struct {
33	int index;
34	int length;
35	int nolen;
36	int alt;
37} command[int];
38
39int i;
40
41BEGIN
42{
43	str = "foobarbazbop";
44	str2 = "";
45	altstr = "CRAIG: Positioned them, I don't ";
46	altstr2 = "know... I'm fairly wide guy.";
47
48	command[i].index = 3;
49	command[i].nolen = 1;
50	i++;
51
52	command[i].index = 300;
53	command[i].nolen = 1;
54	i++;
55
56	command[i].index = -10;
57	command[i].nolen = 1;
58	i++;
59
60	command[i].index = 0;
61	command[i].nolen = 1;
62	i++;
63
64	command[i].index = 1;
65	command[i].nolen = 1;
66	i++;
67
68	command[i].index = strlen(str) - 1;
69	command[i].nolen = 1;
70	i++;
71
72	command[i].index = strlen(str);
73	command[i].nolen = 1;
74	i++;
75
76	command[i].index = strlen(str) + 1;
77	command[i].nolen = 1;
78	i++;
79
80	command[i].index = 8;
81	command[i].length = 20;
82	i++;
83
84	command[i].index = 4;
85	command[i].length = 4;
86	i++;
87
88	command[i].index = 5;
89	command[i].length = strlen(str) - command[i].index + 1;
90	i++;
91
92	command[i].index = 5;
93	command[i].length = strlen(str) - command[i].index + 2;
94	i++;
95
96	command[i].index = 400;
97	command[i].length = 20;
98	i++;
99
100	command[i].index = 400;
101	command[i].length = 0;
102	i++;
103
104	command[i].index = 400;
105	command[i].length = -1;
106	i++;
107
108	command[i].index = 3;
109	command[i].length = 0;
110	i++;
111
112	command[i].index = 3;
113	command[i].length = -1;
114	i++;
115
116	command[i].index = 3;
117	command[i].length = -4;
118	i++;
119
120	command[i].index = 3;
121	command[i].length = -20;
122	i++;
123
124	command[i].index = -10;
125	command[i].length = -5;
126	i++;
127
128	command[i].index = 0;
129	command[i].length = 400;
130	i++;
131
132	command[i].index = -1;
133	command[i].length = 400;
134	i++;
135
136	command[i].index = -1;
137	command[i].length = 0;
138	i++;
139
140	command[i].index = -1;
141	command[i].length = -1;
142	i++;
143
144	command[i].index = -2 * strlen(str);
145	command[i].length = 2 * strlen(str);
146	i++;
147
148	command[i].index = -2 * strlen(str);
149	command[i].length = strlen(str);
150	i++;
151
152	command[i].index = -2 * strlen(str);
153	command[i].length = strlen(str) + 1;
154	i++;
155
156	command[i].index = -1 * strlen(str);
157	command[i].length = strlen(str);
158	i++;
159
160	command[i].index = -1 * strlen(str);
161	command[i].length = strlen(str) - 1;
162	i++;
163
164	command[i].index = 100;
165	command[i].length = 10;
166	command[i].alt = 1;
167	i++;
168
169	command[i].index = 100;
170	command[i].nolen = 1;
171	command[i].alt = 1;
172	i++;
173
174	end = i;
175	i = 0;
176	printf("#!/usr/perl5/bin/perl\n\nBEGIN {\n");
177
178}
179
180tick-1ms
181/i < end && command[i].nolen/
182{
183	this->str = command[i].alt ? altstr : str;
184	this->str2 = command[i].alt ? altstr2 : str2;
185	this->result = substr(command[i].alt ?
186	    "CRAIG: Positioned them, I don't know... I'm fairly wide guy." :
187	    str, command[i].index);
188
189	printf("\tif (substr(\"%s%s\", %d) ne \"%s\") {\n",
190	    this->str, this->str2, command[i].index, this->result);
191
192	printf("\t\tprintf(\"perl => substr(\\\"%s%s\\\", %d) = ",
193	    this->str, this->str2, command[i].index);
194	printf("\\\"%%s\\\"\\n\",\n\t\t    substr(\"%s%s\", %d));\n",
195	    this->str, this->str2, command[i].index);
196	printf("\t\tprintf(\"   D => substr(\\\"%s%s\\\", %d) = ",
197	    this->str, this->str2, command[i].index);
198	printf("\\\"%%s\\\"\\n\",\n\t\t    \"%s\");\n", this->result);
199	printf("\t\t$failed++;\n");
200	printf("\t}\n\n");
201}
202
203tick-1ms
204/i < end && !command[i].nolen/
205{
206	this->str = command[i].alt ? altstr : str;
207	this->str2 = command[i].alt ? altstr2 : str2;
208	this->result = substr(command[i].alt ?
209	    "CRAIG: Positioned them, I don't know... I'm fairly wide guy." :
210	    str, command[i].index, command[i].length);
211
212	printf("\tif (substr(\"%s%s\", %d, %d) ne \"%s\") {\n",
213	    this->str, this->str2, command[i].index, command[i].length,
214	    this->result);
215	printf("\t\tprintf(\"perl => substr(\\\"%s%s\\\", %d, %d) = ",
216	    this->str, this->str2, command[i].index, command[i].length);
217	printf("\\\"%%s\\\"\\n\",\n\t\t    substr(\"%s%s\", %d, %d));\n",
218	    this->str, this->str2, command[i].index, command[i].length);
219	printf("\t\tprintf(\"   D => substr(\\\"%s%s\\\", %d, %d) = ",
220	    this->str, this->str2, command[i].index, command[i].length);
221	printf("\\\"%%s\\\"\\n\",\n\t\t    \"%s\");\n", this->result);
222	printf("\t\t$failed++;\n");
223	printf("\t}\n\n");
224}
225
226tick-1ms
227/++i == end/
228{
229	printf("\texit($failed);\n}\n");
230	exit(0);
231}
232