KMR
testmisc.c
1 /* testmisc.c (2014-02-04) */
2 
3 /* Check miscellaneous (sequential ones), kmr_isort, etc. */
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <strings.h>
9 #include <limits.h>
10 #include <ctype.h>
11 #include <sys/time.h>
12 #include <assert.h>
13 #ifdef _OPENMP
14 #include <omp.h>
15 #endif
16 
17 extern void kmr_isort(void *a, size_t n, size_t es, int depth);
18 extern int kmr_scan_argv_strings(void *mr, char *s, size_t len, int arglim,
19  int *argc, char **argv,
20  _Bool wssep, char *msg);
21 
22 static double
23 wtime()
24 {
25  static struct timeval tv0 = {.tv_sec = 0};
26  struct timeval tv;
27  int cc;
28  cc = gettimeofday(&tv, 0);
29  assert(cc == 0);
30  if (tv0.tv_sec == 0) {
31  tv0 = tv;
32  assert(tv0.tv_sec != 0);
33  }
34  double dt = ((double)(tv.tv_sec - tv0.tv_sec)
35  + ((double)(tv.tv_usec - tv0.tv_usec) * 1e-6));
36  return dt;
37 }
38 
39 static char *
40 printablestring(char *s, int len)
41 {
42  /* LEN includes terminating zero. */
43  static char b[1024];
44  assert(len < (int)sizeof(b));
45  for (int i = 0; i < len; i++) {
46  if (s[i] == 0) {
47  b[i] = '$';
48  } else if (isblank(s[i])) {
49  b[i] = '_';
50  } else if (isprint(s[i])) {
51  b[i] = s[i];
52  } else {
53  b[i] = '?';
54  }
55  }
56  b[len - 1] = 0;
57  return b;
58 }
59 
60 static int
61 check_isort(int argc, char *argv[])
62 {
63 #if 0
64  {
65  /* Check with length 20. */
66 
67  /*printf("sizeof(long)=%ld\n", sizeof(long));*/
68  long a0[20] = {19, 18, 17, 16, 15, 14, 13, 12, 11, 10,
69  9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
70  size_t n0 = (sizeof(a0) / sizeof(long));
71  for (int i = 0; i < (int)n0; i++) {
72  a0[i] += 1000000000000;
73  }
74 
75  kmr_isort(a0, n0, sizeof(long), 5);
76 
77  for (int i = 0; i < (int)n0; i++) {
78  printf("%ld\n", a0[i]);
79  }
80  printf("\n");
81 
82  for (int i = 0; i < (int)n0; i++) {
83  assert(a0[i] == (i + 1000000000000));
84  }
85 
86  for (int i = 0; i < (int)n0; i++) {
87  printf("%ld ", a0[i]);
88  }
89  printf("\n");
90  }
91 #endif
92 
93 #if 0
94  {
95  long n1 = 100000000; /*100M*/
96  long *a1 = malloc(sizeof(long) * n1);
97  assert(a1 != 0);
98 
99  printf("Generating random numbers...\n");
100  for (long i = 0; i < n1; i++) {
101  a1[i] = ((((long)rand()) << 31) ^ ((long)rand()));
102  }
103 
104  if (0) {
105  printf("Problem...\n");
106  for (long i = 0; i < 10; i++) {
107  printf("%ld\n", a1[i]);
108  }
109  printf("\n");
110  }
111 
112  printf("Sorting...\n");
113 
114  kmr_isort(a1, n1, sizeof(long), 5);
115 
116  if (0) {
117  printf("Result...\n");
118  for (long i = 0; i < 10; i++) {
119  printf("%ld\n", a1[i]);
120  }
121  printf("\n");
122  }
123 
124  printf("Checking...\n");
125  long lb = LONG_MIN;
126  for (long i = 0; i < n1; i++) {
127  assert(a1[i] >= lb);
128  if (a1[i] > lb) {
129  lb = a1[i];
130  }
131  }
132  printf("OK\n");
133  }
134 #endif
135 
136  {
137 #ifdef _OPENMP
138  double t0, t1;
139 
140  long n5 = 100000000; /*100M*/
141  long *a5 = malloc(sizeof(long) * (size_t)n5);
142  assert(a5 != 0);
143 
144  printf("CHECK kmr_isort...\n");
145 
146  for (int loop = 0; loop <= 40; loop++) {
147  /*for *(int threads = 1; threads <= 8; threads *= 2) {*/
148  /*omp_set_num_threads(threads);*/
149  int threads;
150 
151 #pragma omp parallel
152  {
153  threads = omp_get_num_threads();
154  }
155 
156  srand(20140204);
157  printf("Generating random numbers...\n");
158  for (long i = 0; i < n5; i++) {
159  a5[i] = ((((long)rand()) << 31) ^ ((long)rand()));
160  }
161 
162  printf("Sorting (threads=%d)...\n", threads);
163  t0 = wtime();
164  kmr_isort(a5, (size_t)n5, sizeof(long), 5);
165  t1 = wtime();
166  printf("dt=%f\n", (t1 - t0));
167 
168  printf("Checking...\n");
169  long lb5 = LONG_MIN;
170  for (long i = 0; i < n5; i++) {
171  assert(a5[i] >= lb5);
172  if (a5[i] > lb5) {
173  lb5 = a5[i];
174  }
175  }
176  printf("OK\n");
177  }
178 #else
179  printf("NOT OMP\n");
180 #endif
181  }
182 
183  return 0;
184 }
185 
186 static int
187 check_string_scan(int argc, char *argv[])
188 {
189  {
190  int argsc;
191  char *argsv[128];
192 
193  printf("CHECK kmr_scan_argv_strings...\n");
194 
195  /* (space-separator) */
196 
197  char s0[] = "";
198  printf("s=(%s)\n", s0);
199  kmr_scan_argv_strings(0, s0, sizeof(s0), 128, &argsc, argsv, 1, "s0");
200  assert(argsc == 0);
201 
202  char s1[] = "abc bad cab";
203  printf("s=(%s)\n", s1);
204  kmr_scan_argv_strings(0, s1, sizeof(s1), 128, &argsc, argsv, 1, "s1");
205  assert(argsc == 3);
206  assert(strcmp(argsv[0], "abc") == 0
207  && strcmp(argsv[1], "bad") == 0
208  && strcmp(argsv[2], "cab") == 0);
209 
210  char s2[] = " abc bad cab ";
211  printf("s=(%s)\n", s2);
212  kmr_scan_argv_strings(0, s2, sizeof(s2), 128, &argsc, argsv, 1, "s2");
213  assert(argsc == 3);
214  assert(strcmp(argsv[0], "abc") == 0
215  && strcmp(argsv[1], "bad") == 0
216  && strcmp(argsv[2], "cab") == 0);
217 
218  char s3[] = "abc";
219  printf("s=(%s)\n", s3);
220  kmr_scan_argv_strings(0, s3, sizeof(s3), 128, &argsc, argsv, 1, "s3");
221  assert(argsc == 1);
222  assert(strcmp(argsv[0], "abc") == 0);
223 
224  char s4[] = " abc ";
225  printf("s=(%s)\n", s4);
226  kmr_scan_argv_strings(0, s4, sizeof(s4), 128, &argsc, argsv, 1, "s4");
227  assert(argsc == 1);
228  assert(strcmp(argsv[0], "abc") == 0);
229 
230  /* (null-separator) */
231 
232  char s5[] = "";
233  printf("s=(%s)\n", s5);
234  kmr_scan_argv_strings(0, s5, sizeof(s5), 128, &argsc, argsv, 0, "s5");
235  assert(argsc == 0);
236 
237  char s6[] = "abc\0bad\0cab";
238  printf("s=(%s)\n", printablestring(s6, sizeof(s6)));
239  kmr_scan_argv_strings(0, s6, sizeof(s6), 128, &argsc, argsv, 0, "s6");
240  assert(argsc == 3);
241  assert(strcmp(argsv[0], "abc") == 0
242  && strcmp(argsv[1], "bad") == 0
243  && strcmp(argsv[2], "cab") == 0);
244 
245  char s7[] = " abc bad \0\0 cab ";
246  printf("s=(%s)\n", printablestring(s7, sizeof(s7)));
247  kmr_scan_argv_strings(0, s7, sizeof(s7), 128, &argsc, argsv, 0, "s7");
248  assert(argsc == 3);
249  assert(strcmp(argsv[0], " abc bad ") == 0
250  && strcmp(argsv[1], "") == 0
251  && strcmp(argsv[2], " cab ") == 0);
252 
253  char s8[] = "abc";
254  printf("s=(%s)\n", s8);
255  kmr_scan_argv_strings(0, s8, sizeof(s8), 128, &argsc, argsv, 0, "s8");
256  assert(argsc == 1);
257  assert(strcmp(argsv[0], "abc") == 0);
258 
259  char s9[] = " abc ";
260  printf("s=(%s)\n", s9);
261  kmr_scan_argv_strings(0, s9, sizeof(s9), 128, &argsc, argsv, 0, "s9");
262  assert(argsc == 1);
263  assert(strcmp(argsv[0], " abc ") == 0);
264  }
265 
266  return 0;
267 }
268 
269 /* ================================================================ */
270 
271 int
272 main(int argc, char **argv)
273 {
274  check_isort(argc, argv);
275  check_string_scan(argc, argv);
276 }
void kmr_isort(void *a, size_t n, size_t es, int depth)
Sorts by comparator on long integers.
Definition: kmrisort.c:292