diff --git a/tconfpy.py b/tconfpy.py index c7e6ae8..1784d56 100755 --- a/tconfpy.py +++ b/tconfpy.py @@ -6,7 +6,7 @@ # Program Information PROGNAME = "tconfpy" -RCSID = "$Id: tconfpy.py,v 1.149 2004/03/27 01:24:34 tundra Exp $" +RCSID = "$Id: tconfpy.py,v 1.150 2004/03/31 21:40:42 tundra Exp $" VERSION = RCSID.split()[2] # Copyright Information @@ -81,12 +81,13 @@ IFALL = IF + "all" IFANY = IF + "any" IFNONE = IF + "none" +ELSE = CONDINTRO + "else" ENDIF = CONDINTRO + "endif" LITERAL = CONDINTRO + "literal" ENDLITERAL = CONDINTRO + "endliteral" Reserved = ["HASH", "DELIML", "DELIMR", "DOLLAR", "EQUAL", "EQUIV", "NOTEQUIV", "NSSEP", - "INCLUDE", "IF", "IFALL", "IFANY", "IFNONE", "ENDIF", "LITERAL", "ENDLITERAL"] + "INCLUDE", "IF", "IFALL", "IFANY", "IFNONE", "ELSE", "ENDIF", "LITERAL", "ENDLITERAL"] # Regular Expressions @@ -244,6 +245,7 @@ Messages["eBADSYNTAX"] = FILENUM + "Syntax Error. Statement Not In Known Form" Messages["eCONFOPEN"] = FILENUM + "Cannot Open The File '%s'" Messages["eDESCRIPTBAD"] = "API Error: %s For Variable '%s'" +Messages["eELSENOIF"] = FILENUM + "'%s' Without Preceding '%s' Form" % (ELSE, IF) Messages["eENDIFEXTRA"] = FILENUM + "'" + ENDIF + "' Without Matching Condition" Messages["eENDIFMISS"] = FILENUM + "Missing %d" + " '%s' " % ENDIF + " Statement(s)" Messages["eEQUIVEXTRA"] = FILENUM + "Only a single '%s' Or '%s' Operator Permitted" % (EQUIV, NOTEQUIV) @@ -570,7 +572,7 @@ cf.close() # File open failed for some reason - except: + except IOError: ErrorMsg("eCONFOPEN", (current_cfg, current_linenum, cfgfile)) # Record the error # End of 'ParseFile()' @@ -658,6 +660,52 @@ # Get first token on the line FIRSTTOK = line.split()[0] + + ##### + # ELSE Processing + ##### + + if line == ELSE: + + # Get the enclosing block type and state + + btyp, bst = CondStack.pop() + + # ELSE is only permitted after an immediately preceding IF form + + + if btyp != IF: + ErrorMsg("eELSENOIF", (cfgfile, linenum)) + CondStack.append(["", False]) # Error makes all that follows False + + # We *are* in an IF block and ELSE is appropriate. + # To determine whether the ELSE should be taken or not we have + # to look at the state of that IF block AND the state of + # the block that contains the IF. This is because the IF + # block state is the AND of the state of its parent block + # and its own logical state - i.e. A block can be made + # logically False by its containing block even if the condition + # tested is True. + + else: + + # If the containing block is True, the contained IF state is legitimate. + # The ELSE inverts the IF state in that case. + + if CondStack[-1][1]: + CondStack.append([ELSE, not bst]) + + # The containing block is false, so everything within it is also false + + else: + CondStack.append([ELSE, False]) + + if DEBUG: + DebugMsg("dPARSEDLINE", (cfgfile, linenum, orig, line)) + + return + + ##### # ENDIF Processing ##### @@ -1022,8 +1070,7 @@ # value is one of the ones enumerated in LegalVals. # # For strings, LegalVals is presumed to contain a list - # of regular expressions. The test is to compile - each + # of regular expressions. The test is to compile each # regex and see if any match the new value. if update and lv: