1 /* { dg-do run } */
2 /* { dg-options "-O1 -fno-inline" } */
3 /* { dg-require-effective-target int32plus } */
4 
5 extern void abort (void);
6 
7 static int something;
8 
9 static int * converterData[2]={
10     &something, &something,
11 };
12 
13 static struct {
14   const char *name;
15   int type;
16 } const cnvNameType[] = {
17   { "bocu1", 1 },
18   { "utf7", 1 },
19   { "utf8", 1 }
20 };
21 
22 
23 const int * getAlgorithmicTypeFromName(const char *realName);
24 const int *
getAlgorithmicTypeFromName(const char * realName)25 getAlgorithmicTypeFromName(const char *realName)
26 {
27     unsigned mid, start, limit;
28     unsigned lastMid;
29     int result;
30     start = 0;
31     limit = sizeof(cnvNameType)/sizeof(cnvNameType[0]);
32     mid = limit;
33     lastMid = 0xffffffff;
34 
35     for (;;) {
36         mid = (start + limit) / 2;
37         if (lastMid == mid) {   /* Have we moved? */
38             break;  /* We haven't moved, and it wasn't found. */
39         }
40         lastMid = mid;
41         result = __builtin_strcmp(realName, cnvNameType[mid].name);
42 
43         if (result < 0) {
44             limit = mid;
45         } else if (result > 0) {
46             start = mid;
47         } else {
48             return converterData[cnvNameType[mid].type];
49         }
50     }
51 
52     return 0;
53 }
54 
main(void)55 int main (void)
56 {
57   if (!getAlgorithmicTypeFromName ("utf8"))
58     abort ();
59   return 0;
60 }
61