Ejemplo n.º 1
0
static int
write_action_functions(GenCodeInfo genCodeInfo, ABObj obj)
{
    File                codeFile = genCodeInfo->code_file;
    static char         msg[256],
           *s;
    AB_TRAVERSAL        trav;
    ABObj               action = NULL;
    ABObj               fromObj = NULL;	/* for error reports */
    int                 i = 0;

    /*
     * Auto-named functions
     */
    for (trav_open(&trav, obj, AB_TRAV_ACTIONS_FOR_OBJ | AB_TRAV_MOD_SAFE), i = 0;
            (action = trav_next(&trav)) != NULL; ++i)
    {
        if (   mfobj_has_flags(action, CGenFlagIsDuplicateDef)
                || mfobj_has_flags(action, CGenFlagWriteDefToProjFile))
        {
            continue;
        }

        if (action->info.action.auto_named)
        {
            abmfP_write_action_function(genCodeInfo, action);
            abio_puts(genCodeInfo->code_file, "\n");
        }
    }
    /* don't close traversal, yet */

    /*
     * User-named functions
     */
    for (trav_reset(&trav);
            (action = trav_next(&trav)) != NULL; ++i)
    {
        if (   mfobj_has_flags(action, CGenFlagIsDuplicateDef)
                || mfobj_has_flags(action, CGenFlagWriteDefToProjFile))
        {
            continue;
        }

        if (!(action->info.action.auto_named))
        {
            abmfP_write_action_function(genCodeInfo, action);
            abio_puts(genCodeInfo->code_file, "\n");
        }
    }
    trav_close(&trav);

    return OK;
}
Ejemplo n.º 2
0
/*
 * Traverse object list and write out callback decls, for those
 * connections with the proper value of auto_named.
 */
static int
write_user_or_auto_decls(
			GenCodeInfo genCodeInfo, 
			ABObj project, 
			BOOL auto_named)
{
    AB_TRAVERSAL        trav;
    ABObj               action = NULL;
    AB_ACTION_INFO     *actinfo = NULL;
    STRING              func_name = NULL;

    for (trav_open(&trav, project, AB_TRAV_ACTIONS);
	 (action = trav_next(&trav)) != NULL;)
    {
	/* If action is not a cross-module connection AND it
	 * is not a shared connection, continue.
	 */
	if ( !obj_is_cross_module(action) &&
	     ( mfobj_has_flags(action, CGenFlagIsDuplicateDef) ||
	       (!mfobj_has_flags(action, CGenFlagWriteDefToProjFile))
	     )
	   )
	{
	    continue;
	}

	actinfo = &(action->info.action);
	func_name = abmfP_get_action_name(action);
	if (!util_xor(actinfo->auto_named, auto_named))
	{
	    abmfP_write_action_func_decl(genCodeInfo, action);
	    abio_puts(genCodeInfo->code_file, nlstr);
	}
    }
    trav_close(&trav);
    return 0;
}
Ejemplo n.º 3
0
/*
 * Write the project.c file.
 */
int
abmfP_write_project_c_file(
			   GenCodeInfo genCodeInfo,
			   STRING codeFileName,
			   BOOL prepareForMerge,
			   ABObj project
)
{
    File                codeFile = genCodeInfo->code_file;
    STRING              errmsg = NULL;
    STRING             *p = NULL;
    ABObj               win_obj = NULL;
    ABObj               obj = NULL;
    ABObj               action = NULL;
    AB_ACTION_INFO     *action_info = NULL;
    AB_TRAVERSAL        trav;
    ABObj		module = NULL;
    int			numFuncsWritten = 0;
    char		projectName[1024];
    *projectName = 0;

    /*
     * Write file header.
     */
    abmfP_write_user_header_seg(genCodeInfo);
    abio_puts(codeFile, nlstr);

    sprintf(projectName, "project %s", obj_get_name(project));
    abmfP_write_file_header(
		genCodeInfo, 
		codeFileName, 
		FALSE,
		projectName,
		util_get_program_name(), 
		ABMF_MODIFY_USER_SEGS,
	   " * Contains: main() and cross-module connections"
		);

    /*
     * Write includes.
     */
    write_includes(genCodeInfo, project);

    /*
     * Write user segment
     */
    abmfP_write_user_file_top_seg(genCodeInfo);
   
    /* i18n variable declarations */
    if (genCodeInfo->i18n_method == ABMF_I18N_XPG4_API)
        write_i18n_var_declrs(genCodeInfo, project);

    write_option_desc_list(genCodeInfo, project);
    write_app_resources(genCodeInfo, project);
    write_app_resource_var(genCodeInfo, project);

    /*
     * Write main().
     */
    write_main(genCodeInfo, project);

    /*
     * Write callback funcs.
     */
    numFuncsWritten = 0;
    for (trav_open(&trav, project, AB_TRAV_ACTIONS);
	 (action = trav_next(&trav)) != NULL;)
    {
	action_info = &(action->info.action);

	/* If the function name for the action is not NULL AND
	 * the action is a cross-module connection OR the action
	 * is a shared connection, then write it out.
	 */
	if ( 	(abmfP_get_action_name(action) != NULL) && 
		(   obj_is_cross_module(action) || 
		    ( (!mfobj_has_flags(action, CGenFlagIsDuplicateDef))
	              && (mfobj_has_flags(action, CGenFlagWriteDefToProjFile))
	              && (obj_get_func_type(action) == AB_FUNC_USER_DEF)
		    )
		)
	   )

	{
	    ++numFuncsWritten;
	    abmfP_write_action_function(genCodeInfo, action);
	}
    }
    trav_close(&trav);

    if (numFuncsWritten > 0)
    {
	abio_puts(codeFile, nlstr);
    }
    abmfP_write_user_file_bottom_seg(genCodeInfo);

    return OK;
}