]> git.donarmstrong.com Git - kiibohd-kll.git/blobdiff - kll.py
Another error message cleanup
[kiibohd-kll.git] / kll.py
diff --git a/kll.py b/kll.py
index aab66d27c8fe50ad99bb562292dda469ce44dd50..b03c67dd78bd0bcc8103b0f6bc7c90954f54bd4f 100755 (executable)
--- a/kll.py
+++ b/kll.py
@@ -69,12 +69,12 @@ def checkFileExists( filename ):
 def processCommandLineArgs():
        # Setup argument processor
        pArgs = argparse.ArgumentParser(
-               usage="%(prog)s [options] <file1>...",
-               description="Generates .h file state tables and pointer indices from KLL .kll files.",
-               epilog="Example: {0} mykeyboard.kll -d colemak.kll -p hhkbpro2.kll -p symbols.kll".format( os.path.basename( sys.argv[0] ) ),
-               formatter_class=argparse.RawTextHelpFormatter,
-               add_help=False,
-)
+               usage="%(prog)s [options] <file1>...",
+               description="Generates .h file state tables and pointer indices from KLL .kll files.",
+               epilog="Example: {0} mykeyboard.kll -d colemak.kll -p hhkbpro2.kll -p symbols.kll".format( os.path.basename( sys.argv[0] ) ),
+               formatter_class=argparse.RawTextHelpFormatter,
+               add_help=False,
+       )
 
        # Positional Arguments
        pArgs.add_argument( 'files', type=str, nargs='+',
@@ -147,9 +147,9 @@ def tokenize( string ):
                ( 'ScanCode',         ( r'S((0x[0-9a-fA-F]+)|([0-9]+))', ) ),
                ( 'ScanCodeStart',    ( r'S\[', ) ),
                ( 'CodeEnd',          ( r'\]', ) ),
-               ( 'String',           ( r'"[^"]*"', VERBOSE ) ),
+               ( 'String',           ( r'"[^"]*"', ) ),
                ( 'SequenceString',   ( r"'[^']*'", ) ),
-               ( 'Operator',         ( r'=>|:\+|:-|:|=', ) ),
+               ( 'Operator',         ( r'=>|:\+|:-|::|:|=', ) ),
                ( 'Comma',            ( r',', ) ),
                ( 'Dash',             ( r'-', ) ),
                ( 'Plus',             ( r'\+', ) ),
@@ -182,9 +182,10 @@ capabilities_dict = Capabilities()
 def make_scanCode( token ):
        scanCode = int( token[1:], 0 )
        # Check size, to make sure it's valid
-       if scanCode > 0xFF:
-               print ( "{0} ScanCode value {1} is larger than 255".format( ERROR, scanCode ) )
-               raise
+       # XXX Add better check that takes symbolic names into account (i.e. U"Latch5")
+       #if scanCode > 0xFF:
+       #       print ( "{0} ScanCode value {1} is larger than 255".format( ERROR, scanCode ) )
+       #       raise
        return scanCode
 
 def make_hidCode( type, token ):
@@ -214,9 +215,10 @@ def make_hidCode( type, token ):
                        hidCode = int( token, 0 )
 
        # Check size if a USB Code, to make sure it's valid
-       if type == 'USBCode' and hidCode > 0xFF:
-               print ( "{0} USBCode value {1} is larger than 255".format( ERROR, hidCode ) )
-               raise
+       # XXX Add better check that takes symbolic names into account (i.e. U"Latch5")
+       #if type == 'USBCode' and hidCode > 0xFF:
+       #       print ( "{0} USBCode value {1} is larger than 255".format( ERROR, hidCode ) )
+       #       raise
 
        # Return a tuple, identifying which type it is
        if type == 'USBCode':
@@ -266,17 +268,17 @@ def make_seqString( token ):
                ( "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0x20 ),
                ( "+",       0x12 ),
                ( "&(",      0x11 ),
-               ( "!#$%<>",  0x10 ),
+               ( "!#$%",    0x10 ),
                ( "*",       0x0E ),
                ( ")",       0x07 ),
                ( '"',       0x05 ),
                ( ":",       0x01 ),
-               ( "^",      -0x10 ),
-               ( "_",      -0x18 ),
-               ( "{}|",    -0x1E ),
-               ( "~",      -0x20 ),
-               ( "@",      -0x32 ),
-               ( "?",      -0x38 ),
+               ( "@",      -0x0E ),
+               ( "<>?",    -0x10 ),
+               ( "~",      -0x1E ),
+               ( "{}|",    -0x20 ),
+               ( "^",      -0x28 ),
+               ( "_",      -0x32 ),
        )
 
        listOfLists = []
@@ -525,7 +527,8 @@ def eval_scanCode( triggers, operator, results ):
                                macros_map.removeScanCode( trigger, result )
 
                        # Replace Case
-                       elif operator == ":":
+                       # Soft Replace Case is the same for Scan Codes
+                       elif operator == ":" or operator == "::":
                                macros_map.replaceScanCode( trigger, result )
 
 def eval_usbCode( triggers, operator, results ):
@@ -539,6 +542,10 @@ def eval_usbCode( triggers, operator, results ):
                scanCodes = macros_map.lookupUSBCodes( trigger )
                for scanCode in scanCodes:
                        for result in results:
+                               # Soft Replace needs additional checking to see if replacement is necessary
+                               if operator == "::" and not macros_map.softReplaceCheck( scanCode ):
+                                       continue
+
                                # Cache assignment until file finishes processing
                                macros_map.cacheAssignment( operator, scanCode, result )
 
@@ -656,7 +663,7 @@ capability_expression = name + skip( operator('=>') ) + name + skip( parenthesis
 define_expression = name + skip( operator('=>') ) + name + skip( eol ) >> set_define
 
 #| <trigger> : <result>;
-operatorTriggerResult = operator(':') | operator(':+') | operator(':-')
+operatorTriggerResult = operator(':') | operator(':+') | operator(':-') | operator('::')
 scanCode_expression   = triggerCode_outerList + operatorTriggerResult + resultCode_outerList + skip( eol ) >> map_scanCode
 usbCode_expression    = triggerUSBCode_outerList + operatorTriggerResult + resultCode_outerList + skip( eol ) >> map_usbCode
 
@@ -676,13 +683,17 @@ def parse( tokenSequence ):
 def processKLLFile( filename ):
        with open( filename ) as file:
                data = file.read()
-               tokenSequence = tokenize( data )
+               try:
+                       tokenSequence = tokenize( data )
+               except LexerError as err:
+                       print ( "{0} Tokenization error in '{1}' - {2}".format( ERROR, filename, err ) )
+                       sys.exit( 1 )
                #print ( pformat( tokenSequence ) ) # Display tokenization
                try:
                        tree = parse( tokenSequence )
-               except NoParseError as e:
-                       print("Error parsing %s. %s" % (filename, e.msg), file=sys.stderr)
-                       sys.exit(1)
+               except (NoParseError, KeyError) as err:
+                       print ( "{0} Parsing error in '{1}' - {2}".format( ERROR, filename, err ) )
+                       sys.exit( 1 )
 
 
 ### Misc Utility Functions ###