summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux/latest/com32/cmenu/menugen.py
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/syslinux/latest/com32/cmenu/menugen.py')
-rw-r--r--contrib/syslinux/latest/com32/cmenu/menugen.py307
1 files changed, 0 insertions, 307 deletions
diff --git a/contrib/syslinux/latest/com32/cmenu/menugen.py b/contrib/syslinux/latest/com32/cmenu/menugen.py
deleted file mode 100644
index 70ec1f8..0000000
--- a/contrib/syslinux/latest/com32/cmenu/menugen.py
+++ /dev/null
@@ -1,307 +0,0 @@
-#!/usr/bin/env python
-
-import sys, re, getopt
-
-class Menusystem:
-
- types = {"run" : "OPT_RUN",
- "inactive" : "OPT_INACTIVE",
- "checkbox" : "OPT_CHECKBOX",
- "radiomenu": "OPT_RADIOMENU",
- "sep" : "OPT_SEP",
- "invisible": "OPT_INVISIBLE",
- "radioitem": "OPT_RADIOITEM",
- "exitmenu" : "OPT_EXITMENU",
- "login" : "login", # special type
- "submenu" : "OPT_SUBMENU"}
-
- entry_init = { "item" : "",
- "info" : "",
- "data" : "",
- "ipappend" : 0, # flag to send in case of PXELINUX
- "helpid" : 65535, # 0xFFFF
- "shortcut":"-1",
- "state" : 0, # initial state of checkboxes
- "argsmenu": "", # name of menu containing arguments
- "perms" : "", # permission required to execute this entry
- "_updated" : None, # has this dictionary been updated
- "type" : "run" }
-
- menu_init = { "title" : "",
- "row" : "0xFF", # let system decide position
- "col" : "0xFF",
- "_updated" : None,
- "name" : "" }
-
- system_init ={ "videomode" : "0xFF",
- "title" : "Menu System",
- "top" : "1",
- "left" : "1" ,
- "bot" : "21",
- "right":"79",
- "helpdir" : "/isolinux/help",
- "pwdfile" : "",
- "pwdrow" : "23",
- "editrow" : "23",
- "skipcondn" : "0",
- "skipcmd" : ".exit",
- "startfile": "",
- "onerrorcmd":".repeat",
- "exitcmd" : ".exit",
- "exitcmdroot" : "",
- "timeout" : "600",
- "timeoutcmd":".beep",
- "totaltimeout" : "0",
- "totaltimeoutcmd" : ".wait"
- }
-
- shift_flags = { "alt" : "ALT_PRESSED",
- "ctrl" : "CTRL_PRESSED",
- "shift": "SHIFT_PRESSED",
- "caps" : "CAPSLOCK_ON",
- "num" : "NUMLOCK_ON",
- "ins" : "INSERT_ON"
- }
-
- reqd_templates = ["item","login","menu","system"]
-
- def __init__(self,template):
- self.state = "system"
- self.code_template_filename = template
- self.menus = []
- self.init_entry()
- self.init_menu()
- self.init_system()
- self.vtypes = " OR ".join(self.types.keys())
- self.vattrs = " OR ".join(filter(lambda x: x[0] != "_", self.entry.keys()))
- self.mattrs = " OR ".join(filter(lambda x: x[0] != "_", self.menu.keys()))
-
- def init_entry(self):
- self.entry = self.entry_init.copy()
-
- def init_menu(self):
- self.menu = self.menu_init.copy()
-
- def init_system(self):
- self.system = self.system_init.copy()
-
- def add_menu(self,name):
- self.add_item()
- self.init_menu()
- self.menu["name"] = name
- self.menu["_updated"] = 1
- self.menus.append( (self.menu,[]) )
-
- def add_item(self):
- if self.menu["_updated"]: # menu details have changed
- self.menus[-1][0].update(self.menu)
- self.init_menu()
- if self.entry["_updated"]:
- if not self.entry["info"]:
- self.entry["info"] = self.entry["data"]
- if not self.menus:
- print "Error before line %d" % self.lineno
- print "REASON: menu must be declared before a menu item is declared"
- sys.exit(1)
- self.menus[-1][1].append(self.entry)
- self.init_entry()
-
- def set_item(self,name,value):
- if not self.entry.has_key(name):
- msg = ["Unknown attribute %s in line %d" % (name,self.lineno)]
- msg.append("REASON: Attribute must be one of %s" % self.vattrs)
- return "\n".join(msg)
- if name=="type" and not self.types.has_key(value):
- msg = [ "Unrecognized type %s in line %d" % (value,self.lineno)]
- msg.append("REASON: Valid types are %s" % self.vtypes)
- return "\n".join(msg)
- if name=="shortcut":
- if (value <> "-1") and not re.match("^[A-Za-z0-9]$",value):
- msg = [ "Invalid shortcut char '%s' in line %d" % (value,self.lineno) ]
- msg.append("REASON: Valid values are [A-Za-z0-9]")
- return "\n".join(msg)
- elif value <> "-1": value = "'%s'" % value
- elif name in ["state","helpid","ipappend"]:
- try:
- value = int(value)
- except:
- return "Value of %s in line %d must be an integer" % (name,self.lineno)
- self.entry[name] = value
- self.entry["_updated"] = 1
- return ""
-
- def set_menu(self,name,value):
- if not self.menu.has_key(name):
- return "Error: Unknown keyword %s" % name
- self.menu[name] = value
- self.menu["_updated"] = 1
- return ""
-
- def set_system(self,name,value):
- if not self.system.has_key(name):
- return "Error: Unknown keyword %s" % name
- if name == "skipcondn":
- try: # is skipcondn a number?
- a = int(value)
- except: # it is a "-" delimited sequence
- value = value.lower()
- parts = [ self.shift_flags.get(x.strip(),None) for x in value.split("-") ]
- self.system["skipcondn"] = " | ".join(filter(None, parts))
- else:
- self.system[name] = value
-
- def set(self,name,value):
- # remove quotes if given
- if (value[0] == value[-1]) and (value[0] in ['"',"'"]): # remove quotes
- value = value[1:-1]
- if self.state == "system":
- err = self.set_system(name,value)
- if not err: return
- if self.state == "menu":
- err = self.set_menu(name,value)
- # change state to entry it menu returns error
- if err:
- err = None
- self.state = "item"
- if self.state == "item":
- err = self.set_item(name,value)
-
- if not err: return
-
- # all errors so return item's error message
- print err
- sys.exit(1)
-
- def print_entry(self,entry,fd):
- entry["type"] = self.types[entry["type"]]
- if entry["type"] == "login": #special type
- fd.write(self.templates["login"] % entry)
- else:
- fd.write(self.templates["item"] % entry)
-
- def print_menu(self,menu,fd):
- if menu["name"] == "main": self.foundmain = 1
- fd.write(self.templates["menu"] % menu)
- if (menu["row"] != "0xFF") or (menu["col"] != "0xFF"):
- fd.write(' set_menu_pos(%(row)s,%(col)s);\n' % menu)
-
-
- def output(self,filename):
- curr_template = None
- contents = []
- self.templates = {}
- regbeg = re.compile(r"^--(?P<name>[a-z]+) BEGINS?--\n$")
- regend = re.compile(r"^--[a-z]+ ENDS?--\n$")
- ifd = open(self.code_template_filename,"r")
- for line in ifd.readlines():
- b = regbeg.match(line)
- e = regend.match(line)
- if e: # end of template
- if curr_template:
- self.templates[curr_template] = "".join(contents)
- curr_template = None
- continue
- if b:
- curr_template = b.group("name")
- contents = []
- continue
- if not curr_template: continue # lines between templates are ignored
- contents.append(line)
- ifd.close()
-
- missing = None
- for x in self.reqd_templates:
- if not self.templates.has_key(x): missing = x
- if missing:
- print "Template %s required but not defined in %s" % (missing,self.code_template_filename)
-
- if filename == "-":
- fd = sys.stdout
- else: fd = open(filename,"w")
- self.foundmain = None
- fd.write(self.templates["header"])
- fd.write(self.templates["system"] % self.system)
- for (menu,items) in self.menus:
- self.print_menu(menu,fd)
- for entry in items: self.print_entry(entry,fd)
- fd.write(self.templates["footer"])
- fd.close()
- if not self.foundmain:
- print "main menu not found"
- print self.menus
- sys.exit(1)
-
- def input(self,filename):
- if filename == "-":
- fd = sys.stdin
- else: fd = open(filename,"r")
- self.lineno = 0
- self.state = "system"
- for line in fd.readlines():
- self.lineno = self.lineno + 1
- if line and line[-1] in ["\r","\n"]: line = line[:-1]
- if line and line[-1] in ["\r","\n"]: line = line[:-1]
- line = line.strip()
- if line and line[0] in ["#",";"]: continue
-
- try:
- # blank line -> starting a new entry
- if not line:
- if self.state == "item": self.add_item()
- continue
-
- # starting a new section?
- if line[0] == "[" and line[-1] == "]":
- self.state = "menu"
- self.add_menu(line[1:-1])
- continue
-
- # add property of current entry
- pos = line.find("=") # find the first = in string
- if pos < 0:
- print "Syntax error in line %d" % self.lineno
- print "REASON: non-section lines must be of the form ATTRIBUTE=VALUE"
- sys.exit(1)
- attr = line[:pos].strip().lower()
- value = line[pos+1:].strip()
- self.set(attr,value)
- except:
- print "Error while parsing line %d: %s" % (self.lineno,line)
- raise
- fd.close()
- self.add_item()
-
-def usage():
- print sys.argv[0]," [options]"
- print "--input=<file> is the name of the .menu file declaring the menu structure"
- print "--output=<file> is the name of generated C source"
- print "--template=<file> is the name of template to be used"
- print
- print "input and output default to - (stdin and stdout respectively)"
- print "template defaults to adv_menu.tpl"
- sys.exit(1)
-
-def main():
- tfile = "adv_menu.tpl"
- ifile = "-"
- ofile = "-"
- opts,args = getopt.getopt(sys.argv[1:], "hi:o:t:",["input=","output=","template=","help"])
- if args:
- print "Unknown options %s" % args
- usage()
- for o,a in opts:
- if o in ["-i","--input"]:
- ifile = a
- elif o in ["-o", "--output"]:
- ofile = a
- elif o in ["-t","--template"]:
- tfile = a
- elif o in ["-h","--help"]:
- usage()
-
- inst = Menusystem(tfile)
- inst.input(ifile)
- inst.output(ofile)
-
-if __name__ == "__main__":
- main()