aboutsummaryrefslogtreecommitdiffstats
path: root/menu/menugen.py
diff options
context:
space:
mode:
Diffstat (limited to 'menu/menugen.py')
-rw-r--r--menu/menugen.py241
1 files changed, 241 insertions, 0 deletions
diff --git a/menu/menugen.py b/menu/menugen.py
new file mode 100644
index 00000000..a868d2a3
--- /dev/null
+++ b/menu/menugen.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python
+
+import sys, string
+
+TEMPLATE_HEADER="""
+/* -*- c -*- ------------------------------------------------------------- *
+ *
+ * Copyright 2004-2005 Murali Krishnan Ganapathy - All Rights Reserved
+ *
+ * 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, Inc., 53 Temple Place Ste 330,
+ * Boston MA 02111-1307, USA; either version 2 of the License, or
+ * (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+#ifndef NULL
+#define NULL ((void *) 0)
+#endif
+
+#include "menu.h"
+#include "com32io.h"
+#include <string.h>
+
+int main(void)
+{
+ t_menuitem * curr;
+
+ // Change the video mode here
+ // setvideomode(0)
+
+ // Set the title and window size
+
+"""
+
+
+TEMPLATE_FOOTER="""
+ curr = showmenus(find_menu_num("main")); // Initial menu is the one called "main"
+
+ if (curr)
+ {
+ if (curr->action == OPT_RUN)
+ {
+ if (issyslinux()) runsyslinuxcmd(curr->data);
+ else csprint(curr->data,0x07);
+ return 1;
+ }
+ csprint("Error in programming!",0x07);
+ }
+ return 0;
+}
+"""
+
+class Menusystem:
+ def __init__(self):
+ self.menus = []
+ self.types = {"run" : "OPT_RUN","exitmenu":"OPT_EXITMENU","submenu":"OPT_SUBMENU"}
+ self.init_entry()
+ self.init_menu()
+ self.init_system()
+ self.vtypes = string.join(self.types.keys()," OR ")
+ self.vattrs = string.join(filter(lambda x: x[0] != "_", self.entry.keys())," OR ")
+ self.mattrs = string.join(filter(lambda x: x[0] != "_", self.menu.keys())," OR ")
+ self.itemtemplate = ' add_item("%(item)s","%(info)s",%(type)s,"%(data)s",0);\n'
+ self.menutemplate = '\n add_named_menu("%(name)s","%(title)s",-1);\n'
+ self.systemplate = '\n init_menusystem(%(title)s);\n set_window_size(%(top)s,%(left)s,%(bot)s,%(right)s);\n'
+
+ def init_entry(self):
+ self.entry = { "item" : "",
+ "info" : "",
+ "data" : "",
+ "_updated" : None, # has this dictionary been updated
+ "type" : "run" }
+
+ def init_menu(self):
+ self.menu = {"title" : "",
+ "row" : "0xFF", # let system decide position
+ "col" : "0xFF",
+ "_updated" : None,
+ "name" : "" }
+
+ def init_system(self):
+ self.system = { "title" : "",
+ "top" : "1", "left" : "1" , "bot" : "23", "right":"79" }
+
+ 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()
+
+ # remove quotes if reqd
+ def rm_quote(self,str):
+ str = str .strip()
+ if (str[0] == str[-1]) and (str[0] in ['"',"'"]): # remove quotes
+ str = str[1:-1]
+ return str
+
+ 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 string.join(msg,"\n")
+ 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 string.join(msg,"\n")
+ self.entry[name] = self.rm_quote(value)
+ self.entry["_updated"] = 1
+ return ""
+
+ def set_menu(self,name,value):
+ # no current menu yet. We are probably in global section
+ if not self.menus: return "Error"
+ if not self.menu.has_key(name):
+ return "Error"
+ self.menu[name] = self.rm_quote(value)
+ self.menu["_updated"] = 1
+ return ""
+
+ def set_system(self,name,value):
+ if not self.system.has_key(name):
+ return "Error"
+ self.system[name] = self.rm_quote(value)
+
+ def set(self,name,value):
+ msg = self.set_item(name,value)
+ # if valid item attrbute done
+ if not msg: return
+
+ # check if attr is of menu
+ err = self.set_menu(name,value)
+ if not err: return
+
+ # check if global attribute
+ err = self.set_system(name,value)
+ if not err: return
+
+ # all errors so return item's error message
+ print msg
+ sys.exit(1)
+
+ def print_entry(self,entry,fd):
+ entry["type"] = self.types[entry["type"]]
+ fd.write(self.itemtemplate % entry)
+
+ def print_menu(self,menu,fd):
+ if menu["name"] == "main": self.foundmain = 1
+ fd.write(self.menutemplate % menu)
+ if (menu["row"] != "0xFF") or (menu["col"] != "0xFF"):
+ fd.write(' set_menu_pos(%(row)s,%(col)s);\n' % menu)
+
+ # parts of C code which set attrs for entire menu system
+ def print_system(self,fd):
+ if self.system["title"]:
+ self.system["title"] = '"%s"' % self.system["title"]
+ else: self.system["title"] = "NULL"
+ fd.write(self.systemplate % self.system)
+
+ def output(self,filename):
+ fd = open(filename,"w")
+ self.foundmain = None
+ fd.write(TEMPLATE_HEADER)
+ self.print_system(fd)
+ for (menu,items) in self.menus:
+ self.print_menu(menu,fd)
+ for entry in items: self.print_entry(entry,fd)
+ fd.write(TEMPLATE_FOOTER)
+ fd.close()
+ if not self.foundmain:
+ print "main menu not found"
+ sys.exit(1)
+
+ def input(self,filename):
+ fd = open(filename,"r")
+ self.lineno = 0
+ 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]
+ if line and line[0] in ["#",";"]: continue
+
+ try:
+ # blank line -> starting a new entry
+ if not line:
+ self.add_item()
+ continue
+
+ # starting a new section?
+ if line[0] == "[" and line[-1] == "]":
+ 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]," inputfile outputfile"
+ print "inputfile is the ini-like file declaring menu structure"
+ print "outputfile is the C source which can be compiled"
+ sys.exit(1)
+
+def main():
+ if len(sys.argv) <> 3: usage()
+ inst = Menusystem()
+ inst.input(sys.argv[1])
+ inst.output(sys.argv[2])
+
+if __name__ == "__main__":
+ main()
+
+