1 /* PR target/33923 */ 2 /* Testcase by Martin Michlmayr <tbm@cyrius.com> */ 3 4 /* { dg-do compile } */ 5 /* { dg-options "-O3 --param max-partial-antic-length=0" } */ 6 7 static int pendingCommand; 8 static int currentModifiers; 9 typedef struct 10 { 11 int (*updateKeys) (int *keyPressed); 12 } 13 ProtocolOperations; 14 static const ProtocolOperations *protocol; 15 int brl_readCommand(void)16brl_readCommand (void) 17 { 18 unsigned long int keys; 19 int command; 20 int keyPressed; 21 unsigned char routingKeys[200]; 22 int routingKeyCount; 23 signed char rightVerticalSensor; 24 if (pendingCommand != (-1)) 25 { 26 return command; 27 } 28 if (!protocol->updateKeys (&keyPressed)) 29 { 30 if (rightVerticalSensor >= 0) 31 keys |= 1; 32 if ((routingKeyCount == 0) && keys) 33 { 34 if (currentModifiers) 35 { 36 doChord:switch (keys); 37 } 38 else 39 { 40 doCharacter: 41 command = 0X2200; 42 if (keys & 0X01UL) 43 command |= 0001; 44 if (keys & 0X02UL) 45 command |= 0002; 46 if (keys & 0X04UL) 47 command |= 0004; 48 if (keys & 0X08UL) 49 command |= 0010; 50 if (keys & 0X10UL) 51 command |= 0020; 52 if (keys & 0X20UL) 53 command |= 0040; 54 if (currentModifiers & (0X0010 | 0X0200)) 55 command |= 0100; 56 if (currentModifiers & 0X0040) 57 command |= 0200; 58 if (currentModifiers & 0X0100) 59 command |= 0X020000; 60 if (currentModifiers & 0X0400) 61 command |= 0X080000; 62 if (currentModifiers & 0X0800) 63 command |= 0X040000; 64 } 65 unsigned char key1 = routingKeys[0]; 66 if (key1 == 0) 67 { 68 } else if (key1 == 1) 69 if (keys) 70 { 71 currentModifiers |= 0X0010; 72 goto doCharacter; 73 } 74 } 75 } 76 return command; 77 } 78