예제 #1
0
파일: pasm.c 프로젝트: neutered/propgcc
static void
PrintGasConstantDecl(FILE *f, AST *ast, int inlineAsm)
{
    startLine(f, inlineAsm);
    fprintf(f, "\t\t.equ\t%s, ", ast->d.string);
    PrintInteger(f, EvalConstExpr(ast));
    endLine(f, inlineAsm);
}
예제 #2
0
/*
 * print constant declarations
 */
static void
PrintConstant(FILE *f, AST *ast)
{
    if (IsFloatConst(ast)) {
        PrintFloat(f, EvalConstExpr(ast));
        return;
    }
    PrintExpr(f, ast);
}
예제 #3
0
static void
PrintCppHeaderFile(FILE *f, ParserState *parse)
{
    AST *ast;
    int flags = PRIVATE;

    /* things we always need */
    if (gl_header) {
        fprintf(f, "%s", gl_header);
    }
    fprintf(f, "#ifndef %s_Class_Defined__\n", parse->classname);
    fprintf(f, "#define %s_Class_Defined__\n\n", parse->classname);

    fprintf(f, "#include <stdint.h>\n");

    /* include any needed object headers */
    PrintSubHeaders(f, parse);

    /* print the constant declarations */
    fprintf(f, "class %s {\npublic:\n", parse->classname);

    PrintAllConstants(f, parse);

    /* object references */
    for (ast = parse->objblock; ast; ast = ast->right) {
        ParserState *P = ast->d.ptr;
        AST *objdef = ast->left;
        if (objdef->kind == AST_IDENTIFIER) {
            fprintf(f, "  %s\t%s;\n", P->classname, objdef->d.string);
        } else if (objdef->kind == AST_ARRAYDECL) {
            AST *arrname = objdef->left;
            AST *arrsize = objdef->right;
            if (arrname->kind == AST_IDENTIFIER) {
                fprintf(f, "  %s\t%s[%d];\n", P->classname,
                        arrname->d.string,
                        EvalConstExpr(arrsize)
                    );
            } else {
                ERROR(objdef, "internal error in object printing");
            }
        }
    }
    /* data block, if applicable */
    if (parse->datblock && !gl_gas_dat) {
        fprintf(f, "  static ");
        PrintDatArray(f, parse, ";\n", false);
    }
    /* now the public members */
    PrintPublicFunctionDecls(f, parse);

    /* now the private members */
    /* Note that Spin sorts these, outputing first the 32 bit
       vars, then 16, finally 8
    */
    if (parse->volatileVariables)
        flags |= VOLATILE;
    fprintf(f, "private:\n");
    PrintAllVarListsOfType(f, parse, ast_type_long, flags);
    PrintAllVarListsOfType(f, parse, ast_type_word, flags);
    PrintAllVarListsOfType(f, parse, ast_type_byte, flags);

    /* now the private methods */
    PrintPrivateFunctionDecls(f, parse);
    fprintf(f, "};\n\n");
    fprintf(f, "#endif\n");
}
예제 #4
0
static void
PrintCHeaderFile(FILE *f, ParserState *parse)
{
    int n;
    AST *ast;
    int flags = PRIVATE;

    /* things we always need */
    if (gl_header) {
        fprintf(f, "%s", gl_header);
    }
    fprintf(f, "#ifndef %s_Class_Defined__\n", parse->classname);
    fprintf(f, "#define %s_Class_Defined__\n\n", parse->classname);

    fprintf(f, "#include <stdint.h>\n");

    PrintSubHeaders(f, parse);
    PrintAllConstants(f, parse);

    if (parse->volatileVariables)
        flags |= VOLATILE;

    /* print the structure definition */
    fprintf(f, "\ntypedef struct %s {\n", parse->classname);
    n = PrintAllVarListsOfType(f, parse, ast_type_long, flags);
    n += PrintAllVarListsOfType(f, parse, ast_type_word, flags);
    n += PrintAllVarListsOfType(f, parse, ast_type_byte, flags);

    /* object references */
    for (ast = parse->objblock; ast; ast = ast->right) {
        ParserState *P = ast->d.ptr;
        AST *objdef = ast->left;
        if (objdef->kind == AST_IDENTIFIER) {
            fprintf(f, "  %s\t%s;\n", P->classname, objdef->d.string);
            n++;
        } else if (objdef->kind == AST_ARRAYDECL) {
            AST *arrname = objdef->left;
            AST *arrsize = objdef->right;
            if (arrname->kind == AST_IDENTIFIER) {
                fprintf(f, "  %s\t%s[%d];\n", P->classname,
                        arrname->d.string,
                        EvalConstExpr(arrsize)
                    );
                n++;
            } else {
                ERROR(objdef, "internal error in object printing");
            }
        }
    }

    /* needed to avoid problems with empty structures on Catalina */
    if (n == 0)
        fprintf(f, "  char dummy__;\n");
    fprintf(f, "} %s;\n\n", parse->classname);

    /* now the public members */
    PrintPublicFunctionDecls(f, parse);

    /* now the private methods */
    /* PrintPrivateFunctionDecls(f, parse); */

    fprintf(f, "#endif\n");
}