#! python: #w#VIC vic.py module # # Copyright 2002, 2003 by Timothy Rue <3seas@threeseas.net> # # VIC vic.py module: version 0.5.1.python (BETA) # # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation version 2 # of the License. http://www.gnu.org/copyleft/gpl.html # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Or access http://www.gnu.org/copyleft/gpl.html ########################################################################## #August 29, 2003 made file IQ parseable 0.5.1 #July 24, 2003 initial release 0.5 # ########################################################################## #s#system modules import string import os #s#local modules from process import * import errors #w#class Vic class Vic: "Virtual Interaction Configuration" #s#def __init__ def __init__(self,name,num,room): self.process = Process(name,num,room) #s#def saveFiles def saveFiles(self): return self.process.saveFiles() #s#def savePK def savePK(self,filename=None): if (filename == None): return self.process.savePKFile() else: return self.process.saveValuesTo(filename) #s#def loadPK def loadPK(self,filename): return self.process.loadValuesFrom(filename) #s#def saveOI def saveOI(self,filename=None): return self.process.saveOIFile(filename) #s#def getRoomPath def getRoomPath(self): return self.process.getRoomPath() #s#def getRoomName def getRoomName(self): return self.process.getRoomName() #s#def setErrorMode def setErrorMode(self): #print "SETTING ERROR MODE on "+self.getRoomName() self.setStepMode(1) ### ------------------------------------------------------------------- #w#SF related (in class vic) #s#def getSFFilename def getSFFilename(self,index): result = None if (index >= 0 and index < len(self.process.values['SF'][3])): result = self.process.values['SF'][3][index] return result #s#def setStepMode def setStepMode(self,one_or_zero): if (one_or_zero == 1): if (self.process.values['SF'][0][0] == 'A' or self.process.values['SF'][0][0] == 'I'): self.process.values['SF'][0] = 'S1' + (self.process.values['SF'][0])[1:] elif (self.process.values['SF'][0][0:2] == 'S0'): self.process.values['SF'][0] = 'S1' + (self.process.values['SF'][0])[2:] else: self.process.values['SF'][0] = 'S0' + (self.process.values['SF'][0])[2:] #s#def inStepMode def inStepMode(self): try: return (self.process.values['SF'][0][0] == 'S' and self.process.values['SF'][0][1] != '0') except: return 0 #s#def inScriptMode ### ### Check the 'SF' flags to see if the user has turned off scripting ### def inScriptMode(self): script_mode = 1 try: flags = string.split(self.process.values['SF'][0],' ',5) for flag in flags: if (flag == 'E'): break elif (flag == 'B' or flag == 'D'): script_mode = 0 break except: pass return script_mode #s#def leaveScriptMode ### ### Disable script processing ### def leaveScriptMode(self): try: output = '' flags = string.split(self.process.values['SF'][0],' ',5) for flag in flags: if (flag != 'E'): output = output + ' ' + flag else: output = output + ' ' + 'B' ### bypass script processing self.process.values['SF'][0] = output except: pass #s#def isProcessingVars ### ### Check the 'SF' flags to see if the user has disabled ### processing of variables on in the commmand line ### def isProcessingVars(self): proc_vars = 1 try: flags = string.split(self.process.values['SF'][0],' ',5) for flag in flags: if (flag == '+V'): break elif (flag == '-V'): proc_vars = 0 break except: pass return proc_vars ### ----------------------------------------------------------------- #w#PK related (in class vic) ### ### These are used in pk.py ### #s#def switchCurrentAndLast def switchCurrentAndLast(self,tag,restore=1): tmp = self.process.values[tag][0] self.process.values[tag][0] = self.process.values[tag][1] if (restore): self.process.values[tag][1] = tmp #s#def currentIsBlank def currentIsBlank(self,tag,blank=''): return (self.process.values[tag][0] == blank) #s#def ifCurrentBlankSetDefault def ifCurrentBlankSetDefault(self,tag,blank=''): if (self.process.values[tag][0] == blank): self.process.values[tag][0] = self.process.values[tag][2] ### Use default #s#def getDefaultForTag def getDefaultForTag(self,tag,index=None): default = self.process.setOfDefaultValues() if (index == None): return default[tag] else: return default[tag][index] #s#def getForTag def getForTag(self,tag,index=None): if (index == None): return self.process.values[tag] else: return self.process.values[tag][index] #s#def setTag def setTag(self,tag,value): self.process.setFromTagAndString(tag,value) ### ------------------------------------------------------------------- #w#VIC instance related (in class vic) #s#def getName def getName(self): return self.process.getName() #s#def getID def getID(self): return self.process.getNumber() #s#def getNameID def getNameID(self): return self.process.getRoomName() #s#def getRoom def getRoom(self): return self.process.getRoomPath() ### ------------------------------------------------------------------- #w#Command processing (in class vic) #s#def addCommand def addCommand(self,command): self.process.addPendingCommand(command) #s#def getCommand def getCommand(self): return self.process.getPendingCommand() #s#def getCommandCount def getCommandCount(self): return self.process.anyPendingCommands() #s#def getNextCommand ### ### If this VIC has any commands queued in either the SF scripts ### or added to it's pending-command queue, fetch the next command ### and return it. If nothing is available, return None ### def getNextCommand(self): command = None ### Only fetch a script command if in script mode (according to SF flags) if (self.inScriptMode()): command = self.getNextScriptCommand() if (command == None): command = self.getCommand() return command #s#def getScriptLine ### ### Where are we in the script ### def getScriptLine(self): return self.process.getScriptLine() #s#def shouldGetInput ### ### Should we input a new command? ### def shouldGetInput(self): rc = 1 if (self.getCommandCount() > 0): rc = 0 elif (self.inScriptMode()): if (len(self.process.values['SF'][3]) > 0 and not self.process.currentScriptIsFinished()): rc = 0 return rc ### ------------------------------------------------------------------- #w#path and file (in class vic) ### ### If the user specified a plain filename, in most instances ### this refers to a file in the current VIC room. If a full ### path is given, then it doesn't. Given a filename, work ### out the plain filename, and the path + filename ### #s#def getRoomPathAndFile def getRoomPathAndFile(self,filename): if (files.isPlainFilename(filename)): path_filename = self.process.full_room_path+filename plain_filename = filename else: path_filename = filename plain_filename = files.fileName(filename) return path_filename,plain_filename ### ------------------------------------------------------------------- #w#setting PK file fields (in class vic) #s#def setOPStartFile ### ### Load in a different OI file at startup - else create it ### def setOPStartFile(self,filename): error = errors.ok path_filename,plain_filename = self.getRoomPathAndFile(filename) #print "AI OI Looking for ["+path_filename+"] or ["+plain_filename+"] from ["+filename+"]" if (files.isFile(path_filename)): backup_vars = self.process.vars backup_tags = self.process.var_tags if (not self.process.reloadOIFile(path_filename)): self.process.vars = backup_vars self.process.var_tags = backup_tags error = errors.bad_oi_file else: if (files.isPlainFilename(filename)): self.process.values['OI'][0] = plain_filename else: self.process.values['OI'][0] = path_filename else: if (files.isPlainFilename(filename)): self.process.saveOIFile(plain_filename) self.process.values['OI'][0] = plain_filename else: error = errors.bad_oi_file return error #s#def setIPOptions def setIPOptions(self,opts): if (string.count(opts,',') == 4): self.process.values['IP'][1] = self.process.values['IP'][0] self.process.values['IP'][0] = opts return errors.ok return errors.incorrect_args #s#def setOPOptions def setOPOptions(self,opts): if (string.count(opts,',') == 4): self.process.values['OP'][1] = self.process.values['OP'][0] self.process.values['OP'][0] = opts return errors.ok return errors.incorrect_args #s#def set_XX_File def set_XX_File(self,tag,filename): error = errors.ok line = 0 if (string.count(filename,'@') == 1): try: filename,line_str = string.split(filename,'@',1) line = int(line_str) except: return errors.incorrect_args path_filename,plain_filename = self.getRoomPathAndFile(filename) if (not files.isFile(path_filename) and files.isPlainFilename(filename)): ### Does not exist - create in home try: fout = open(path_filename,"w") fout.close() line = 1 filename = plain_filename except: if (tag == 'SF'): error = errors.bad_sf_file elif (tag == 'IQ'): error = errors.bad_iq_file elif (tag == 'ID'): error = errors.bad_id_file elif (not files.isFile(path_filename) and not files.isPlainFilename(filename)): ### File does not exist, and is not specified in ROOM if (tag == 'SF'): error = errors.bad_sf_file elif (tag == 'IQ'): error = errors.bad_iq_file elif (tag == 'ID'): error = errors.bad_id_file elif (files.isFile(path_filename)): ### File exists in ROOM directory or exists somewhere else if (files.isPlainFilename(filename)): filename = plain_filename ## in room else: filename = path_filename line = 1 if (error == errors.ok): self.process.values[tag][3].append(filename) self.process.values[tag][4].append(line) return error #s#def setKEFile def setKEFile(self,filename): error = errors.ok path_filename,plain_filename = self.getRoomPathAndFile(filename) if (not files.isFile(path_filename) and files.isPlainFilename(filename)): ### Does not exist - create in home try: fout = open(path_filename,"w") fout.close() line = 1 filename = plain_filename except: error = errors.bad_ke_file elif (not files.isFile(path_filename) and not files.isPlainFilename(filename)): ### remote file, not found error = errors.bad_ke_file if (error == errors.ok): ### file found or created if (files.isPlainFilename(filename)): self.process.values['KE'][2] = filename ### room file else: self.process.values['KE'][2] = path_filename ### remote file return error #s#def setSFFlags def setSFFlags(self,flag_str): processing = 'A' sf_enable = 'E' do_vars = '' out_file = '' error = errors.ok flags = string.split(flag_str,' ') for i in range(len(flags)): f = string.upper(flags[i]) ### Processing - 'A', 'Sn' or 'I' if (f == 'I' or (len(f) == 2 and f[0] == 'S' and f[1] in '0123456789')): processing = f elif (f == 'E' or f == 'B' or f == 'D'): sf_enable = f elif (len(f) == 2 and (f == '+V' or f == '-V')): do_vars = do_vars + ' ' + f elif (f == 'V'): do_vars = do_vars + ' ' + '+V' elif (len(f) == 2 and (f == '+C' or f == '-C')): do_vars = do_vars + ' ' + f elif (f == 'C'): do_vars = do_vars + ' ' + '+C' elif (f == 'T'): try: out_file = 'T '+flags(i+1) i = i + 1 except: error = errors.incorrect_args break elif (f == 'R'): try: out_file = 'R '+flags(i+1) i = i + 1 except: error = errors.incorrect_args break else: error = errors.incorrect_args do_vars = do_vars.strip() if (do_vars == ''): do_vars = "+V" if (error == errors.ok): self.process.values['SF'][0] = processing + " " + sf_enable + " " + do_vars + " " + out_file return error ### ------------------------------------------------------------------- #w#PK support commands (in class vic) #s#def getPKFilename def getPKFilename(self): return self.process.values['AI'][1] #s#def setPKFilename def setPKFilename(self,filename): self.process.values['AI'][1] = filename #s#def setPKField def setPKField(self,tag,field_number,value): self.process.values[tag][field_number] = value #s#def getPKField def getPKField(self,tag,field_number): result = "" try: result = self.process.getFieldStr(tag,field_number) except: pass return result #s#def getKELine1 def getKELine1(self): return self.getPKField('KE',0)+';'+self.getPKField('KE',1)+';'+self.getPKField('KE',2) #s#def getKELine2 def getKELine2(self): return self.getPKField('KE',3) #s#def swapKELines def swapKELines(self): keeper = self.getPKField('KE',0)+';'+self.getPKField('KE',1)+";"+self.getPKField('KE',2) fields = string.split(self.process.values['KE'][3],";") if (len(fields) == 0): fields.append('') fields.append('') fields.append('') elif (len(fields) == 1): fields.append('') fields.append('') elif (len(fields) == 2): fields.append('') self.process.values['KE'][3] = keeper self.process.values['KE'][0] = fields[0] self.process.values['KE'][1] = fields[1] self.process.values['KE'][2] = fields[2] #s#def getPKFileLine def getPKFileLine(self,tag): return self.process.getLine(tag) #s#def setPKFileLineDefault def setPKFileLineDefault(self,tag): self.process.setRowDefault(tag) ### ------------------------------------------------------------------- #w#OI support commands (in class vic) #s#def getOIFilename def getOIFilename(self): return self.process.values['OI'][0] #s#def hasVariable def hasVariable(self,var): return self.process.hasVar(var) #s#def getVariable def getVariable(self,var): return self.process.getVar(var); #s#def getVariableTag def getVariableTag(self,var): return self.process.getVarTag(var) #s#def setVariable def setVariable(self,var,val): self.process.addVar(var,val) #s#def setVariableTag def setVariableTag(self,var,tag): self.process.addVarTag(var,tag) #s#def delVariable def delVariable(self,var): self.process.removeVar(var) #s#def delVariableTag def delVariableTag(self,var): self.process.removeVarTag(var) #s#def getVariableDictionary def getVariableDictionary(self): return self.process.vars #s#def getEmptyVariableDictionary def getEmptyVariableDictionary(self): return {} #s#def getVariableList def getVariableList(self): list = [] for var,val in self.process.vars.items(): list.append([var,val,self.process.getVarTag(var)]) return list #s#def saveOI def saveOI(self): self.process.saveOI() ### ------------------------------------------------------------------- #w#IP support command (in class vic) #s#def getIPInputDevice def getIPInputDevice(self): raw_device_name = self.process.values['IP'][0][0] if (raw_device_name == "stdin"): return "stdin:" ### ------------------------------------------------------------------- #w#PK file related (in class vic) #s#def loadCreatePKFile ### ### Given a path to a PK file, try to load it in. ### If the filename is a plain file, e.g.: 'foo.pk' look for it in ### our room directory. If the file has a path component, then look ### for it in the given path. ### ### If a simple file, and it doesn't exist, create a default-value PK file ### of that name in our Room. If it has a path, and doesn't exist, return an error ### def loadCreatePKFile(self,filename,save_first=1): error = errors.ok if (save_first): self.savePK() path_filename_new,plain_filename_new = self.getRoomPathAndFile(filename) backup = self.process.values if (files.isFile(path_filename_new)): if (self.loadPK(path_filename_new)): self.process.values['PK'][1] = self.process.values['PK'][0] if (files.isPlainFilename(filename)): ### Loaded the file from our room directory self.process.values['PK'][0] = plain_filename_new else: ### PK file is in different dir - store the full path self.process.values['PK'][0] = path_filename_new ### restore our room information over that from the other PK file self.process.values['AI'][0] = backup['AI'][0] self.process.values['AI'][2] = backup['AI'][2] else: ### error loading the file error = errors.bad_pk_file self.process.values = backup else: ### File doesn't exist, create with default values self.process.values = self.process.setOfDefaultValues() self.process.values['AI'][0] = backup['AI'][0] self.process.values['AI'][1] = backup['AI'][2] + plain_filename_new self.process.values['AI'][2] = backup['AI'][2] self.process.values['PK'][0] = plain_filename_new self.process.values['PK'][1] = backup['PK'][0] if (not self.savePK()): ### disk or filename error ? error = errors.bad_pk_file self.process.values = backup return error #s#def setPKFieldUserValue ### All the different processing when the user specifies the value ### for a PK entry on the command line are processed here def setPKFieldUserValue(self,tag,value,field): error = errors.ok if (tag == 'AI'): if (field == 2): ### Sets the current directory to given directory. ### If the directory does not exist the standard error process happens. if (files.isDir(os.path.abspath(value))): self.setPKField('AI',2,value) else: error = errors.dir_no_exit else: error = errors.bad_field_count elif (tag == 'PK'): if (field == 0): ### PK PK -c1 error = self.loadCreatePKFile(value) elif (field == 1 or field == 2): ### PK PK -c2 ### PK PK -c3 path_filename,plain_filename = self.getRoomPathAndFile(value) if (files.isFile(path_filename)): self.process.values['PK'][1] = value else: ### Use the current VIC to make a new PK file backup = self.process.values self.process.values = self.process.setOfDefaultValues() self.process.values['AI'][0] = backup['AI'][0] self.process.values['AI'][1] = value self.process.values['AI'][2] = backup['AI'][2] self.process.values['PK'][0] = value if (not self.savePK(value)): error = errors.bad_pk_file self.process.values = backup ### if we created the file ok, slot it's name into the current VIC if (error == errors.ok): self.process.values['PK'][field] = value else: error = errors.bad_field_count elif (tag == 'OI'): if (field == 0): ### PK OI -c1 self.process.values['OI'][1] = self.process.values['OI'][0] ### make currrent the last/alt self.process.values['OI'][0] = value if (not self.process.reloadOIFile()): if (not self.process.saveOIFile()): error = errors.bad_oi_file elif (field == 1 or field == 2): ### PK OI -c2 ### PK OI -c3 path_filename,plain_filename = self.getRoomPathAndFile(value) if (value == plain_filename): self.process.values['OI'][field] = plain_filename else: self.process.values['OI'][field] = path_filename if (not files.isFile(path_filename)): try: f = open(path_filename,"w") f.write("### PK OI -c"+str(field+1)+" "+path_filename+" (created)\n") f.close() except: error = errors.save_failed else: error = errors.bad_field_count elif (tag == 'IP'): try: params = string.split(value,",",5) if (len(params) != 5): raise any_error if (params[0] == ''): params[0] = 'stdin' if (field == 0 or field == 1 or field == 2): if (field == 0): ### PK IP -c1
self.process.values['IP'][1] = self.process.values['IP'][0] ### make currrent the last/alt ### PK IP -c1
### PK IP -c2
### PK IP -c3
#print "PK IP C3: IP["+str(field)+"] := "+str(params) self.process.values['IP'][field] = params else: error = errors.bad_field_count except: error = errors.invalid_ip elif (tag == 'OP'): try: params = string.split(value,",",5) if (len(params) != 5): raise any_error if (params[0] == ''): params[0] = 'stdout' failed = 0 if (field == 0 or field == 1 or field == 2): if (field == 0): ### PK OP -c1
self.process.values['OP'][1] = self.process.values['OP'][0] ### make currrent the last/alt ### PK OP -c1
### PK OP -c2
### PK OP -c3
self.process.values['OP'][field] = params else: error = errors.bad_field_count except: error = errors.invalid_op elif (tag in ['SF','IQ','ID']): if (field == 0): self.process.values[tag][1] = self.process.values[tag][0] if (tag == 'SF'): error = self.setSFFlags(value) else: ### No rules defined for processing IQ/ID self.process.values[tag][0] = value.strip() elif (field == 1): if (tag == 'SF'): keeper = self.process.values[tag][0] error = self.setSFFlags(value) self.process.values[tag][1] = self.process.values[tag][0] self.process.values[tag][0] = keeper else: self.process.values[tag][1] = value.strip() elif (field == 2): if (string.count(value,'@') == 1): self.process.values[tag][2] = value else: error = errors.incorrect_args elif (field == 3): try: file,line_str = string.split(value,'@') line = int(line_str) self.process.values[tag][3].append(file) ### add to running stack self.process.values[tag][4].append(line) except: error = errors.incorrect_args else: error = errors.bad_field_count elif (tag == 'KE'): ### No rules defined for KE values if (field <= 2 and (value[0] == '-' or value[0] == '+' or string.count(value,' -') > 0 or string.count(value,' +') > 0)): ### Modify the existing teeth using -tooth or +tooth ### To add or remove fields from the particular field teeth_mods = string.split(value,' ') for tooth in teeth_mods: if (tooth[0] in "+-"): word = tooth[1:] else: word = tooth if (tooth[0] == '+' or tooth[0] != '-'): ### add, assume add if NOT '-' self.process.values['KE'][field] = self.process.values['KE'][field] + " " + word else: # (tooth[0] == '-'): ### remove self.process.values['KE'][field] = self.process.values['KE'][field].replace(word,"") ### clean up any extra spacing self.process.values['KE'][field] = string.strip(self.process.values['KE'][field]) while (string.count(self.process.values['KE'][field]," ") > 0): self.process.values['KE'][field] = string.replace(self.process.values['KE'][field]," "," ") else: ### Set the teeth outright, since the input has no pluses or minuses self.process.values['KE'][field] = value ### Return the error code - if any return error #s#def PKLoadOrCreate ### ### Test-load or Test-Create the given PK File ### def PKLoadOrCreate(self,filename): error = errors.ok path_filename,plain_filename = self.getRoomPathAndFile(filename) backup = self.process.values if (files.isFile(path_filename)): ### exists already, try to load if (not self.process.loadValuesFrom(path_filename)): error = errors.bad_pk_file else: ### does not exist - create self.process.values = self.process.setOfDefaultValues() self.process.values['AI'][0] = backup['AI'][0] self.process.values['AI'][1] = backup['AI'][2] + plain_filename self.process.values['AI'][2] = backup['AI'][2] self.process.values['PK'][0] = plain_filename if (not self.process.saveValuesTo(path_filename)): error = errors.bad_pk_file self.process.values = backup return error #s#def doPKPK_MinusC def doPKPK_MinusC(self): error = errors.ok filename = self.process.values['PK'][1] path_filename,plain_filename = self.getRoomPathAndFile(filename) if (filename != "" and files.isFile(path_filename)): ### Load last/alt if (not self.process.loadValuesFrom(path_filename)): error = errors.bad_pk_file else: ### no last-alt, try default backup = self.process.values filename = self.process.values['PK'][2] path_filename,plain_filename = self.getRoomPathAndFile(filename) if (filename != "" and files.isFile(path_filename)): if (not self.process.loadValuesFrom(path_filename)): error = errors.bad_pk_file else: self.process.values = self.process.setOfDefaultValues() self.process.values['AI'][0] = backup['AI'][0] self.process.values['AI'][1] = backup['AI'][2] + self.process.values['PK'][0] self.process.values['AI'][2] = backup['AI'][2] self.process.savePKFile() return error #s#def doPK_XX_MinusC1 def doPK_XX_MinusC1(self,tag): if (tag == 'AI'): error = errors.incorrect_args ### No PK AI -c1 else: error = errors.ok tag = string.upper(tag) if (tag == 'PK'): backup = self.process.values if (self.process.values['PK'][1] != ''): ### Load the given PK file path_file,plain_file = self.getRoomPathAndFile(self.process.values['PK'][1]) if (not self.loadPK(path_file)): error = errors.bad_pk_file self.process.values = backup else: self.process.values['AI'][0] = backup['AI'][0] self.process.values['AI'][1] = backup['AI'][2] + plain_file self.process.values['AI'][2] = backup['AI'][2] self.process.values['PK'][0] = plain_file else: ### Load default, or create path_file,plain_file = self.getRoomPathAndFile(self.process.values['PK'][2]) if (not self.loadPK(path_file)): self.process.values = self.process.setOfDefaultValues() self.process.values['AI'][0] = backup['AI'][0] self.process.values['AI'][1] = backup['AI'][2] + plain_file self.process.values['AI'][2] = backup['AI'][2] elif (tag == 'OI'): backup_vars = self.process.vars backup_tags = self.process.var_tags if (self.process.values['OI'][1] != ''): ### Load the given OI file path_file,plain_file = self.getRoomPathAndFile(self.process.values['OI'][1]) if (not self.process.reloadOIFile(path_file)): error = errors.bad_oi_file self.process.vars = backup_vars self.process.var_tags = backup_tags else: self.process.values['OI'][0] = plain_file else: path_file,plain_file = self.getRoomPathAndFile(self.process.values['PK'][2]) if (not self.process.reloadOIFile(path_file)): self.process.eraseAllVars() self.process.values['OI'][0] = plain_file elif (tag in ['IP','OP','SF','IQ','ID','KE']): if (self.process.values[tag][1] != ''): self.process.values[tag][0] = self.process.values[tag][1] elif (self.process.values[tag][2] != ''): self.process.values[tag][0] = self.process.values[tag][2] else: default = self.process.setOfDefaultValues() self.process.values[tag][0] = default[tag][0] return error #s#def doPK_XX_MinusC2 ### ### Mostly clear the field ### def doPK_XX_MinusC2(self,tag): error = errors.ok if (tag in ['PK','OI','IP','OP','SF','IQ','ID','KE']): default = self.process.setOfDefaultValues() self.process.values[tag][1] = default[tag][1] else: error = errors.incorrect_args ### No PK AI -c2 or others return error #s#def doPK_XX_MinusC3 ### ### Mostly clear the field ### def doPK_XX_MinusC3(self,tag): error = errors.ok if (tag in ['PK','OI','IP','OP','SF','IQ','ID','KE']): default = self.process.setOfDefaultValues() self.process.values[tag][2] = default[tag][2] else: error = errors.incorrect_args ### No PK AI -c2 or others return error #s#def doPK_XX_MinusC4 ### ### Mostly clear the field ### def doPK_XX_MinusC4(self,tag): error = errors.ok if (tag == 'SF'): self.process.clearCurrentScript() if (tag in ['SF','IQ','ID']): self.clearFileRunQueue(tag) elif (tag == 'KE'): default = self.process.setOfDefaultValues() self.process.values[tag][3] = default[tag][3] else: error = errors.incorrect_args ### No PK AI -c4 or others return error #s#def clearFileRunQueue ### ### Clear out the run-queue for 'SF' ### def clearFileRunQueue(self,tag): default = self.process.setOfDefaultValues() self.process.values[tag][3] = default[tag][3] self.process.values[tag][4] = default[tag][4] #s#def runScript ### ### Given a filename, if that points to a VIC script file ### load the process with it's content, remember the filename and ### set the line counter to 1 ### ### Assume the script is going to execute immeadiately, and ### overwrite any currently executing script ### def runScript(self,filename,start_line=1): error = errors.ok path_file,plain_file = self.getRoomPathAndFile(filename) if (not files.isFile(path_file)): error = errors.bad_sf_file elif (not self.process.loadScript(path_file,start_line)): error = errors.bad_sf_file else: ### script loaded ok if (len(self.process.values['SF'][3]) == 0): if (files.isPlainFilename(filename)): self.process.values['SF'][3] = [plain_file] else: self.process.values['SF'][3] = [path_file] self.process.values['SF'][4] = [1] else: ### push this file at the head of the list if (files.isPlainFilename(filename)): self.process.values['SF'][3][0:0] = plain_file else: self.process.values['SF'][3][0:0] = path_file self.process.values['SF'][4][0:0] = 1 return error #s#def addScript ### ### Add the given script to the 'SF' run queue ### def addScript(self,filename,start_line=1): error = errors.ok path_file,plain_file = self.getRoomPathAndFile(filename) if (not files.isFile(path_file)): error = errors.bad_sf_file else: if (files.isPlainFilename(filename)): self.process.values['SF'][3].append(plain_file) else: self.process.values['SF'][3].append(path_file) self.process.values['SF'][4].append(self.process.script_line) return error #s#def getNextScript ### ### Fetch the next command from the current script (if any) ### and return it for processing. Automatically update the current ### line count. If (before this call) the script is at the last ### line, interrogate the SF stack to see if there is a new script ### to branch onto. ### def getNextScriptCommand(self): while (len(self.process.values['SF'][3]) > 0 and self.process.currentScriptIsFinished()): del(self.process.values['SF'][3][0]) del(self.process.values['SF'][4][0]) if (len(self.process.values['SF'][3]) > 0): script_file = self.process.values['SF'][3][0] script_line = self.process.values['SF'][4][0] if (not self.process.loadScript(script_file,script_line)): self.setStepMode(1) if (self.process.script_line > 0 and self.process.script_line <= len(self.process.script)): command = self.process.script[self.process.script_line-1] self.process.script_line = self.process.script_line + 1 if (len(self.process.values['SF'][4]) > 0): self.process.values['SF'][4][0] = self.process.script_line return command ### could be empty string too else: return None ### No commnand available #s#def rewindScript ### ### Skip back a line in the current script ### Called when the user breaks a script *after* the next ### line is fetched ### def rewindScriptCommand(self): if (self.process.script_line > 1): self.process.script_line = self.process.script_line -1 if (len(self.process.values['SF'][4]) > 0): self.process.values['SF'][4][0] = self.process.script_line #s#def handleOutput def handleOutput(self,output): return self.process.handleOutput(output)