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 D option quiet
28 #pragma D option strsize=32
29 
30 struct {
31 	int index;
32 	int length;
33 	int nolen;
34 	int alt;
35 } command[int];
36 
37 int i;
38 
39 BEGIN
40 {
41 	str = "foobarbazbop";
42 	str2 = "";
43 	altstr = "CRAIG: Positioned them, I don't ";
44 	altstr2 = "know... I'm fairly wide guy.";
45 
46 	command[i].index = 3;
47 	command[i].nolen = 1;
48 	i++;
49 
50 	command[i].index = 300;
51 	command[i].nolen = 1;
52 	i++;
53 
54 	command[i].index = -10;
55 	command[i].nolen = 1;
56 	i++;
57 
58 	command[i].index = 0;
59 	command[i].nolen = 1;
60 	i++;
61 
62 	command[i].index = 1;
63 	command[i].nolen = 1;
64 	i++;
65 
66 	command[i].index = strlen(str) - 1;
67 	command[i].nolen = 1;
68 	i++;
69 
70 	command[i].index = strlen(str);
71 	command[i].nolen = 1;
72 	i++;
73 
74 	command[i].index = strlen(str) + 1;
75 	command[i].nolen = 1;
76 	i++;
77 
78 	command[i].index = 8;
79 	command[i].length = 20;
80 	i++;
81 
82 	command[i].index = 4;
83 	command[i].length = 4;
84 	i++;
85 
86 	command[i].index = 5;
87 	command[i].length = strlen(str) - command[i].index + 1;
88 	i++;
89 
90 	command[i].index = 5;
91 	command[i].length = strlen(str) - command[i].index + 2;
92 	i++;
93 
94 	command[i].index = 400;
95 	command[i].length = 20;
96 	i++;
97 
98 	command[i].index = 400;
99 	command[i].length = 0;
100 	i++;
101 
102 	command[i].index = 400;
103 	command[i].length = -1;
104 	i++;
105 
106 	command[i].index = 3;
107 	command[i].length = 0;
108 	i++;
109 
110 	command[i].index = 3;
111 	command[i].length = -1;
112 	i++;
113 
114 	command[i].index = 3;
115 	command[i].length = -4;
116 	i++;
117 
118 	command[i].index = 3;
119 	command[i].length = -20;
120 	i++;
121 
122 	command[i].index = -10;
123 	command[i].length = -5;
124 	i++;
125 
126 	command[i].index = 0;
127 	command[i].length = 400;
128 	i++;
129 
130 	command[i].index = -1;
131 	command[i].length = 400;
132 	i++;
133 
134 	command[i].index = -1;
135 	command[i].length = 0;
136 	i++;
137 
138 	command[i].index = -1;
139 	command[i].length = -1;
140 	i++;
141 
142 	command[i].index = -2 * strlen(str);
143 	command[i].length = 2 * strlen(str);
144 	i++;
145 
146 	command[i].index = -2 * strlen(str);
147 	command[i].length = strlen(str);
148 	i++;
149 
150 	command[i].index = -2 * strlen(str);
151 	command[i].length = strlen(str) + 1;
152 	i++;
153 
154 	command[i].index = -1 * strlen(str);
155 	command[i].length = strlen(str);
156 	i++;
157 
158 	command[i].index = -1 * strlen(str);
159 	command[i].length = strlen(str) - 1;
160 	i++;
161 
162 	command[i].index = 100;
163 	command[i].length = 10;
164 	command[i].alt = 1;
165 	i++;
166 
167 	command[i].index = 100;
168 	command[i].nolen = 1;
169 	command[i].alt = 1;
170 	i++;
171 
172 	end = i;
173 	i = 0;
174 	printf("#!/usr/perl5/bin/perl\n\nBEGIN {\n");
175 
176 }
177 
178 tick-1ms
179 /i < end && command[i].nolen/
180 {
181 	this->str = command[i].alt ? altstr : str;
182 	this->str2 = command[i].alt ? altstr2 : str2;
183 	this->result = substr(command[i].alt ?
184 	    "CRAIG: Positioned them, I don't know... I'm fairly wide guy." :
185 	    str, command[i].index);
186 
187 	printf("\tif (substr(\"%s%s\", %d) ne \"%s\") {\n",
188 	    this->str, this->str2, command[i].index, this->result);
189 
190 	printf("\t\tprintf(\"perl => substr(\\\"%s%s\\\", %d) = ",
191 	    this->str, this->str2, command[i].index);
192 	printf("\\\"%%s\\\"\\n\",\n\t\t    substr(\"%s%s\", %d));\n",
193 	    this->str, this->str2, command[i].index);
194 	printf("\t\tprintf(\"   D => substr(\\\"%s%s\\\", %d) = ",
195 	    this->str, this->str2, command[i].index);
196 	printf("\\\"%%s\\\"\\n\",\n\t\t    \"%s\");\n", this->result);
197 	printf("\t\t$failed++;\n");
198 	printf("\t}\n\n");
199 }
200 
201 tick-1ms
202 /i < end && !command[i].nolen/
203 {
204 	this->str = command[i].alt ? altstr : str;
205 	this->str2 = command[i].alt ? altstr2 : str2;
206 	this->result = substr(command[i].alt ?
207 	    "CRAIG: Positioned them, I don't know... I'm fairly wide guy." :
208 	    str, command[i].index, command[i].length);
209 
210 	printf("\tif (substr(\"%s%s\", %d, %d) ne \"%s\") {\n",
211 	    this->str, this->str2, command[i].index, command[i].length,
212 	    this->result);
213 	printf("\t\tprintf(\"perl => substr(\\\"%s%s\\\", %d, %d) = ",
214 	    this->str, this->str2, command[i].index, command[i].length);
215 	printf("\\\"%%s\\\"\\n\",\n\t\t    substr(\"%s%s\", %d, %d));\n",
216 	    this->str, this->str2, command[i].index, command[i].length);
217 	printf("\t\tprintf(\"   D => substr(\\\"%s%s\\\", %d, %d) = ",
218 	    this->str, this->str2, command[i].index, command[i].length);
219 	printf("\\\"%%s\\\"\\n\",\n\t\t    \"%s\");\n", this->result);
220 	printf("\t\t$failed++;\n");
221 	printf("\t}\n\n");
222 }
223 
224 tick-1ms
225 /++i == end/
226 {
227 	printf("\texit($failed);\n}\n");
228 	exit(0);
229 }
230