diff --git a/compiler/compiler.py b/compiler/compiler.py index 7a120f7..4e66d1a 100644 --- a/compiler/compiler.py +++ b/compiler/compiler.py @@ -7,26 +7,21 @@ def __type_to_minerva(t): r = "__minerva_" - if t[0][0] != None: - r += t[0][0] + "_" - - r += '_'.join(t[0][1].split()) - - if t[1] == True: - r += "_ptr" + while t[0] is not None: + r += t[0] + "_" + t = t[1] + r += t[1] + r = r.replace("*","ptr") return r + "_t" def __type_to_str(t): r = "" - if t[0][0] != None: - r += t[0][0] + " " - - r += t[0][1] - - if t[1] == True: - r += " *" + while t[0] is not None: + r += t[0] + " " + t = t[1] + r += t[1] return r @@ -40,7 +35,7 @@ def __compile_type_enum(types): def __compile_type_name(types): r = "const char *minerva_type_name[] = {\n" - r += ",\n".join(map(lambda x: "\t\""+x[0][1]+"\"", types)) + r += ",\n".join(map(lambda x: "\t\""+__type_to_str(x)+"\"", types)) r += "\n};\n" return r @@ -52,25 +47,27 @@ def __compile_wrapper(funcs): for f in funcs: r = "int\n" r += "__minerva_wrap_call_"+f[2]+"(minerva_var_t *new, minerva_var_t **vars) {\n" - for i, a in enumerate(f[3]): + #skipping void args + args = [ elem for elem in f[3] if elem[0][1] != "void" ] + + for i, a in enumerate(args): a = a[0] r += "\t"+__type_to_str(a)+" "+"__arg"+str(i)+" = " - if a[1] == True: + if '*' in __type_to_str(a): r += "("+__type_to_str(a)+")vars["+str(i)+"]->val;\n" else: r += "*("+__type_to_str(a)+"*)vars["+str(i)+"]->val;\n" - - if f[1][0][1] == 'void' and f[1][1] == 0: - r += "\t"+f[2]+"("+",".join(["__arg"+str(i) for i in range(len(f[3]))])+");" + if f[1][1] == 'void': + r += "\t"+f[2]+"("+",".join(["__arg"+str(i) for i in range(len(args))])+");" else: - if f[1][1] == True: + if '*' in f[1][1]: r += "\tnew->val = " + \ - f[2]+"("+",".join(["__arg"+str(i) for i in range(len(f[3]))])+");" + f[2]+"("+",".join(["__arg"+str(i) for i in range(len(args))])+");" else: r += "\tnew->val = xcalloc(1,sizeof("+__type_to_str(f[1])+"));\n" r += "\tnew->flags |= F_VAR_ALLOC;\n" r += "\t*(("+__type_to_str(f[1])+"*)new->val) = ("+__type_to_str(f[1])+")"+\ - f[2]+"("+",".join(["__arg"+str(i) for i in range(len(f[3]))])+");" + f[2]+"("+",".join(["__arg"+str(i) for i in range(len(args))])+");" r += "\n\treturn 1;\n}\n\n" c.append(r) diff --git a/compiler/parser.py b/compiler/parser.py index 00337f3..c35f059 100644 --- a/compiler/parser.py +++ b/compiler/parser.py @@ -8,7 +8,7 @@ tokens = ( 'LCHEVRON', 'RCHEVRON', 'LBRACKET', 'RBRACKET', - 'STRUCT', 'PTR', 'UNION', + 'STRUCT', 'PTR', 'UNION','STANDARDTYPE', 'TYPE_QUALIFIER', 'COMMA', 'SEPARATOR', 'COMMENT', 'STRING', 'MIINCLUDE', 'INCLUDE', 'INCLUDEFILE', 'INCLUDEFILELOCAL', 'ARROW' ) @@ -17,8 +17,9 @@ def t_newline(t): r'\n+' t.lexer.lineno += t.value.count("\n") -def t_UNION(t): r'union'; return t -def t_STRUCT(t): r'struct'; return t +def t_UNION(t): r'\bunion\b'; return t +def t_STRUCT(t): r'\bstruct\b'; return t +def t_TYPE_QUALIFIER(t): r'\bconst\b'; return t; #skipped volatile t_LCHEVRON = r'\{' t_RCHEVRON = r'\}' t_LBRACKET = r'\(' @@ -28,7 +29,8 @@ def t_STRUCT(t): r'struct'; return t t_PTR = r'\*' t_ARROW = r'\=\>' t_COMMENT = r'--[^\n]*' -t_STRING = r'((const|unsigned|signed|long|short|struct|restrict)[ ]+)*[a-zA-Z][a-zA-Z0-9_\-\.\/]*' +t_STRING = r'[a-zA-Z][a-zA-Z0-9_\-\.\/]*' +t_STANDARDTYPE = r'\b(void|char|short|int|long|float|double|signed|unsigned)\b' t_MIINCLUDE = r'%include' t_INCLUDE = r'\#include' t_INCLUDEFILE = r'<'+t_STRING+r'>' @@ -126,25 +128,62 @@ def p_var_arg_flags(t): t[0] = [t[1]] + t[0] - def p_type(t): - '''type : type_basic PTR - | type_basic''' + '''type : type_list + | user_definied_type''' + if len(t) == 2: + t[0] = t[1] + else: + t[0] = (t[1],t[2]) + +def p_user_definied_type(t): + '''user_definied_type : TYPE_QUALIFIER STRING ptr_list + | UNION STRING ptr_list + | STRUCT STRING ptr_list + | struct_things + | STRING ptr_list''' + # I dont like it... + if len(t) == 4: + t[0] = (t[1],(t[2],t[3])) + elif len(t) == 3: + t[0] = (t[1],t[2]) + else: + t[0] = t[1] +def p_struct_things(t): + '''struct_things : TYPE_QUALIFIER STRING + | STRUCT STRING + | UNION STRING + | STRING''' + if len(t) == 2 : + t[0] = (None,t[1]) + else: + t[0] = (t[1],(None,t[2])) + +def p_ptr_list(t): + '''ptr_list : PTR ptr_list + | PTR''' if len(t) == 2: - t[0] = (t[1], False) + t[0] = (None,t[1]) else: - t[0] = (t[1], True) + t[0] = (t[1],t[2]) + +def p_type_list(t): + '''type_list : basic_type + | basic_type type_list''' -def p_type_basic(t): - '''type_basic : STRUCT STRING - | UNION STRING - | STRING''' if len(t) == 2: t[0] = (None, t[1]) else: t[0] = (t[1], t[2]) +def p_basic_type(t): + '''basic_type : TYPE_QUALIFIER + | STANDARDTYPE + | PTR''' + #skipped storage_class_specifier (auto,register,static, extern, typedef) + t[0] = t[1] + def p_empty(p): 'empty :' pass diff --git a/target/libressl/asn1.mi b/target/libressl/asn1.mi index 6146ba6..903954d 100644 --- a/target/libressl/asn1.mi +++ b/target/libressl/asn1.mi @@ -1,3 +1,4 @@ +#include #include ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf) => generic_void; @@ -17,3 +18,4 @@ int ASN1_STRING_to_UTF8(char *out, ASN1_STRING *in) => generic_not_zero; int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, long flags) => generic_not_zero; int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, long flags) => generic_not_zero; int ASN1_STRING_print(BIO *out, ASN1_STRING *str) => generic_not_zero; + diff --git a/target/lm/lm.mi b/target/lm/lm.mi index 7bf7e16..dc0c1a1 100644 --- a/target/lm/lm.mi +++ b/target/lm/lm.mi @@ -49,7 +49,7 @@ double fmod(double, double) => generic_success; double j0(double) => generic_success; double j1(double) => generic_success; --- double jn(int, double) => generic_success; + double jn(int, double) => generic_success; double y0(double) => generic_success; double y1(double) => generic_success; double yn(int, double) => generic_success; @@ -68,7 +68,6 @@ double trunc(double) => generic_success; double drem(double, double) => generic_success; int finite(double) => generic_success; int isnanf(float) => generic_success; -double gamma_r(double, int *) => generic_success; double lgamma_r(double, int *) => generic_success; double significand(double) => generic_success; float acosf(float) => generic_success; @@ -112,8 +111,8 @@ float atanhf(float) => generic_success; float cbrtf(float) => generic_success; float logbf(float) => generic_success; float copysignf(float, float) => generic_success; ---long long llrintf(float) => generic_success; ---long long llroundf(float) => generic_success; +long long llrintf(float) => generic_success; +long long llroundf(float) => generic_success; long lrintf(float) => generic_success; long lroundf(float) => generic_success; float nanf(char *) => generic_success; @@ -134,73 +133,71 @@ int finitef(float) => generic_success; float gammaf(float) => generic_success; float j0f(float) => generic_success; float j1f(float) => generic_success; --- float jnf(int, float) => generic_success; + float jnf(int, float) => generic_success; float scalbf(float, float) => generic_success; float y0f(float) => generic_success; float y1f(float) => generic_success; float ynf(int, float) => generic_success; -float gammaf_r(float, int *) => generic_success; float lgammaf_r(float, int *) => generic_success; float significandf(float) => generic_success; --- long double acoshl(long double) => generic_success; --- long double acosl(long double) => generic_success; --- long double asinhl(long double) => generic_success; --- long double asinl(long double) => generic_success; --- long double atan2l(long double, long double) => generic_success; --- long double atanhl(long double) => generic_success; --- long double atanl(long double) => generic_success; --- long double cbrtl(long double) => generic_success; --- long double ceill(long double) => generic_success; --- long double copysignl(long double, long double) => generic_success; --- long double coshl(long double) => generic_success; --- long double cosl(long double) => generic_success; --- long double erfcl(long double) => generic_success; --- long double erfl(long double) => generic_success; --- long double exp2l(long double) => generic_success; --- long double expl(long double) => generic_success; --- long double expm1l(long double) => generic_success; --- long double fabsl(long double) => generic_success; --- long double fdiml(long double, long double) => generic_success; --- long double floorl(long double) => generic_success; --- long double fmal(long double, long double, long double) => generic_success; --- long double fmaxl(long double, long double) => generic_success; --- long double fminl(long double, long double) => generic_success; --- long double fmodl(long double, long double) => generic_success; --- long double frexpl(long double value, int *) => generic_success; --- long double hypotl(long double, long double) => generic_success; +long double acoshl(long double) => generic_success; + long double acosl(long double) => generic_success; + long double asinhl(long double) => generic_success; + long double asinl(long double) => generic_success; + long double atan2l(long double, long double) => generic_success; + long double atanhl(long double) => generic_success; + long double atanl(long double) => generic_success; + long double cbrtl(long double) => generic_success; + long double ceill(long double) => generic_success; + long double copysignl(long double, long double) => generic_success; + long double coshl(long double) => generic_success; + long double cosl(long double) => generic_success; + long double erfcl(long double) => generic_success; + long double erfl(long double) => generic_success; + long double exp2l(long double) => generic_success; + long double expl(long double) => generic_success; + long double expm1l(long double) => generic_success; + long double fabsl(long double) => generic_success; + long double fdiml(long double, long double) => generic_success; + long double floorl(long double) => generic_success; + long double fmal(long double, long double, long double) => generic_success; + long double fmaxl(long double, long double) => generic_success; + long double fminl(long double, long double) => generic_success; + long double fmodl(long double, long double) => generic_success; + long double frexpl(long double value, int *) => generic_success; + long double hypotl(long double, long double) => generic_success; int ilogbl(long double) => generic_success; --- long double ldexpl(long double, int) => generic_success; --- long double lgammal(long double) => generic_success; --- long long llrintl(long double) => generic_success; --- long long llroundl(long double) => generic_success; --- long double log10l(long double) => generic_success; --- long double log1pl(long double) => generic_success; --- long double log2l(long double) => generic_success; --- long double logbl(long double) => generic_success; --- long double logl(long double) => generic_success; + long double ldexpl(long double, int) => generic_success; + long double lgammal(long double) => generic_success; + long long llrintl(long double) => generic_success; + long long llroundl(long double) => generic_success; + long double log10l(long double) => generic_success; + long double log1pl(long double) => generic_success; + long double log2l(long double) => generic_success; + long double logbl(long double) => generic_success; + long double logl(long double) => generic_success; long lrintl(long double) => generic_success; long lroundl(long double) => generic_success; --- long double modfl(long double, long double *) => generic_success; --- long double nanl(const char *) => generic_success; --- long double nearbyintl(long double) => generic_success; --- long double nextafterl(long double, long double) => generic_success; + long double modfl(long double, long double *) => generic_success; + long double nanl( const char *) => generic_success; + long double nearbyintl(long double) => generic_success; + long double nextafterl(long double, long double) => generic_success; double nexttoward(double, long double) => generic_success; float nexttowardf(float, long double) => generic_success; --- long double nexttowardl(long double, long double) => generic_success; --- long double powl(long double, long double) => generic_success; --- long double remainderl(long double, long double) => generic_success; --- long double remquol(long double, long double, int *) => generic_success; --- long double rintl(long double) => generic_success; --- long double roundl(long double) => generic_success; --- long double scalblnl(long double, long) => generic_success; --- long double scalbnl(long double, int) => generic_success; --- long double sinhl(long double) => generic_success; --- long double sinl(long double) => generic_success; --- long double sqrtl(long double) => generic_success; --- long double tanhl(long double) => generic_success; --- long double tanl(long double) => generic_success; --- long double tgammal(long double) => generic_success; --- long double truncl(long double) => generic_success; - + long double nexttowardl(long double, long double) => generic_success; + long double powl(long double, long double) => generic_success; + long double remainderl(long double, long double) => generic_success; + long double remquol(long double, long double, int *) => generic_success; + long double rintl(long double) => generic_success; + long double roundl(long double) => generic_success; + long double scalblnl(long double, long) => generic_success; + long double scalbnl(long double, int) => generic_success; + long double sinhl(long double) => generic_success; + long double sinl(long double) => generic_success; + long double sqrtl(long double) => generic_success; + long double tanhl(long double) => generic_success; + long double tanl(long double) => generic_success; + long double tgammal(long double) => generic_success; + long double truncl(long double) => generic_success;