| /* { dg-do run } */ |
| /* { dg-options "-O1 -fno-inline" } */ |
| /* { dg-require-effective-target int32plus } */ |
| |
| extern void abort (void); |
| |
| static int something; |
| |
| static int * converterData[2]={ |
| &something, &something, |
| }; |
| |
| static struct { |
| const char *name; |
| int type; |
| } const cnvNameType[] = { |
| { "bocu1", 1 }, |
| { "utf7", 1 }, |
| { "utf8", 1 } |
| }; |
| |
| |
| const int * getAlgorithmicTypeFromName(const char *realName); |
| const int * |
| getAlgorithmicTypeFromName(const char *realName) |
| { |
| unsigned mid, start, limit; |
| unsigned lastMid; |
| int result; |
| start = 0; |
| limit = sizeof(cnvNameType)/sizeof(cnvNameType[0]); |
| mid = limit; |
| lastMid = 0xffffffff; |
| |
| for (;;) { |
| mid = (start + limit) / 2; |
| if (lastMid == mid) { /* Have we moved? */ |
| break; /* We haven't moved, and it wasn't found. */ |
| } |
| lastMid = mid; |
| result = __builtin_strcmp(realName, cnvNameType[mid].name); |
| |
| if (result < 0) { |
| limit = mid; |
| } else if (result > 0) { |
| start = mid; |
| } else { |
| return converterData[cnvNameType[mid].type]; |
| } |
| } |
| |
| return 0; |
| } |
| |
| int main (void) |
| { |
| if (!getAlgorithmicTypeFromName ("utf8")) |
| abort (); |
| return 0; |
| } |