build.py: revert setting LC_ALL=C due to IRC discussion
[vuplus_bitbake] / lib / bb / parse / parse_c / bitbakec.pyx
index 6bdad36..c666e9b 100644 (file)
@@ -13,91 +13,100 @@ cdef extern from "lexerc.h":
     ctypedef struct lex_t:
         void* parser
         void* scanner
+        char* name
         FILE* file
+        int config
         void* data
 
     int lineError
     int errorParse
 
-    cdef extern void parse(FILE*, object)
+    cdef extern int parse(FILE*, char*, object, int)
 
-def parsefile(object file, object data):
-    print "parsefile: 1", file, data
+def parsefile(object file, object data, object config):
+    #print "parsefile: 1", file, data
 
     # Open the file
     cdef FILE* f
 
     f = fopen(file, "r")
-    print "parsefile: 2 opening file"
+    #print "parsefile: 2 opening file"
     if (f == NULL):
         raise IOError("No such file %s." % file)
 
-    print "parsefile: 3 parse"
-    parse(f, data)
+    #print "parsefile: 3 parse"
+    parse(f, file, data, config)
 
     # Close the file
-    print "parsefile: 4 closing"
     fclose(f)
 
 
 cdef public void e_assign(lex_t* container, char* key, char* what):
-    print "e_assign", key, what
+    #print "e_assign", key, what
+    if what == NULL:
+        print "FUTURE Warning empty string: use \"\""
+        what = ""
+
     d = <object>container.data
     d.setVar(key, what)
 
 cdef public void e_export(lex_t* c, char* what):
-    print "e_export", what
+    #print "e_export", what
     #exp:
     # bb.data.setVarFlag(key, "export", 1, data)
     d = <object>c.data
     d.setVarFlag(what, "export", 1)
 
 cdef public void e_immediate(lex_t* c, char* key, char* what):
-    print "e_immediate", key, what
+    #print "e_immediate", key, what
     #colon:
     # val = bb.data.expand(groupd["value"], data)
     d = <object>c.data
-    d.setVar(key, d.expand(what,None))
+    d.setVar(key, d.expand(what,d))
 
 cdef public void e_cond(lex_t* c, char* key, char* what):
-    print "e_cond", key, what
+    #print "e_cond", key, what
     #ques:
     # val = bb.data.getVar(key, data)
     # if val == None:    
     #    val = groupd["value"]
+    if what == NULL:
+        print "FUTURE warning: Use \"\" for", key
+        what = ""
+
     d = <object>c.data
-    d.setVar(key, (d.getVar(key,0) or what))
+    d.setVar(key, (d.getVar(key,False) or what))
 
 cdef public void e_prepend(lex_t* c, char* key, char* what):
-    print "e_prepend", key, what
+    #print "e_prepend", key, what
     #prepend:
     # val = "%s %s" % (groupd["value"], (bb.data.getVar(key, data) or ""))
     d = <object>c.data
     d.setVar(key, what + " " + (d.getVar(key,0) or ""))
 
 cdef public void e_append(lex_t* c, char* key, char* what):
-    print "e_append", key, what
+    #print "e_append", key, what
     #append:
     # val = "%s %s" % ((bb.data.getVar(key, data) or ""), groupd["value"])
     d = <object>c.data
     d.setVar(key, (d.getVar(key,0) or "") + " " + what)
 
 cdef public void e_precat(lex_t* c, char* key, char* what):
-    print "e_precat", key, what
+    #print "e_precat", key, what
     #predot:
     # val = "%s%s" % (groupd["value"], (bb.data.getVar(key, data) or ""))
     d = <object>c.data
     d.setVar(key, what + (d.getVar(key,0) or ""))
 
 cdef public void e_postcat(lex_t* c, char* key, char* what):
-    print "e_postcat", key, what
+    #print "e_postcat", key, what
     #postdot:
     # val = "%s%s" % ((bb.data.getVar(key, data) or ""), groupd["value"])
     d = <object>c.data
     d.setVar(key, (d.getVar(key,0) or "") + what)
 
-cdef public void e_addtask(lex_t* c, char* name, char* before, char* after):
-    print "e_addtask", name
+cdef public int e_addtask(lex_t* c, char* name, char* before, char* after) except -1:
+    #print "e_addtask", name
     # func = m.group("func")
     # before = m.group("before")
     # after = m.group("after")
@@ -115,74 +124,130 @@ cdef public void e_addtask(lex_t* c, char* name, char* before, char* after):
     #     data.setVarFlag(var, "postdeps", before.split(), d)
     # return
 
-    do = "do_%s" % name
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No tasks allowed in config files")
+        return -1
+
     d = <object>c.data
+    do = "do_%s" % name
     d.setVarFlag(do, "task", 1)
 
     if before != NULL and strlen(before) > 0:
-        print "Before", before
+        #print "Before", before
         d.setVarFlag(do, "postdeps", ("%s" % before).split())
     if after  != NULL and strlen(after) > 0:
-        print "After", after
+        #print "After", after
         d.setVarFlag(do, "deps", ("%s" % after).split())
 
+    return 0
 
-cdef public void e_addhandler(lex_t* c, char* h):
-    print "e_addhandler", h
+cdef public int e_addhandler(lex_t* c, char* h) except -1:
+    #print "e_addhandler", h
     # data.setVarFlag(h, "handler", 1, d)
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No handlers allowed in config files")
+        return -1
+
     d = <object>c.data
     d.setVarFlag(h, "handler", 1)
+    return 0
+
+cdef public int e_export_func(lex_t* c, char* function) except -1:
+    #print "e_export_func", function
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No functions allowed in config files")
+        return -1
+
+    return 0
 
-cdef public void e_export_func(lex_t* c, char* function):
-    print "e_export_func", function
-    pass
+cdef public int e_inherit(lex_t* c, char* file) except -1:
+    #print "e_inherit", file
 
-cdef public void e_inherit(lex_t* c, char* file):
-    print "e_inherit", file
-    pass
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No inherits allowed in config files")
+        return -1
+
+    return 0
 
 cdef public void e_include(lex_t* c, char* file):
-    print "e_include", file
     from bb.parse import handle
     d = <object>c.data
 
     try:
-        handle(d.expand(file,None), d, True)
+        handle(d.expand(file,d), d, True)
     except IOError:
-        print "Could not include required file %s" % file
+        print "Could not include file", file
 
 
-cdef public void e_require(lex_t* c, char* file):
-    print "e_require", file
+cdef public int e_require(lex_t* c, char* file) except -1:
+    #print "e_require", file
+    from bb.parse import handle
     d = <object>c.data
-    d.expand(file)
 
     try:
-        parsefile(file, d)
+        handle(d.expand(file,d), d, True)
     except IOError:
-        raise CParseError("Could not include required file %s" % file)
+        print "ParseError", file
+        from bb.parse import ParseError
+        raise ParseError("Could not include required file %s" % file)
+        return -1
 
-cdef public void e_proc(lex_t* c, char* key, char* what):
-    print "e_proc", key, what
-    pass
+    return 0
+
+cdef public int e_proc(lex_t* c, char* key, char* what) except -1:
+    #print "e_proc", key, what
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No inherits allowed in config files")
+        return -1
+
+    return 0
+
+cdef public int e_proc_python(lex_t* c, char* key, char* what) except -1:
+    #print "e_proc_python"
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No pythin allowed in config files")
+        return -1
 
-cdef public void e_proc_python(lex_t* c, char* key, char* what):
-    print "e_proc_python"
     if key != NULL:
-        print "Key", key
+        pass
+        #print "Key", key
     if what != NULL:
-        print "What", what
-    pass
+        pass
+        #print "What", what
+
+    return 0
+
+cdef public int e_proc_fakeroot(lex_t* c, char* key, char* what) except -1:
+    #print "e_fakeroot", key, what
+
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No fakeroot allowed in config files")
+        return -1
+
+    return 0
+
+cdef public int e_def(lex_t* c, char* a, char* b, char* d) except -1:
+    #print "e_def", a, b, d
+
+    if c.config == 1:
+        from bb.parse import ParseError
+        raise ParseError("No defs allowed in config files")
+        return -1
+
+    return 0
 
-cdef public void e_proc_fakeroot(lex_t* c, char* key, char* what):
-    print "e_fakeroot", key, what
-    pass
+cdef public int e_parse_error(lex_t* c) except -1:
+    print "e_parse_error", c.name, "line:", lineError, "parse:", errorParse
 
-cdef public void e_def(lex_t* c, char* a, char* b, char* d):
-    print "e_def", a, b, d
-    pass
 
-cdef public void e_parse_error(lex_t* c):
-    print "e_parse_error", "line:", lineError, "parse:", errorParse
-    raise CParseError("There was an parse error, sorry unable to give more information at the current time.")
+    from bb.parse import ParseError
+    raise ParseError("There was an parse error, sorry unable to give more information at the current time. File: %s Line: %d" % (c.name,lineError) )
+    return -1