1196 lines
33 KiB
C
1196 lines
33 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
/*
|
|
* $XConsortium: create_decls.c /main/3 1995/11/06 18:03:55 rswiston $
|
|
*
|
|
* @(#)create_defs.c 1.20 16 Feb 1994 cde_app_builder/src/abmf
|
|
*
|
|
* RESTRICTED CONFIDENTIAL INFORMATION:
|
|
*
|
|
* The information in this document is subject to special
|
|
* restrictions in a confidential disclosure agreement between
|
|
* HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
|
|
* document outside HP, IBM, Sun, USL, SCO, or Univel without
|
|
* Sun's specific written approval. This document and all copies
|
|
* and derivative works thereof must be returned or destroyed at
|
|
* Sun's request.
|
|
*
|
|
* Copyright 1993 Sun Microsystems, Inc. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
|
|
/*
|
|
* create_decls.c - write out local variable definitions for
|
|
* create procs.
|
|
*
|
|
* Note: This file actually writes definitions, not declarations:
|
|
*
|
|
* A declaration does not actually "create" a variable. E.g.:
|
|
*
|
|
* extern int x;
|
|
*
|
|
* A definition does "create" the variable. E.g.:
|
|
*
|
|
* int x;
|
|
*
|
|
*
|
|
* This file is used to write out the *definitions*.
|
|
*/
|
|
|
|
#include <ab_private/abio.h>
|
|
#include <ab_private/objxm.h>
|
|
#include "obj_namesP.h"
|
|
#include "write_codeP.h"
|
|
#include "write_cP.h"
|
|
#include "utilsP.h"
|
|
#include "argsP.h"
|
|
#include "instancesP.h"
|
|
#include "create_declsP.h"
|
|
|
|
/*************************************************************************
|
|
** **
|
|
** Constants (#define and const) **
|
|
** **
|
|
**************************************************************************/
|
|
|
|
static int write_menu_defs(GenCodeInfo genCodeInfo, ABObj menu);
|
|
static int write_menubar_defs(GenCodeInfo genCodeInfo, ABObj menubar);
|
|
static int write_text_defs(GenCodeInfo genCodeInfo, ABObj text);
|
|
static int write_button_defs(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_choice_defs(GenCodeInfo genCodeInfo, ABObj choice);
|
|
static int write_combobox_defs(GenCodeInfo genCodeInfo, ABObj choice);
|
|
static int write_drawing_area_defs(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_list_defs(GenCodeInfo genCodeInfo, ABObj list);
|
|
static int write_spinbox_defs(GenCodeInfo genCodeInfo, ABObj spinbox);
|
|
static int write_window_defs(GenCodeInfo genCodeInfo, ABObj window);
|
|
static int write_file_chooser_defs(GenCodeInfo genCodeInfo, ABObj fchooser);
|
|
static int write_termp_defs(GenCodeInfo genCodeInfo, ABObj text);
|
|
static int write_define_var(GenCodeInfo genCodeInfo,
|
|
ISTRING *struct_field_ptr,
|
|
STRING type,
|
|
ISTRING var,
|
|
STRING value
|
|
);
|
|
static int write_define_args_var(GenCodeInfo genCodeInfo, int actual_num_args);
|
|
static int write_define_counter_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_arg_counter_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_display_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_drawable_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_icon_pixmap_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_icon_mask_pixmap_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_label_pixmap_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_label_xmstr_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_acceltext_xmstr_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_return_code_var(GenCodeInfo genCodeInfo);
|
|
static int write_general_label_defs(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_items_names_array_def(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_items_strings_array_def(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_items_mnemonics_array_def(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_items_selected_array_def(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_items_widgets_array_def(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_single_help_def(GenCodeInfo genCodeInfo, STRING value);
|
|
static int write_help_defs(GenCodeInfo genCodeInfo, ABObj obj);
|
|
static int write_assign_local_vars_for_proc(GenCodeInfo genCodeInfo);
|
|
|
|
static int write_define_title_str_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_value_str_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_icon_name_str_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_ok_label_xmstr_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_directory_xmstr_var(GenCodeInfo genCodeInfo);
|
|
static int write_define_pattern_xmstr_var(GenCodeInfo genCodeInfo);
|
|
|
|
/*************************************************************************
|
|
*************************************************************************
|
|
** **
|
|
** PUBLIC ENTRY POINTS **
|
|
** **
|
|
*************************************************************************
|
|
*************************************************************************/
|
|
|
|
/*
|
|
* Writes out definitions of local variables for the current
|
|
* function (create proc). (No, the name _decls is not really correct).
|
|
*/
|
|
int
|
|
abmfP_write_create_proc_decls(GenCodeInfo genCodeInfo)
|
|
{
|
|
int returnValue= 0;
|
|
int rc = 0; /* return code */
|
|
ABObj obj= genCodeInfo->cur_func.create_obj;
|
|
|
|
/*
|
|
* Write out general de
|
|
*/
|
|
write_general_label_defs(genCodeInfo, obj);
|
|
|
|
/*
|
|
* Write declarations for object
|
|
*/
|
|
switch (obj_get_type(obj))
|
|
{
|
|
case AB_TYPE_BUTTON:
|
|
returnValue = write_button_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_CHOICE:
|
|
returnValue= write_choice_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_MENU:
|
|
returnValue= write_menu_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_CONTAINER:
|
|
switch (obj_get_container_type(obj))
|
|
{
|
|
case AB_CONT_MENU_BAR:
|
|
returnValue = write_menubar_defs(genCodeInfo, obj);
|
|
break;
|
|
}
|
|
break;
|
|
case AB_TYPE_LIST:
|
|
returnValue= write_list_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_SPIN_BOX:
|
|
returnValue= write_spinbox_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_COMBO_BOX:
|
|
returnValue= write_combobox_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_BASE_WINDOW:
|
|
case AB_TYPE_DIALOG:
|
|
returnValue= write_window_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_DRAWING_AREA:
|
|
returnValue = write_drawing_area_defs(genCodeInfo,obj);
|
|
break;
|
|
case AB_TYPE_TEXT_FIELD:
|
|
case AB_TYPE_TEXT_PANE:
|
|
returnValue = write_text_defs(genCodeInfo,obj);
|
|
break;
|
|
case AB_TYPE_FILE_CHOOSER:
|
|
returnValue = write_file_chooser_defs(genCodeInfo, obj);
|
|
break;
|
|
case AB_TYPE_TERM_PANE:
|
|
returnValue = write_termp_defs(genCodeInfo, obj);
|
|
break;
|
|
}
|
|
|
|
/* Write out help text definitions (if any) */
|
|
returnValue = write_help_defs(genCodeInfo,obj);
|
|
|
|
abio_puts(genCodeInfo->code_file, "\n");
|
|
|
|
rc = write_assign_local_vars_for_proc(genCodeInfo);
|
|
if (rc > 0)
|
|
{
|
|
abio_puts(genCodeInfo->code_file, "\n");
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
*************************************************************************
|
|
** **
|
|
** OBJECT-SPECIFIC VARIABLE DECLARATIONS **
|
|
** **
|
|
*************************************************************************
|
|
*************************************************************************/
|
|
|
|
|
|
static int
|
|
write_menu_defs(GenCodeInfo genCodeInfo, ABObj menu)
|
|
{
|
|
int num_args = abmfP_get_num_args(menu);
|
|
|
|
if (num_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
/*
|
|
* You can have a menu with no items, in which case you want to get the
|
|
* menu pane but don't have any menu items.
|
|
*/
|
|
if (obj_get_num_items(menu) != 0)
|
|
{
|
|
if (abmfP_items_have_accelerators(menu))
|
|
write_define_acceltext_xmstr_var(genCodeInfo);
|
|
|
|
else if (abmfP_items_are_homogeneous(menu))
|
|
{
|
|
if (genCodeInfo->i18n_method != ABMF_I18N_XPG4_API)
|
|
{
|
|
write_items_names_array_def(genCodeInfo, menu);
|
|
write_items_strings_array_def(genCodeInfo, menu);
|
|
write_define_counter_var(genCodeInfo);
|
|
if (abmfP_items_have_mnemonics(menu))
|
|
write_items_mnemonics_array_def(genCodeInfo, menu);
|
|
write_items_widgets_array_def(genCodeInfo, menu);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
write_menubar_defs(GenCodeInfo genCodeInfo, ABObj menubar)
|
|
{
|
|
int num_args = abmfP_get_num_args(menubar);
|
|
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
|
|
if (genCodeInfo->i18n_method != ABMF_I18N_XPG4_API)
|
|
{
|
|
/* REMIND: We should check num_items before defining any local
|
|
* array vars. We're close to FCS, so I don't want to
|
|
* change anything. dunn 30.Apr.95
|
|
*/
|
|
write_items_names_array_def(genCodeInfo, menubar);
|
|
write_items_strings_array_def(genCodeInfo, menubar);
|
|
write_define_counter_var(genCodeInfo);
|
|
if (abmfP_items_have_mnemonics(menubar))
|
|
write_items_mnemonics_array_def(genCodeInfo, menubar);
|
|
write_items_widgets_array_def(genCodeInfo, menubar);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
write_text_defs(GenCodeInfo genCodeInfo, ABObj text)
|
|
{
|
|
int num_args = abmfP_comp_get_num_args_of_classes(
|
|
text, ABMF_ARGCLASS_ALL_BUT_WIDGET_REF);
|
|
if (num_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
if(obj_get_initial_value_string(text) != NULL) {
|
|
write_define_value_str_var(genCodeInfo);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
write_button_defs(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
int num_args = 0;
|
|
|
|
if (!obj_has_menu(obj))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
num_args = abmfP_get_num_args(obj);
|
|
if (num_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
write_choice_defs(GenCodeInfo genCodeInfo, ABObj choice)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
ABObj item= obj_get_item(choice, 0);
|
|
int num_items= obj_get_num_items(choice);
|
|
int num_args = abmfP_get_num_args(choice);
|
|
int num_defared_args= num_args + 5; /* for safety */
|
|
|
|
if (num_defared_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
|
|
if (num_items > 0)
|
|
{
|
|
abio_printf(codeFile, "Widget\t%s[%d];\n",
|
|
abmfP_get_c_array_of_widgets_name(item), num_items);
|
|
|
|
if (genCodeInfo->i18n_method != ABMF_I18N_XPG4_API)
|
|
{
|
|
write_items_names_array_def(genCodeInfo, choice);
|
|
write_items_strings_array_def(genCodeInfo, choice);
|
|
write_define_counter_var(genCodeInfo);
|
|
write_items_selected_array_def(genCodeInfo, choice);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
write_combobox_defs(GenCodeInfo genCodeInfo, ABObj combobox)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
ABObj first_item = NULL;
|
|
int num_items = 0;
|
|
|
|
num_items = obj_get_num_items(combobox);
|
|
first_item= obj_get_item(combobox, 0);
|
|
|
|
if (num_items > 0)
|
|
{
|
|
write_define_counter_var(genCodeInfo);
|
|
write_items_names_array_def(genCodeInfo, combobox);
|
|
if (genCodeInfo->i18n_method != ABMF_I18N_XPG4_API)
|
|
write_items_strings_array_def(genCodeInfo, combobox);
|
|
}
|
|
abio_printf(codeFile, "\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
write_drawing_area_defs(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
int num_args = 0;
|
|
ABObj scrollingObj = NULL;
|
|
|
|
scrollingObj = objxm_comp_get_subobj(obj, AB_CFG_SCROLLING_OBJ);
|
|
if (scrollingObj == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
num_args = abmfP_get_num_args(scrollingObj);
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
write_list_defs(GenCodeInfo genCodeInfo, ABObj list)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
ABObj first_item = NULL;
|
|
ABObj item= NULL;
|
|
int num_args= 0;
|
|
int num_items = 0;
|
|
|
|
num_items = obj_get_num_items(list);
|
|
first_item= obj_get_item(list, 0);
|
|
num_args += abmfP_get_num_args(list);
|
|
if (num_items > 0)
|
|
{
|
|
num_args+= 2; /* items array, number of items */
|
|
}
|
|
if (num_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
if (num_items > 0)
|
|
{
|
|
write_define_counter_var(genCodeInfo);
|
|
|
|
if (genCodeInfo->i18n_method != ABMF_I18N_XPG4_API)
|
|
{
|
|
write_items_names_array_def(genCodeInfo, list);
|
|
write_items_strings_array_def(genCodeInfo, list);
|
|
}
|
|
|
|
abio_printf(codeFile, "XmString %s[%d];\n",
|
|
abmfP_get_c_array_of_xmstrings_name(first_item), num_items);
|
|
}
|
|
abio_printf(codeFile, "\n");
|
|
return 0;
|
|
}
|
|
static int
|
|
write_spinbox_defs(GenCodeInfo genCodeInfo, ABObj spinbox)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
ABObj first_item = NULL;
|
|
ABObj item= NULL;
|
|
int num_args= 0;
|
|
int num_items = 0;
|
|
|
|
num_items = obj_get_num_items(spinbox);
|
|
first_item= obj_get_item(spinbox, 0);
|
|
|
|
num_args += abmfP_get_num_args(spinbox);
|
|
if (num_items > 0)
|
|
{
|
|
num_args+= 2; /* items array, number of items */
|
|
}
|
|
if (num_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
if ((num_items > 0) &&
|
|
(obj_get_text_type(spinbox) == AB_TEXT_DEFINED_STRING))
|
|
{
|
|
write_define_counter_var(genCodeInfo);
|
|
write_items_names_array_def(genCodeInfo, spinbox);
|
|
|
|
if (genCodeInfo->i18n_method != ABMF_I18N_XPG4_API)
|
|
{
|
|
write_items_strings_array_def(genCodeInfo, spinbox);
|
|
}
|
|
|
|
abio_printf(codeFile, "XmString %s[%d];\n",
|
|
abmfP_get_c_array_of_xmstrings_name(first_item), num_items);
|
|
}
|
|
abio_printf(codeFile, "\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int
|
|
write_window_defs(GenCodeInfo genCodeInfo, ABObj window)
|
|
{
|
|
File codeFile= genCodeInfo->code_file;
|
|
|
|
abio_printf(codeFile, "Display *display= (parent == NULL? NULL:XtDisplay(parent));\n");
|
|
|
|
if (obj_is_popup_win(window))
|
|
{
|
|
int num_args = abmfP_get_num_args(window);
|
|
if (num_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
}
|
|
|
|
if (obj_get_icon(window) != NULL)
|
|
{
|
|
write_define_icon_pixmap_var(genCodeInfo);
|
|
}
|
|
if (obj_get_icon_mask(window) != NULL)
|
|
{
|
|
write_define_icon_mask_pixmap_var(genCodeInfo);
|
|
}
|
|
if (obj_get_icon_label(window) != NULL)
|
|
{
|
|
write_define_icon_name_str_var(genCodeInfo);
|
|
}
|
|
if (obj_get_label(window) != NULL)
|
|
{
|
|
write_define_title_str_var(genCodeInfo);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
write_file_chooser_defs(GenCodeInfo genCodeInfo, ABObj fchooser)
|
|
{
|
|
ABObj fsb_obj = objxm_comp_get_subobj(fchooser, AB_CFG_OBJECT_OBJ);
|
|
int num_args = 0;
|
|
|
|
num_args = abmfP_get_num_args(fsb_obj);
|
|
if (num_args > 0)
|
|
{
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
}
|
|
if (obj_get_ok_label(fchooser) != NULL)
|
|
write_define_ok_label_xmstr_var(genCodeInfo);
|
|
|
|
if (obj_get_directory(fchooser) != NULL)
|
|
write_define_directory_xmstr_var(genCodeInfo);
|
|
|
|
if (obj_get_filter_pattern(fchooser) != NULL)
|
|
write_define_pattern_xmstr_var(genCodeInfo);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
*************************************************************************
|
|
** **
|
|
** Write General-Purpose variable definitions **
|
|
** **
|
|
** **
|
|
** These are used by the object-specific write_<obj>_def() **
|
|
** functions. **
|
|
*************************************************************************
|
|
*************************************************************************/
|
|
|
|
#define make_istr_var_name(var, const_name) \
|
|
static ISTRING var = NULL; \
|
|
if ((var) == NULL) \
|
|
{ \
|
|
(var) = istr_const(const_name); \
|
|
}
|
|
|
|
/*
|
|
* Utility for writing out a generic local variable definition.
|
|
*/
|
|
static int
|
|
write_define_var(GenCodeInfo genCodeInfo,
|
|
ISTRING *struct_field_ptr,
|
|
STRING type,
|
|
ISTRING var,
|
|
STRING value
|
|
)
|
|
{
|
|
#define struct_field (*struct_field_ptr)
|
|
File codeFile = genCodeInfo->code_file;
|
|
|
|
if (struct_field != NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
abio_printf(codeFile, "%s\t%s",
|
|
(type), istr_string(var));
|
|
if (value != NULL)
|
|
{
|
|
abio_printf(codeFile, " = %s", value);
|
|
}
|
|
abio_puts(codeFile, ";\n");
|
|
struct_field = istr_dup(var);
|
|
|
|
return 0;
|
|
#undef struct_field
|
|
}
|
|
|
|
/*
|
|
* Variable: Arg args[n];
|
|
*/
|
|
static int
|
|
write_define_args_var(GenCodeInfo genCodeInfo, int actual_num_args)
|
|
{
|
|
make_istr_var_name(varArgs, "args");
|
|
|
|
if (abmfP_args_var(genCodeInfo) == NULL)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
int num_extra_args = 5;
|
|
int def_num_args = actual_num_args + num_extra_args;
|
|
|
|
abmfP_args_var(genCodeInfo) = istr_dup(varArgs);
|
|
abio_printf(codeFile, "Arg\targs[%d];", def_num_args);
|
|
abio_printf(codeFile, "\t/* need %d args (add %d to be safe) */",
|
|
actual_num_args, num_extra_args);
|
|
abio_puts(codeFile, nlstr);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: int i = 0;
|
|
*/
|
|
static int
|
|
write_define_counter_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varCounter, "i");
|
|
write_define_var(genCodeInfo, &abmfP_counter_var(genCodeInfo),
|
|
abmfP_str_int, varCounter, abmfP_str_zero);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* var: int n = 0;
|
|
*/
|
|
static int
|
|
write_define_arg_counter_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varArgCounter, "n");
|
|
write_define_var(genCodeInfo, &abmfP_arg_counter_var(genCodeInfo),
|
|
abmfP_str_int, varArgCounter, abmfP_str_zero);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* Variable: Display *display;
|
|
*/
|
|
static int
|
|
write_define_display_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varDisplay, "display");
|
|
write_define_var(genCodeInfo, &abmfP_display_var(genCodeInfo),
|
|
"Display *", varDisplay, abmfP_str_null);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: Drawable drawable = 0;
|
|
*/
|
|
static int
|
|
write_define_drawable_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varDrawable, "drawable");
|
|
write_define_var(genCodeInfo, &abmfP_drawable_var(genCodeInfo),
|
|
"Drawable", varDrawable, abmfP_str_zero);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: Pixmap icon_pixmap = 0;
|
|
*/
|
|
static int
|
|
write_define_icon_pixmap_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varIconPixmap, "icon_pixmap");
|
|
write_define_var(genCodeInfo, &abmfP_icon_pixmap_var(genCodeInfo),
|
|
"Pixmap", varIconPixmap, abmfP_str_zero);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: Pixmap icon_mask_pixmap = 0;
|
|
*/
|
|
static int
|
|
write_define_icon_mask_pixmap_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varIconPixmap, "icon_mask_pixmap");
|
|
write_define_var(genCodeInfo, &abmfP_icon_mask_pixmap_var(genCodeInfo),
|
|
"Pixmap", varIconPixmap, abmfP_str_zero);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: Pixmap label_pixmap = 0;
|
|
*/
|
|
static int
|
|
write_define_label_pixmap_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varLabelPixmap, "label_pixmap");
|
|
write_define_var(genCodeInfo, &abmfP_label_pixmap_var(genCodeInfo),
|
|
"Pixmap", varLabelPixmap, abmfP_str_zero);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: XmString label_xmstring = NULL;
|
|
*/
|
|
static int
|
|
write_define_label_xmstr_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varLabelXmStr, "label_xmstring");
|
|
write_define_var(genCodeInfo, &abmfP_label_xmstr_var(genCodeInfo),
|
|
"XmString", varLabelXmStr, abmfP_str_null);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* var: XmString acceltext_xmstring = NULL;
|
|
*/
|
|
static int
|
|
write_define_acceltext_xmstr_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varAccelTextXmStr, "acceltext_xmstring");
|
|
write_define_var(genCodeInfo, &abmfP_acceltext_xmstr_var(genCodeInfo),
|
|
"XmString", varAccelTextXmStr, abmfP_str_null);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: int return_code = 0;
|
|
*/
|
|
static int
|
|
write_define_return_code_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varReturnCode, "return_code");
|
|
write_define_var(genCodeInfo, &abmfP_return_code_var(genCodeInfo),
|
|
abmfP_str_int, varReturnCode, abmfP_str_zero);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* var: String title_str = NULL;
|
|
*/
|
|
static int
|
|
write_define_title_str_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
/* We only want to do this if the app is being I18N-ized */
|
|
if (genCodeInfo->i18n_method == ABMF_I18N_XPG4_API)
|
|
{
|
|
make_istr_var_name(varTitleString, "title_str");
|
|
write_define_var(genCodeInfo, &abmfP_title_str_var(genCodeInfo),
|
|
"String", varTitleString, abmfP_str_null);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* var: String value_str = NULL;
|
|
*/
|
|
static int
|
|
write_define_value_str_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
/* We only want to do this if the app is being I18N-ized */
|
|
if (genCodeInfo->i18n_method == ABMF_I18N_XPG4_API)
|
|
{
|
|
make_istr_var_name(varValueString, "value_str");
|
|
write_define_var(genCodeInfo, &abmfP_value_str_var(genCodeInfo),
|
|
"String", varValueString, abmfP_str_null);
|
|
}
|
|
return 0;
|
|
}
|
|
/*
|
|
* var: String icon_name_str = NULL;
|
|
*/
|
|
static int
|
|
write_define_icon_name_str_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
/* We only want to do this if the app is being I18N-ized */
|
|
if (genCodeInfo->i18n_method == ABMF_I18N_XPG4_API)
|
|
{
|
|
make_istr_var_name(varIconNameString, "icon_name_str");
|
|
write_define_var(genCodeInfo, &abmfP_icon_name_str_var(genCodeInfo),
|
|
"String", varIconNameString, abmfP_str_null);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* var: XmString oklabel_xmstring = NULL;
|
|
*/
|
|
static int
|
|
write_define_ok_label_xmstr_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varOkLabelXmStr, "oklabel_xmstring");
|
|
write_define_var(genCodeInfo, &abmfP_ok_label_xmstr_var(genCodeInfo),
|
|
"XmString", varOkLabelXmStr, abmfP_str_null);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* var: XmString dir_xmstring = NULL;
|
|
*/
|
|
static int
|
|
write_define_directory_xmstr_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varDirXmStr, "dir_xmstring");
|
|
write_define_var(genCodeInfo, &abmfP_directory_xmstr_var(genCodeInfo),
|
|
"XmString", varDirXmStr, abmfP_str_null);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* var: XmString pattern_xmstring = NULL;
|
|
*/
|
|
static int
|
|
write_define_pattern_xmstr_var(GenCodeInfo genCodeInfo)
|
|
{
|
|
make_istr_var_name(varPatternXmStr, "pattern_xmstring");
|
|
write_define_var(genCodeInfo, &abmfP_pattern_xmstr_var(genCodeInfo),
|
|
"XmString", varPatternXmStr, abmfP_str_null);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* Creates the local variable(s) necessary for the type of label the
|
|
* object has.
|
|
*/
|
|
static int
|
|
write_general_label_defs(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
BOOL hasGlyphLabel = FALSE;
|
|
BOOL hasStringLabel = FALSE;
|
|
|
|
if ( abmfP_obj_has_glyph_label(obj)
|
|
|| abmfP_obj_has_item_with_glyph_label(obj))
|
|
{
|
|
hasGlyphLabel = TRUE;
|
|
}
|
|
if ( abmfP_obj_has_string_label(obj)
|
|
|| abmfP_obj_has_item_with_string_label(obj))
|
|
{
|
|
hasStringLabel = TRUE;
|
|
}
|
|
|
|
if (hasGlyphLabel)
|
|
{
|
|
write_define_return_code_var(genCodeInfo);
|
|
write_define_display_var(genCodeInfo);
|
|
write_define_label_pixmap_var(genCodeInfo);
|
|
write_define_drawable_var(genCodeInfo);
|
|
}
|
|
if (hasStringLabel)
|
|
{
|
|
write_define_label_xmstr_var(genCodeInfo);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* Defines an array of widget names.
|
|
* Works for any object with items.
|
|
*/
|
|
static int
|
|
write_items_names_array_def(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
int num_items= obj_get_num_items(obj);
|
|
int this_item_num = 0;
|
|
ABObj item= NULL;
|
|
STRING strings_array_var_name = NULL;
|
|
AB_TRAVERSAL trav;
|
|
STRING widgetName = NULL;
|
|
|
|
if (num_items < 1)
|
|
{
|
|
return 0;
|
|
}
|
|
item = obj_get_item(obj, 0);
|
|
strings_array_var_name = abmfP_get_c_array_of_names_name(item);
|
|
abmfP_name_array_var(genCodeInfo) = istr_create(strings_array_var_name);
|
|
abmfP_name_array_var_has_value(genCodeInfo) = TRUE;
|
|
abio_printf(codeFile, "static String\t%s[] =\n", strings_array_var_name);
|
|
abio_puts(codeFile, "{\n");
|
|
abio_indent(codeFile);
|
|
for (trav_open(&trav, obj, AB_TRAV_ITEMS_FOR_OBJ), this_item_num = 0;
|
|
(item = trav_next(&trav)) != NULL; ++this_item_num)
|
|
{
|
|
if ((widgetName = abmfP_get_widget_name(item)) == NULL)
|
|
{
|
|
abio_printf(codeFile, "NULL");
|
|
}
|
|
else
|
|
{
|
|
abio_put_string(codeFile, widgetName);
|
|
}
|
|
if (this_item_num < (num_items-1))
|
|
{
|
|
abio_puts(codeFile, ", ");
|
|
}
|
|
}
|
|
trav_close(&trav);
|
|
abio_puts(codeFile, "\n");
|
|
abio_outdent(codeFile);
|
|
abio_puts(codeFile, "};\n");
|
|
return 0;
|
|
}
|
|
|
|
/****************
|
|
*
|
|
* Build an array of item labels
|
|
* This works for any object with items
|
|
*
|
|
****************/
|
|
static int
|
|
write_items_strings_array_def(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
int num_items= obj_get_num_items(obj);
|
|
int this_item_num = 0;
|
|
ABObj item= NULL;
|
|
STRING label_array_var_name = NULL;
|
|
AB_TRAVERSAL trav;
|
|
|
|
if (num_items < 1)
|
|
{
|
|
return 0;
|
|
}
|
|
item= obj_get_item(obj, 0);
|
|
label_array_var_name = abmfP_get_c_array_of_strings_name(item);
|
|
abmfP_label_array_var(genCodeInfo) = istr_create(label_array_var_name);
|
|
abio_printf(codeFile, "static String\t%s[] =\n",
|
|
label_array_var_name);
|
|
abio_puts(codeFile, "{\n");
|
|
abio_indent(codeFile);
|
|
for (trav_open(&trav, obj, AB_TRAV_ITEMS_FOR_OBJ), this_item_num = 0;
|
|
(item = trav_next(&trav)) != NULL; ++this_item_num)
|
|
{
|
|
if (obj_get_label(item) == NULL)
|
|
{
|
|
abio_printf(codeFile, "NULL");
|
|
abmfP_label_array_has_nulls(genCodeInfo) = TRUE;
|
|
}
|
|
else
|
|
{
|
|
abio_put_string(codeFile, obj_get_label(item));
|
|
}
|
|
if (this_item_num < (num_items-1))
|
|
{
|
|
abio_puts(codeFile, ", ");
|
|
}
|
|
}
|
|
trav_close(&trav);
|
|
abio_puts(codeFile, "\n");
|
|
abio_outdent(codeFile);
|
|
abio_puts(codeFile, "};\n");
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
write_items_mnemonics_array_def(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
int num_items= obj_get_num_items(obj);
|
|
int this_item_num = 0;
|
|
ABObj item= NULL;
|
|
STRING mnemonic_array_var_name = NULL;
|
|
STRING mnemonic;
|
|
AB_TRAVERSAL trav;
|
|
|
|
if (num_items < 1)
|
|
{
|
|
return 0;
|
|
}
|
|
item= obj_get_item(obj, 0);
|
|
mnemonic_array_var_name = abmfP_get_c_array_of_mnemonics_name(item);
|
|
abmfP_mnemonic_array_var(genCodeInfo) =
|
|
istr_create(mnemonic_array_var_name);
|
|
abio_printf(codeFile, "static String\t%s[] =\n", mnemonic_array_var_name);
|
|
abio_puts(codeFile, "{\n");
|
|
abio_indent(codeFile);
|
|
for (trav_open(&trav, obj, AB_TRAV_ITEMS_FOR_OBJ), this_item_num = 0;
|
|
(item = trav_next(&trav)) != NULL; ++this_item_num)
|
|
{
|
|
if ((mnemonic = obj_get_mnemonic(item)) == NULL)
|
|
{
|
|
abio_printf(codeFile, "NULL");
|
|
}
|
|
else
|
|
{
|
|
abio_put_string(codeFile, mnemonic);
|
|
}
|
|
if (this_item_num < (num_items-1))
|
|
{
|
|
abio_puts(codeFile, ", ");
|
|
}
|
|
}
|
|
trav_close(&trav);
|
|
abio_puts(codeFile, "\n");
|
|
abio_outdent(codeFile);
|
|
abio_puts(codeFile, "};\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* Writes out an array of Booleans that determine for each item whether
|
|
* or not it is selected.
|
|
*
|
|
* Works for any object with items
|
|
*/
|
|
static int
|
|
write_items_selected_array_def(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
int num_items= obj_get_num_items(obj);
|
|
ABObj item= NULL;
|
|
int this_item_num = 0;
|
|
AB_TRAVERSAL trav;
|
|
|
|
if (num_items < 1)
|
|
{
|
|
return 0;
|
|
}
|
|
item= obj_get_item(obj, 0);
|
|
abio_printf(codeFile, "Boolean\t%s[] =\n",
|
|
abmfP_get_c_array_of_selected_bools_name(item));
|
|
abio_puts(codeFile, "{\n");
|
|
abio_indent(codeFile);
|
|
for (trav_open(&trav, obj, AB_TRAV_ITEMS_FOR_OBJ), this_item_num = 0;
|
|
(item = trav_next(&trav)) != NULL; ++this_item_num)
|
|
{
|
|
abio_printf(codeFile, "%s",
|
|
obj_is_initially_selected(item)? "True":"False");
|
|
if (this_item_num < (num_items-1))
|
|
{
|
|
abio_puts(codeFile, ", ");
|
|
}
|
|
}
|
|
trav_close(&trav);
|
|
abio_puts(codeFile, "\n");
|
|
abio_outdent(codeFile);
|
|
abio_puts(codeFile, "};\n");
|
|
return 0;
|
|
}
|
|
|
|
|
|
/****************
|
|
*
|
|
* Declare an array of item widgets
|
|
* This works for any object with items
|
|
*
|
|
****************/
|
|
static int
|
|
write_items_widgets_array_def(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
int num_items= obj_get_num_items(obj);
|
|
ABObj item= NULL;
|
|
|
|
if (num_items < 1)
|
|
{
|
|
return 0;
|
|
}
|
|
item= obj_get_item(obj, 0);
|
|
abio_printf(codeFile, "Widget\t%s[%d];\n",
|
|
abmfP_get_c_array_of_widgets_name(item),
|
|
num_items);
|
|
return 0;
|
|
}
|
|
|
|
|
|
/* Convenience routine used on a per-help-attribute basis */
|
|
static int
|
|
write_single_help_def(GenCodeInfo genCodeInfo, STRING value)
|
|
{
|
|
|
|
File codeFile = genCodeInfo->code_file;
|
|
|
|
if( ((value != 0) && (*value != 0)) ) {
|
|
abio_put_string(codeFile, value);
|
|
abio_puts(codeFile, ",\n");
|
|
}
|
|
else {
|
|
abio_printf(codeFile, "\"\",\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Write out declarations associated with help attributes
|
|
*/
|
|
static int
|
|
write_help_defs(GenCodeInfo genCodeInfo, ABObj obj)
|
|
{
|
|
STRING help_volume, help_location, help_text;
|
|
File codeFile = genCodeInfo->code_file;
|
|
|
|
if(obj_has_help_data(obj)) {
|
|
obj_get_help_data(obj,&help_volume,&help_location,&help_text);
|
|
|
|
/*
|
|
** If this is an I18N-ized app, we can't compile in the help text,
|
|
** but must instead load it at runtime via catgets(). We still need
|
|
** the static HelpData info, but we just force the help text part to
|
|
** be a null string (for now).
|
|
*/
|
|
if(genCodeInfo->i18n_method == ABMF_I18N_XPG4_API) {
|
|
abio_puts(codeFile,"static DtbObjectHelpDataRec\thelp_data = {\n");
|
|
abio_indent(codeFile);
|
|
abio_puts(codeFile,"\"\",\n");
|
|
write_single_help_def(genCodeInfo,help_volume);
|
|
write_single_help_def(genCodeInfo,help_location);
|
|
abio_outdent(codeFile);
|
|
abio_puts(codeFile,"};\n");
|
|
abio_puts(codeFile,"char *tmp_txt;\n");
|
|
}
|
|
else {
|
|
abio_puts(codeFile,"static DtbObjectHelpDataRec\thelp_data = {\n");
|
|
abio_indent(codeFile);
|
|
write_single_help_def(genCodeInfo,help_text);
|
|
write_single_help_def(genCodeInfo,help_volume);
|
|
write_single_help_def(genCodeInfo,help_location);
|
|
abio_outdent(codeFile);
|
|
abio_puts(codeFile,"};\n");
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
*************************************************************************
|
|
** **
|
|
** General-purpose private functions **
|
|
** **
|
|
*************************************************************************
|
|
*************************************************************************/
|
|
|
|
|
|
/*
|
|
* Assigns values to local variables that need them.
|
|
*/
|
|
static int
|
|
write_assign_local_vars_for_proc(GenCodeInfo genCodeInfo)
|
|
{
|
|
File codeFile = genCodeInfo->code_file;
|
|
ABObj activeObj = NULL;
|
|
int num_written = 0;
|
|
|
|
if (abmfP_create_obj(genCodeInfo) != NULL)
|
|
{
|
|
activeObj = abmfP_create_obj(genCodeInfo);
|
|
}
|
|
else if (abmfP_ip_obj(genCodeInfo) != NULL)
|
|
{
|
|
activeObj = abmfP_ip_obj(genCodeInfo);
|
|
}
|
|
|
|
if ( (abmfP_display_var(genCodeInfo) != NULL)
|
|
&& (!abmfP_display_var_has_value(genCodeInfo)) )
|
|
{
|
|
++num_written;
|
|
abio_printf(codeFile, "%s = XtDisplay(%s);\n",
|
|
istr_string(abmfP_display_var(genCodeInfo)),
|
|
abmfP_get_widget_parent_name(genCodeInfo, activeObj));
|
|
abmfP_display_var_has_value(genCodeInfo) = TRUE;
|
|
}
|
|
|
|
if ( (abmfP_drawable_var(genCodeInfo) != NULL)
|
|
&& (!abmfP_drawable_var_has_value(genCodeInfo)) )
|
|
{
|
|
++num_written;
|
|
abio_printf(codeFile, "%s = DefaultRootWindow(%s);\n",
|
|
istr_string(abmfP_drawable_var(genCodeInfo)),
|
|
istr_string(abmfP_display_var(genCodeInfo)) );
|
|
abmfP_drawable_var_has_value(genCodeInfo) = TRUE;
|
|
}
|
|
|
|
return num_written;
|
|
}
|
|
|
|
static int
|
|
write_termp_defs(GenCodeInfo genCodeInfo, ABObj text)
|
|
{
|
|
int num_args = abmfP_comp_get_num_args_of_classes(
|
|
text, ABMF_ARGCLASS_ALL_BUT_WIDGET_REF);
|
|
if (num_args > 0)
|
|
{
|
|
write_define_args_var(genCodeInfo, num_args);
|
|
write_define_arg_counter_var(genCodeInfo);
|
|
}
|
|
return 0;
|
|
}
|