80 lines
2.0 KiB
C
80 lines
2.0 KiB
C
/* { dg-do compile } */
|
|
/* { dg-options "-O3 -ftree-pre" } */
|
|
|
|
typedef enum
|
|
{
|
|
ST_TiemanStyle,
|
|
}
|
|
BrailleDisplay;
|
|
static int pendingCommand;
|
|
static int currentModifiers;
|
|
typedef struct
|
|
{
|
|
int (*updateKeys) (BrailleDisplay * brl, int *keyPressed);
|
|
}
|
|
ProtocolOperations;
|
|
static const ProtocolOperations *protocol;
|
|
brl_readCommand (BrailleDisplay * brl)
|
|
{
|
|
unsigned long int keys;
|
|
int command;
|
|
int keyPressed;
|
|
unsigned char routingKeys[200];
|
|
int routingKeyCount;
|
|
signed char rightVerticalSensor;
|
|
if (pendingCommand != (-1))
|
|
{
|
|
return command;
|
|
}
|
|
if (!protocol->updateKeys (brl, &keyPressed))
|
|
{
|
|
if (rightVerticalSensor >= 0)
|
|
keys |= 1;
|
|
if ((routingKeyCount == 0) && keys)
|
|
{
|
|
if (currentModifiers)
|
|
{
|
|
doChord:switch (keys);
|
|
}
|
|
else
|
|
{
|
|
doCharacter:
|
|
command = 0X2200;
|
|
if (keys & 0X01UL)
|
|
command |= 0001;
|
|
if (keys & 0X02UL)
|
|
command |= 0002;
|
|
if (keys & 0X04UL)
|
|
command |= 0004;
|
|
if (keys & 0X08UL)
|
|
command |= 0010;
|
|
if (keys & 0X10UL)
|
|
command |= 0020;
|
|
if (keys & 0X20UL)
|
|
command |= 0040;
|
|
if (currentModifiers & (0X0010 | 0X0200))
|
|
command |= 0100;
|
|
if (currentModifiers & 0X0040)
|
|
command |= 0200;
|
|
if (currentModifiers & 0X0100)
|
|
command |= 0X020000;
|
|
if (currentModifiers & 0X0400)
|
|
command |= 0X080000;
|
|
if (currentModifiers & 0X0800)
|
|
command |= 0X040000;
|
|
}
|
|
unsigned char key1 = routingKeys[0];
|
|
if (key1 == 0)
|
|
{
|
|
}
|
|
if (key1 == 1)
|
|
if (keys)
|
|
{
|
|
currentModifiers |= 0X0010;
|
|
goto doCharacter;
|
|
}
|
|
}
|
|
}
|
|
return command;
|
|
}
|