aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'filetypes/ctypefiles.py')
-rw-r--r--filetypes/ctypefiles.py183
1 files changed, 183 insertions, 0 deletions
diff --git a/filetypes/ctypefiles.py b/filetypes/ctypefiles.py
new file mode 100644
index 0000000..97e8561
--- /dev/null
+++ b/filetypes/ctypefiles.py
@@ -0,0 +1,183 @@
+import glob
+from ply import lex
+from ply import yacc
+
+#lex stuff begins here
+
+def scanincludes(string,inclst,curdir):
+ tokens = (
+ "GINCLUDE",
+ "LINCLUDE",
+ "BUNDLEINC",
+ "IFDEF",
+ "ENDIF",
+ )
+
+ states = (
+ ("com","exclusive"), #comment
+ ("ifdef","inclusive"),
+ )
+
+ t_ANY_ignore = " \t"
+
+ def t_begin_com(t):
+ r"/\*"
+ t.lexer.push_state("com")
+
+ def t_com_end(t):
+ r"\*/"
+ t.lexer.pop_state()
+ pass
+
+ def t_line_com(t):
+ r"//.*"
+ pass
+
+ def t_ANY_begin_if0(t):
+ r"\#if[ \t]+0"
+ t.lexer.push_state("com")
+
+ def t_com_endif(t):
+ r"\#endif"
+ t.lexer.pop_state()
+ pass
+
+ def t_com_ifdef(t):
+ r"\#ifdef"
+ t.lexer.push_state("com")
+
+ def t_IFDEF(t):
+ r"\#ifdef[ \t]+[a-zA-Z_][a-zA-Z0-9_]*"
+ t.value = t.value[6:].strip() #return the ifdef name
+ t.lexer.push_state("ifdef")
+ return t
+
+ def t_ifdef_ENDIF(t):
+ r"\#endif"
+ t.lexer.pop_state()
+ return t
+
+ def t_GINCLUDE(t):
+ r"\#[Ii][Nn][Cc][Ll][Uu][Dd][Ee][ \t]+<.*\.h>"
+ t.value = t.value[8:].strip().strip("<>")
+ return t
+
+ def t_LINCLUDE(t):
+ r"\#[Ii][Nn][Cc][Ll][Uu][Dd][Ee][ \t]+\".*\.h\""
+ t.value = t.value[8:].strip().strip('""')
+ return t
+
+ def t_BUNDLEINC(t):
+ r"\#[Ii][Nn][Cc][Ll][Uu][Dd][Ee][ \t]+<.*>"
+ pass
+
+ def t_ANY_error(t):
+ #print("Illegal character '%s'" % t.value[0])
+ t.lexer.skip(1)
+
+ lexer = lex.lex()
+
+ #lexer.input(string)
+ #
+ #for tok in lexer:
+ # print(tok)
+ #
+ #YACC stuff here
+
+ def p_includes2(p):
+ """
+ includes : includes ginc
+ """
+ p[1][0].add(p[2])
+ p[0] = p[1]
+
+ def p_lincludes(p):
+ """
+ includes : includes linc
+ """
+ if islocalinc(p[2],curdir):
+ p[1][1].add(p[2])
+ else:
+ p[1][0].add(p[2])
+ p[0] = p[1]
+
+ def p_ifdef(p):
+ """
+ includes : includes IFDEF includes ENDIF
+ | IFDEF includes ENDIF
+ """
+ if len(p) == 5:
+ p[1][2] = addnewifdefs(p[1][2],{p[2] : p[3]})
+ p[0] = p[1]
+ else:
+ ifdef = {}
+ ifdef[p[1]] = p[2]
+ p[0] = [set(),set(),ifdef]
+
+ def p_ginc(p):
+ "includes : ginc"
+ globinc = set()
+ globinc.add(p[1])
+ p[0] = [globinc,set(),{}]
+
+ def p_linc(p):
+ "includes : linc"
+ locinc = set()
+ locinc.add(p[1])
+ if islocalinc(p[1], curdir):
+ p[0] = [set(),locinc,{}]
+ else:
+ p[0] = [locinc,set(),{}]
+
+ def p_ginclude(p):
+ "ginc : GINCLUDE"
+ p[0] = p[1]
+
+ def p_linclude(p):
+ "linc : LINCLUDE"
+ p[0] = p[1]
+
+ def p_error(p):
+ #print("syntax error at '%s'" % p.type)
+ pass
+
+ yacc.yacc()
+
+ newinclst = yacc.parse(string)
+ if newinclst == None:
+ #Check if the file didn't have any includes
+ return(inclst)
+ newinclst = addnewincludes(newinclst,inclst)
+ return(newinclst)
+
+def islocalinc(inc, curdir):
+ print(inc)
+ if glob.glob(curdir + inc) == []:
+ return False
+ else:
+ return True
+
+
+def addnewincludes(inclist1,inclist2):
+ #come up with better names!!
+ inclist1[0] = inclist1[0] | inclist2[0]
+ inclist1[1] = inclist1[1] | inclist2[1]
+ inclist1[2] = addnewifdefs(inclist1[2],inclist2[2])
+ return(inclist1)
+
+def addnewifdefs(dict1,dict2):
+ if dict1 == {} and dict2 == {}:
+ #we are done here
+ return(dict())
+ dups = dict1.keys() & dict2.keys()
+ if dups == set():
+ #no duplicates, empty set()
+ for name in dict2:
+ dict1[name] = dict2[name]
+ return(dict1)
+
+ for name in dups:
+ dict1[name][0] = dict1[name][0] | dict2[name][0]
+ dict1[name][1] = dict1[name][1] | dict2[name][1]
+ dict1[name][2] = addnewifdefs(dict1[name][2],dict2[name][2])
+ return(dict1)