diff --git a/tconfpy.py b/tconfpy.py index 4be09f2..0765e49 100755 --- a/tconfpy.py +++ b/tconfpy.py @@ -6,7 +6,7 @@ # Program Information PROGNAME = "tconfpy" -RCSID = "$Id: tconfpy.py,v 2.106 2005/01/19 10:03:33 tundra Exp $" +RCSID = "$Id: tconfpy.py,v 2.107 2005/01/19 11:08:24 tundra Exp $" VERSION = RCSID.split()[2] # Copyright Information @@ -268,21 +268,25 @@ eBADDEFAULT = "Type Of Default Value Does Not Agree With Type Declared" eBADLEGALVAL = "Type Of One Or More LegalVals Does Not Agree With Type Declared" eBADMINMAX = "Type Of Min Or Max Value Not Appropriate For" -eBADVARREF = "Attempt To Get Value Of Non-Existent Variable" +eBADTEMPLNAME = "Template Name Not Canonical" +eBADVALTYP = "Initial Value Has Wrong Type" +eBADVARREF = "Attempt To Get Value Of Non-Existent Variable" eIFBAD = "'%s' Or '%s' Missing" % (EQUIV, NOTEQUIV) +eINITSYMTBL = "InitialSymTable" eLEGALVALLIST = "The LegalVal Attribute Is Wrong Type (Must Be A List)" eNOTDESCRIPT = "Invalid Descriptor Type" eNOVARS = "This Conditional Requires At Least One Variable Name To Test" eSTARTUP = "" +eTEMPLATES = "Templates" # Error Messages +Messages["eAPIPARAMBAD"] = "API Error: %s For Variable '%s' In '%s' Passed To The API" Messages["eBADCOND"] = FILENUM + "Bad '%s' Directive. %s" Messages["eBADREGEX"] = FILENUM + "Bad Regular Expression, '%s', In Legal Values List For Variable '%s'" Messages["eBADSYNTAX"] = FILENUM + "Syntax Error. Statement Not In Known Form" Messages["eCONFIGTYPE"] = "Don't Know How To Process Configurations Of Type '%s'" 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)" @@ -406,14 +410,38 @@ global SymTable - # Set the name of the calling program for output messages - - mkmsg.proginfo = CallingProgram - - # Create and initialize a new symbol table - + # Create a new symbol table SymTable = SymbolTable() + # Set the name of the calling program for output messages + mkmsg.proginfo = CallingProgram + + # Validate the passed symbol table + symtblok = ValidateSymbolTable(InitialSymTable.Symbols, eINITSYMTBL) + + # Validate the passed template table + templok = ValidateSymbolTable(Templates.Symbols, eTEMPLATES, istemplate=True) + + # Both of these must be OK or we're done + + if not (symtblok and templok): + return SymTable + + # Everything was fine + + else: + # Load the symbol table + + for sym in InitialSymTable.Symbols: + SymTable.Symbols[sym] = InitialSymTable.Symbols[sym] + + # Load the template table + + for sym in Templates.Symbols: + SymTable.Templates.Symbols[sym] = Templates.Symbols[sym] + + + # Initialize the globals SymTable.ALLOWNEWVAR = AllowNewVars @@ -423,7 +451,7 @@ SymTable.INLITERAL = False SymTable.DEBUG = Debug - # Load the predefines symbols + # Load the predefined symbols for var in Predefined.keys(): @@ -433,80 +461,6 @@ SymTable.Symbols[var] = d - - # Add any passed symbols to the SymbolTable - - deserror = False - for sym in InitialSymTable.Symbols: - - des = InitialSymTable.Symbols[sym] - - # Make sure a valid descriptor was passed for each variable - - desok = True - - # Make sure we got a Var Descriptor Object - - if not isinstance(des, VarDescriptor): - desok = False - ErrorMsg("eDESCRIPTBAD", (eNOTDESCRIPT, sym)) - des = VarDescriptor() # Make a fake one so the following tests don't blow up - - # Check various entries for type agreement - - dt = des.Type - - # Make sure default value agrees with variable type - - if des.Default and type(des.Default) != dt: - desok = False - ErrorMsg("eDESCRIPTBAD", (eBADDEFAULT, sym)) - - # Make sure that LegalVals is a list type - - if type(des.LegalVals) != type([]): - desok = False - ErrorMsg("eDESCRIPTBAD", (eLEGALVALLIST, sym)) - - # Then check each value in the list for type agreement - else: - - for lv in des.LegalVals: - if type(lv) != dt: - desok = False - ErrorMsg("eDESCRIPTBAD", (eBADLEGALVAL, sym)) - - # Make sure min and max limits are of the correct type - - for mm in (des.Min, des.Max): - - # Floats can accept Float or Int boundaries - # Ints, & Strings can accept Int boundaries - # Boundaries not relevant for Bool and Complex - # Anything else is an error - - if mm and dt == TYPE_FLOAT and type(mm) != TYPE_FLOAT and type(mm) != TYPE_INT: - desok = False - ErrorMsg("eDESCRIPTBAD", (eBADMINMAX, sym)) - - if mm and dt in (TYPE_INT, TYPE_STRING) and type(mm) != TYPE_INT: - desok = False - ErrorMsg("eDESCRIPTBAD", (eBADMINMAX, sym)) - - # Only load the symbol table with valid entries - if desok: - SymTable.Symbols[sym] = des - - # Indicate that a problem was encountered - else: - deserror = True - - # If any of the passed symbols had bogus descriptor contents, we're done - - if deserror: - return SymTable - - # Symbol Table passed to API was OK, so keep going # Make sure the symbol table has a valid namespace @@ -1361,6 +1315,91 @@ # End Of 'ValidateSymbolName()' ##### +# Validate Symbol Table Content +##### + +def ValidateSymbolTable(symtbl, name, istemplate=False): + + errors = 0 + + for sym in symtbl: + + # Template names cannot contain a namespace separator character + + if istemplate and sym.count(NSSEP): + ErrorMsg("eAPIPARAMBAD", (eBADTEMPLNAME, sym, name)) + errors += 1 + + des = symtbl[sym] + + # Make sure a valid descriptor was passed for each variable + # Make sure we got a Var Descriptor Object + + if not isinstance(des, VarDescriptor): + errors += 1 + ErrorMsg("eAPIPARAMBAD", (eNOTDESCRIPT, sym, name)) + des = VarDescriptor() # Make a fake one so the following tests don't blow up + + # Check various entries for type agreement + + dt = des.Type + + # Make sure default value agrees with variable type + + if des.Value and type(des.Value) != dt: + errors += 1 + ErrorMsg("eAPIPARAMBAD", (eBADVALTYP, sym, name)) + + # Make sure default value agrees with variable type + + if des.Default and type(des.Default) != dt: + errors += 1 + ErrorMsg("eAPIPARAMBAD", (eBADDEFAULT, sym, name)) + + # Make sure that LegalVals is a list type + + if type(des.LegalVals) != type([]): + errors += 1 + ErrorMsg("eAPIPARAMBAD", (eLEGALVALLIST, sym, name)) + + # Then check each value in the list for type agreement + else: + + for lv in des.LegalVals: + if type(lv) != dt: + errors += 1 + ErrorMsg("eAPIPARAMBAD", (eBADLEGALVAL, sym, name)) + + # Make sure min and max limits are of the correct type + + for mm in (des.Min, des.Max): + + # Floats can accept Float or Int boundaries + # Ints, & Strings can accept Int boundaries + # Boundaries not relevant for Bool and Complex + # Anything else is an error + + if mm and dt == TYPE_FLOAT and type(mm) != TYPE_FLOAT and type(mm) != TYPE_INT: + errors += 1 + ErrorMsg("eAPIPARAMBAD", (eBADMINMAX, sym, name)) + + if mm and dt in (TYPE_INT, TYPE_STRING) and type(mm) != TYPE_INT: + errors += 1 + ErrorMsg("eAPIPARAMBAD", (eBADMINMAX, sym, name)) + + # Return success of validation + + symtblok = True + + if errors: + symtblok = False + + return symtblok + +# End Of 'ValidateSymbolTable()' + + +##### # Validate Value #####