/*
jlayout - A Java code generator for GUI layout
Copyright (c) 2007-2010, Dirk Krause
All rights reserved.

Redistribution and use in source and binary forms,
with or without modification, are permitted provided
that the following conditions are met:

* Redistributions of source code must retain the above
  copyright notice, this list of conditions and the
  following disclaimer.
* Redistributions in binary form must reproduce the above 
  opyright notice, this list of conditions and the following
  disclaimer in the documentation and/or other materials
  provided with the distribution.
* Neither the name of the Dirk Krause nor the names of
  contributors may be used to endorse or promote
  products derived from this software without specific
  prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
*/



/**	@file	jlread.c	The jlread module of the jlayout program.
*/



/**	Inside the jlread module.
*/
#define	JLREAD_C	1

#include	"jl.h"




#line 54 "jlread.ctr"




/** File open mode.  */
static char str_r[] = { "r" };


/** Control instructions. */
static char *control_instructions[] = {
  /*   0 */	"default",
  /*   1 */	"option",
  NULL
};


/** Close operations. */
static char *close_operations[] = {
  "nothing", "hide", "dispose", "exit", NULL
};



/** Border sub types. */
static char *border_sub_types[] = {
  "lowered", "raised", NULL
};


/** Border types. */
static char *border_types[] = {
/*  0 */	"empty",
/*  1 */	"etched",
/*  2 */	"bevel",
/*  3 */	"line",
/*  4 */	"matte",
/*  5 */	"titled",
NULL
};

/** Horizontal alignment types. */
static char *h_align_types[] = {
	"leading",
	"left",
	"center",
	"right",
	"trailing",
	NULL
};


/** Vertical alignment types. */
static char *v_align_types[] = {
	"top",
	"center",
	"bottom",
	NULL
};

/** String: BorderFactory. */
static char str_borderfactory[] = { "BorderFactory" };

/** String: WindowConstants. */
static char str_windowconstants[] = { "WindowConstants" };

/** String: enabled. */
static char str_enabled[] = { "enabled" };

/** String: default. */
static char str_default[] = { "default" };

/** String: close. */
static char str_close[] = { "close" };

/** String: operation. */
static char str_operation[] = { "operation" };

/** String: title. */
static char str_title[] = { "title" };

/** String: transfer. */
static char str_transfer[] = { "transfer" };

/** String: handler. */
static char str_handler[] = { "handler" };

/** String: horizontal. */
static char str_horizontal[] = { "horizontal" };

/** String: vertical. */
static char str_vertical[] = { "vertical" };

/** String: alignment. */
static char str_alignment[] = { "alignment" };

/** String: minimum. */
static char str_minimum[] = { "minimum" };

/** String: preferred. */
static char str_preferred[] = { "preferred" };

/** String: maximum. */
static char str_maximum[] = { "maximum" };

/** String: glue. */
static char str_glue[] = { "glue" };

/** String: separator. */
static char str_separator[] = { "separator" };

/** String: use. */
static char str_use[] = { "use" };

/** String: content. */
static char str_content[] = { "content" };

/** String: pane. */
static char str_pane[] = { "pane" };

/** String: contents. */
static char str_contents[] = { "contents" };

/** String: border. */
static char str_border[] = { "border" };

/** String: fill. */
static char str_fill[] = { "fill" };

/** String: anchor. */
static char str_anchor[] = { "anchor" };

/** String: action. */
static char str_action[] = { "action" };

/** String: command. */
static char str_command[] = { "command" };

/** String: window. */
static char str_window[] = { "window" };

/** String: item. */
static char str_item[] = { "item" };

/** String: listener. */
static char str_listener[] = { "listener" };

/** String: layout. */
static char str_layout[] = { "layout" };

/** String: text. */
static char str_text[] = { "text" };

/** String: tool. */
static char str_tool[] = { "tool" };

/** String: tip. */
static char str_tip[] = { "tip" };

/** String: as. */
static char str_as[] = { "as" };

/** String: accessible. */
static char str_accessible[] = { "accessible" };

/** String: description. */
static char str_description[] = { "description" };

/** String: constructor. */
static char str_constructor[] = { "constructor" };

/** String: width. */
static char str_width[] = { "width" };

/** String: size. */
static char str_size[] = { "size" };

/** String: button. */
static char str_button[] = { "button" };

/** String: group. */
static char str_group[] = { "group" };

/** String: caret. */
static char str_caret[] = { "caret" };

/** String: change. */
static char str_change[] = { "change" };

/** String: component. */
static char str_component[] = { "component"};

/** String: container. */
static char str_container[] = { "container" };

/** String: document. */
static char str_document[] = { "document" };

/** String: focus. */
static char str_focus[] = { "focus" };

/** String: internal. */
static char str_internal[] = { "internal" };

/** String: frame. */
static char str_frame[] = { "frame" };

/** String: key. */
static char str_key[] = { "key" };

/** String: data. */
static char str_data[] = { "data" };

/** String: list. */
static char str_list[] = { "list" };

/** String: selection. */
static char str_selection[] = { "selection" };

/** String: mouse. */
static char str_mouse[] = { "mouse" };

/** String: motion. */
static char str_motion[] = { "motion" };

/** String: wheel. */
static char str_wheel[] = { "wheel" };

/** String: property. */
static char str_property[] = { "property" };

/** String: table. */
static char str_table[] = { "table" };

/** String: model. */
static char str_model[] = { "model" };

/** String: tree. */
static char str_tree[] = { "tree" };

/** String: expansion. */
static char str_expansion[] = { "expansion" };

/** String: expand. */
static char str_expand[] = { "expand" };

/** String: will. */
static char str_will[] = { "will" };

/** String: undoable. */
static char str_undoable[] = { "undoable" };

/** String: edit. */
static char str_edit[] = { "edit" };

/** String: icon. */
static char str_icon[] = { "icon" };

/** String: color. */
static char str_color[] = { "color" };

/** String: foreground. */
static char str_foreground[] = { "foreground" };

/** String: background. */
static char str_background[] = { "background" };

/** String: font. */
static char str_font[] = { "font" };

/** String: style. */
static char str_style[] = { "style" };

/** String: file. */
static char str_file[] = { "file" };

/** String: name. */
static char str_name[] = { "name" };

/** String: menu. */
static char str_menu[] = { "menu" };

/** String: bar. */
static char str_bar[] = { "bar" };

/** String: weight. */
static char str_weight[] = { "weight" };

/** String: EtchedBorder. */
static char str_etched_border[] = { "EtchedBorder" };

/** String: TitledBorder. */
static char str_titled_border[] = { "TitledBorder" };

/** String: SwingConstants. */
static char str_swing_constants[] = { "SwingConstants" };

/** String: Font. */
static char str_class_font[] = { "Font" };

/** String: Color. */
static char str_class_color[] = { "Color" };

/** String: Box. */
static char str_class_box[] = { "Box" };

/** String: position. */
static char str_position[] = { "position" };

/** Command: enabled. */
static char *cmd_enabled[] = { str_enabled, NULL };

/** Command: default close operation. */
static char *cmd_default_close_operation[] = {
  str_default, str_close, str_operation, NULL
};

/** Command: border. */
static char *cmd_border[] = { str_border, NULL };

/** Command: fill. */
static char *cmd_fill[] = { str_fill, NULL };

/** Command: anchor. */
static char *cmd_anchor[] = { str_anchor, NULL };

/**	Event listener class names.
*/
static char *listener_classes[] = {
/*  0 */	"ActionListener",
/*  1 */	"WindowListener",
/*  2 */	"ItemListener",
/*  3 */	"CaretListener",
/*  4 */	"ChangeListener",
/*  5 */	"ComponentListener",
/*  6 */	"ContainerListener",
/*  7 */	"DocumentListener",
/*  8 */	"FocusListener",
/*  9 */	"InternalFrameListener",
/* 10 */	"KeyListener",
/* 11 */	"ListDataListener",
/* 12 */	"ListSelectionListener",
/* 13 */	"MouseListener",
/* 14 */	"MouseMotionListener",
/* 15 */	"MouseWheelListener",
/* 16 */	"PropertyChangeListener",
/* 17 */	"TableModelListener",
/* 18 */	"TreeExpansionListener",
/* 19 */	"TreeModelListener",
/* 20 */	"TreeSelectionListener",
/* 21 */	"TreeWillExpandListener",
/* 22 */	"UndoableEditListener",
/* 23 */	"TransferHandlerListener",
NULL
};
/** Maximum index in listener_classes array. */
#define MAX_LISTENER_INDEX	23

/** Class name: ButtonGroup. */
static char str_button_group[] = { "ButtonGroup" };

/** Command: title. */
static char *cmd_title[] = {
  str_title, NULL
};

/** Command: contents border. */
static char *cmd_contents_border[] = {
  str_contents, str_border, NULL
};

/** Command: contents fill. */
static char *cmd_contents_fill[] = {
  str_contents, str_fill, NULL
};

/** Command: contents anchor. */
static char *cmd_contents_anchor[] = {
  str_contents, str_anchor, NULL
};

/** Command: action listener. */
static char *cmd_action_listener[] = {
  str_action, str_listener, NULL
};

/** Command: caret listener. */
static char *cmd_caret_listener[] = {
  str_caret, str_listener, NULL
};

/** Command: change listener. */
static char *cmd_change_listener[] = {
  str_change, str_listener, NULL
};

/** Command: component listener. */
static char *cmd_component_listener[] = {
  str_component, str_listener, NULL
};

/** Command: container listener. */
static char *cmd_container_listener[] = {
  str_container, str_listener, NULL
};

/** Command: document listener. */
static char *cmd_document_listener[] = {
  str_document, str_listener, NULL
};

/** Command: focus listener. */
static char *cmd_focus_listener[] = {
  str_focus, str_listener, NULL
};

/** Command: internal frame listener. */
static char *cmd_internal_frame_listener[] = {
  str_internal, str_frame, str_listener, NULL
};

/** Command: key listener. */
static char *cmd_key_listener[] = {
  str_key, str_listener, NULL
};

/** Command: list data listener. */
static char *cmd_list_data_listener[] = {
  str_list, str_data, str_listener, NULL
};

/** Command: list selection listener. */
static char *cmd_list_selection_listener[] = {
  str_list, str_selection, str_listener, NULL
};

/** Command: mouse listener. */
static char *cmd_mouse_listener[] = {
  str_mouse, str_listener, NULL
};

/** Command: mouse motion listener. */
static char *cmd_mouse_motion_listener[] = {
  str_mouse, str_motion, str_listener, NULL
};

/** Command: mouse wheel listener. */
static char *cmd_mouse_wheel_listener[] = {
  str_mouse, str_wheel, str_listener, NULL
};

/** Command: property change listener. */
static char *cmd_property_change_listener[] = {
  str_property, str_change, str_listener, NULL
};

/** Command: table model listener. */
static char *cmd_table_model_listener[] = {
  str_table, str_model, str_listener, NULL
};

/** Command: tree expansion listener. */
static char *cmd_tree_expansion_listener[] = {
  str_tree, str_expansion, str_listener, NULL
};

/** Command: tree model listener. */
static char *cmd_tree_model_listener[] = {
  str_tree, str_model, str_listener, NULL
};

/** Command: tree selection listener. */
static char *cmd_tree_selection_listener[] = {
  str_tree, str_selection, str_listener, NULL
};

/** Command: tree will expand listener. */
static char *cmd_tree_will_expand_listener[] = {
  str_tree, str_will, str_expand, str_listener, NULL
};

/** Command: undoable edit listener. */
static char *cmd_undoable_edit_listener[] = {
  str_undoable, str_edit, str_listener, NULL
};

/** Command: item listener. */
static char *cmd_item_listener[] = {
  str_item, str_listener, NULL
};

/** Command: window listener. */
static char *cmd_window_listener[] = {
  str_window, str_listener, NULL
};

/** Command: layout. */
static char *cmd_layout[] = {
  str_layout, NULL
};

/** Command: contents. */
static char *cmd_contents[] = {
  str_contents, NULL
};

/** Command: text. */
static char *cmd_text[] = {
  str_text, NULL
};

/** Command: constructor. */
static char *cmd_constructor[] = {
  str_constructor, NULL
};

/** Command: width. */
static char *cmd_width[] = {
  str_width, NULL
};

/** Command: size group. */
static char *cmd_size_group[] = {
  str_size, str_group, NULL
};

/** Command: button group. */
static char *cmd_button_group[] = {
  str_button, str_group, NULL
};

/** Command: icon file name. */
static char *cmd_icon_file_name[] = {
  str_icon, str_file, str_name, NULL
};

/** Command: component border. */
static char *cmd_component_border[] = {
  str_component, str_border, NULL
};

/** Command: icon color. */
static char *cmd_icon_color[] = {
  str_icon, str_color, NULL
};

/** Command: use content pane. */
static char *cmd_use_content_pane[] = {
  str_use, str_content, str_pane, NULL
};

/** Command: menu bar. */
static char *cmd_menubar[] = {
  str_menu, str_bar, NULL
};

/** Command: specials. */
static char *cmd_specials[] = {
	/*  0 */	str_glue,
	/*  1 */	str_separator,
	NULL
};

/** Command: weight. */
static char *cmd_weight[] = {
  str_weight, NULL
};

/** Command: border weight. */
static char *cmd_border_weight[] = {
  str_border, str_weight, NULL
};

/** Command: minimum size. */
static char *cmd_minimum_size[] = {
  str_minimum, str_size, NULL
};

/** Command: preferred size. */
static char *cmd_preferred_size[] = {
  str_preferred, str_size, NULL
};

/** Command: maximum size. */
static char *cmd_maximum_size[] = {
  str_maximum, str_size, NULL
};

/** Command: tool tip text. */
static char *cmd_tool_tip_text[] = {
  str_tool, str_tip, str_text, NULL
};

/** Command: accessible description. */
static char *cmd_accessible_description[] = {
  str_accessible, str_description, NULL
};

/** Command: use tool tip text as accessible description. */
static char *cmd_use_tool_tip_text_as_accessible_description[] = {
  str_use, str_tool, str_tip, str_text, str_as, str_accessible,
  str_description,
  NULL
};

/** Command: action command. */
static char *cmd_action_command[] = {
  str_action, str_command, NULL
};

/** Command: horizontal text alignment. */
static char *cmd_horizontal_alignment[] = {
  str_horizontal, str_alignment, NULL
};

/** Command: horizontal text position. */
static char *cmd_horizontal_text_position[] = {
  str_horizontal, str_text, str_position, NULL
};

/** Command: vertical text position. */
static char *cmd_vertical_text_position[] = {
  str_vertical, str_text, str_position, NULL
};

/** Command: vertical alignment. */
static char *cmd_vertical_alignment[] = {
  str_vertical, str_alignment, NULL
};

/** Command: transfer handler. */
static char *cmd_transfer_handler[] = {
  str_transfer, str_handler, NULL
};

/** Command: font. */
static char *cmd_font[] = {
  str_font, NULL
};

/** Command: font style. */
static char *cmd_font_style[] = {
  str_font, str_style, NULL
};

/** Command : foreground. */
static char *cmd_foreground[] = {
  str_foreground, NULL
};

/** Command: background. */
static char *cmd_background[] = {
  str_background, NULL
};



/**	Commands for default lines.
*/
static char **cmds_for_defaults[] = {
  /*   0 */	cmd_border,	/* border */
  /*   1 */	cmd_fill,	/* fill */
  /*   2 */	cmd_anchor,	/* anchor */
  NULL
};



/**	Option commands.
*/
static char **cmds_for_options[] = {
  /*   0 */	cmd_use_tool_tip_text_as_accessible_description,
  NULL
};



/**	Object attribute names.
*/
static char **cmd_for_objects[] = {
  /*   0 */	cmd_border,	/* border */
  /*   1 */	cmd_fill,	/* fill */
  /*   2 */	cmd_anchor,	/* anchor */
  /*   3 */	cmd_contents_border,
  /*   4 */	cmd_contents_fill,
  /*   5 */	cmd_contents_anchor,
  /*   6 */	cmd_action_listener,
  /*   7 */	cmd_item_listener,
  /*   8 */	cmd_window_listener,
  /*   9 */	cmd_layout,
  /*  10 */	cmd_contents,
  /*  11 */	cmd_text,
  /*  12 */	cmd_constructor,
  /*  13 */	cmd_width,
  /*  14 */	cmd_size_group,
  /*  15 */	cmd_caret_listener,
  /*  16 */	cmd_change_listener,
  /*  17 */	cmd_component_listener,
  /*  18 */	cmd_container_listener,
  /*  19 */	cmd_document_listener,
  /*  20 */	cmd_focus_listener,
  /*  21 */	cmd_internal_frame_listener,
  /*  22 */	cmd_key_listener,
  /*  23 */	cmd_list_data_listener,
  /*  24 */	cmd_list_selection_listener,
  /*  25 */	cmd_mouse_listener,
  /*  26 */	cmd_mouse_motion_listener,
  /*  27 */	cmd_mouse_wheel_listener,
  /*  28 */	cmd_property_change_listener,
  /*  29 */	cmd_table_model_listener,
  /*  30 */	cmd_tree_expansion_listener,
  /*  31 */	cmd_tree_model_listener,
  /*  32 */	cmd_tree_selection_listener,
  /*  33 */	cmd_tree_will_expand_listener,
  /*  34 */	cmd_undoable_edit_listener,
  /*  35 */	cmd_icon_file_name,
  /*  36 */	cmd_button_group,
  /*  37 */	cmd_component_border,
  /*  38 */	cmd_use_content_pane,
  /*  39 */	cmd_menubar,
  /*  40 */	cmd_weight,
  /*  41 */	cmd_minimum_size,
  /*  42 */	cmd_preferred_size,
  /*  43 */	cmd_maximum_size,
  /*  44 */	cmd_tool_tip_text,
  /*  45 */	cmd_accessible_description,
  /*  46 */	cmd_action_command,
  /*  47 */	cmd_horizontal_alignment,
  /*  48 */	cmd_vertical_alignment,
  /*  49 */	cmd_transfer_handler,
  /*  50 */	cmd_title,
  /*  51 */	cmd_default_close_operation,
  /*  52 */	cmd_enabled,
  /*  53 */	cmd_font,
  /*  54 */	cmd_foreground,
  /*  55 */	cmd_background,
  /*  56 */	cmd_font_style,
  /*  57 */	cmd_border_weight,
  /*  58 */	cmd_horizontal_text_position,
  /*  59 */	cmd_vertical_text_position,
  NULL
};



/**	Horizontal text positions.
*/
static char *horizontal_text_positions[] = {
  "LEFT", "CENTER", "RIGHT", "LEADING", "TRAILING", NULL
};



/**	Vertical text positions.
*/
static char *vertical_text_positions[] = {
  "TOP", "CENTER", "BOTTOM", NULL
};



/**	Fill values.
*/
static char *fill_values[] = {
  "NONE", "HORIZONTAL", "VERTICAL", "BOTH",
  NULL
};



/**	Anchor setting names.
*/
static char *anchor_values[] = {
  "CENTER",
  "NORTH",
  "NORTHEAST",
  "EAST",
  "SOUTHEAST",
  "SOUTH",
  "SOUTHWEST",
  "WEST",
  "NORTHWEST",
  "PAGE_START",
  "PAGE_END",
  "LINE_START",
  "LINE_END",
  "FIRST_LINE_START",
  "FIRST_LINE_END",
  "LAST_LINE_START",
  "LAST_LINE_END",
  "BASELINE",
  "BASELINE_LEADING",
  "BASELINE_TRAILING",
  "ABOVE_BASELINE",
  "ABOVE_BASELINE_LEADING",
  "ABOVE_BASELINE_TRAILING",
  "BELOW_BASELINE",
  "BELOW_BASELINE_LEADING",
  "BELOW_BASELINE_TRAILING",
  NULL
};


/**	Layout names.
*/
static char *layout_values[] = {
  "NONE",
  "GridBag",
  "Card",
  "Border",
  "Box.X_AXIS",
  "Box.Y_AXIS",
  "Box.PAGE_AXIS",
  "Box.LINE_AXIS",
  "Flow",
  "Grid",
  "Group",
  "Spring",
  NULL
};


/**	Class names.
*/
static char *layout_classes[] = {
/*  0 */	"GridBagLayout",
/*  1 */	"CardLayout",
/*  2 */	"BorderLayout",
/*  3 */	"BoxLayout",
/*  4 */	"FlowLayout",
/*  5 */	"GridLayout",
/*  6 */	"GroupLayout",
/*  7 */	"SpringLayout",
NULL
};


/** Keyowrd: GridBagConstraints. */
static char str_gridbagconstraints[] = { "GridBagConstraints" };

/** Keyword: ImageIcon. */
static char str_imageicon[] = { "ImageIcon" };

/** Keyword: JComponent. */
static char str_jcomponent[] = { "JComponent" };

/** Keyword: Container. */
static char str_Container[] = { "Container" };



/**	Compare two classes by name.
	@param	l	Left class.
	@param	r	Right class.
	@param	cr	Comparison criteria (ignored).
	@return	Comparison result.
*/
static
int
compare_classes_by_name DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  char *pl, *pr;
  pl = (char *)l; pr = (char *)r;
  if(l) {
    if(r) {
      back = strcmp(pl, pr);
    } else { back = 1; }
  } else {
    if(r) { back = -1; }
  }
  return back;
}



/**	Compare two content nodes by line number of appearance.
	@param	l	Left node.
	@param	r	Right node.
	@param	cr	Comparison criteria (ignored).
	@return	Comparison result.
*/
static
int
compare_contents_nodes DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  JCN *pl = NULL, *pr = NULL;
  pl = (JCN *)l; pr = (JCN *)r;
  if(pl) {
    if(pr) {
      if(pl->n < pr->n) {
        back = -1;
      } else {
        if(pl->n > pr->n) {
	  back = 1;
	}
      }
    } else { back = 1; }
  } else { if(pr) { back = -1; } }
  return back;
}



/**	Compare two listeners by number.
	@param	l	Left event listener.
	@param	r	Right event listener.
	@param	cr	Comparison criteria (ignored).
	@return	Comparison result.
*/
static
int
compare_listeners DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  JLISTENER *pl = NULL, *pr = NULL;
  
  pl = (JLISTENER *)l; pr = (JLISTENER *)r;
  if(l) {
    if(r) {
      if(pl->number > pr->number) {
        back = 1;
      } else {
        if(pl->number < pr->number) {
	  back = -1;
	}
      }
    } else { back = 1; }
  } else {
    if(r) { back = -1; }
  }
  
  return back;
}



/**	Compare event listeners, return inverted result.
	@param	l	Left listener.
	@param	r	Right listener.
	@param	cr	Comparison criteria (ignored).
	@return	Inverted comparison result.
*/
static
int
compare_listeners_inverted DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  JLISTENER *pl = NULL, *pr = NULL;
  
  pl = (JLISTENER *)l; pr = (JLISTENER *)r;
  if(l) {
    if(r) {
      if(pl->number > pr->number) {
        back = -1;
      } else {
        if(pl->number < pr->number) {
	  back = 1;
	}
      }
    } else { back = 1; }
  } else {
    if(r) { back = -1; }
  }
  
  return back;
}


/**	Compare two size groups by name.
	@param	l	Left size group name.
	@param	r	Right size group name.
	@param	cr	Comparison criteria (ignored).
	@return	Comparison result.
*/
static
int
jlread_compare_groups_by_name DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  JSG *pl, *pr;
  
  pl = (JSG *)l;
  switch(cr) {
    case CR_COMPARE_OBJECT_AND_NAME: {
      if(l) {
        if(r) {
	  if(pl->n) {
	    back = strcmp(pl->n, (char *)r);
	  } else { back = -1; }
	} else { back = 1; }
      } else { if(r) { back = -1; } }
    } break;
    default: {
      pr = (JSG *)r;
      if(l) {
        if(r) {
	  if(pl->n) {
	    if(pr->n) {
	      back = strcmp(pl->n, pr->n);
	    } else { back = 1; }
	  } else {
	    if(pr->n) { back = -1; }
	  }
	} else { back = 1; }
      } else { if(r) { back = -1; } }
    } break;
  }
  
  return back;
}



int
jlread_compare_objects_by_name DK_P3(void *,l, void *,r, int,cr)
{
  int back = 0;
  JLO *pl, *pr;
  
  pl = (JLO *)l;
  switch(cr) {
    case CR_COMPARE_OBJECT_AND_NAME: {
      if(l) {
        if(r) {
	  if(pl->on) {
	    back = strcmp(pl->on, (char *)r);
	  } else { back = -1; }
	} else { back = 1; }
      } else { if(r) { back = -1; } }
    } break;
    default: {
      pr = (JLO *)r;
      if(l) {
        if(r) {
	  if(pl->on) {
	    if(pr->on) {
	      back = strcmp(pl->on, pr->on);
	    } else { back = 1; }
	  } else {
	    if(pr->on) { back = -1; }
	  }
	} else { back = 1; }
      } else { if(r) { back = -1; } }
    } break;
  }
  
  return back;
}



void
jlread_cn_delete DK_P1(JCN *,j)
{
  
  if(j) {	
    j->n = 0UL; j->o = NULL; j->t = 0;
    dk_delete(j);
  } 
}


JCN *
jlread_cn_new DK_P2(unsigned long, n, JLO *,o)
{
  JCN *back = NULL;
  
  back = dk_new(JCN,1);
  if(back) {
    back->n = n; back->o = o; back->t = JCN_OBJECT;
  } 
  return back;
}



/**	Set default border.
	@param	j	Jlayout job.
	@param	v	Default border setting.
	@return	1 on success, 0 on error.
*/
static
int
default_border DK_P2(JLJ *,j, char *,v)
{
  int back = 0; char *x;
  
  if(j->def_border) {
    x = j->def_border; dk_delete(x); j->def_border = NULL;
  }
  if(v) {
    j->def_border = dkstr_dup(v);
    if(j->def_border) {
      back = 1;
    } else {
      /* ERROR: Memory */
      jlmsg_error_memory(j);
    }
  }
  
  return back;
}



/**	Set default filling.
	@param	j	Jlayout job.
	@param	v	Anchor setting.
	@return	1 on success, 0 on error,
*/
static
int
default_fill DK_P2(JLJ *,j, char *,v)
{
  int back = 0; int i;
  
  j->def_fill = FILL_NOT_SPECIFIED;
  if(v) {
    i = dkstr_array_index(fill_values, v, 0);
    if(i > -1) {
      j->def_fill = i; back = 1;
    } else {
      /* ERROR: Fill not found */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 21);
    }
  }
  
  return back;
}



/**	Set default anchor.
	@param	j	Jlayout job.
	@param	v	Anchor setting.
	@return	1 on success, 0 on error.
*/
static
int
default_anchor DK_P2(JLJ *,j, char *,v)
{
  int back = 0; int i;
  
  j->def_anchor = ANCHOR_NOT_SPECIFIED;
  if(v) {
    i = dkstr_array_index(anchor_values, v, 0);
    if(i > -1) {
      j->def_anchor = i; back = 1;
    } else {
      /* ERROR: Anchor not found */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 22);
    }
  }
  
  return back;
}



/**	Apply an option line.
	@param	j	Jlayout job.
	@param	l	Option line.
*/
static
int
apply_option DK_P2(JLJ *,j, char *,l)
{
  int back = 0;
  char *p1 = NULL, *p2 = NULL, *parts[16];
  size_t nparts; int act;
  
  p1 = l;
  p2 = dkstr_chr(p1, '=');
  if(p2) {
    *(p2++) = '\0';
    p2 = dkstr_start(p2, NULL);
    dkstr_chomp(p1, NULL);
    nparts = dkstr_explode(parts, 15, p1, NULL);
    if(nparts > 0) {
      act = dkstr_find_multi_part_abbr(parts, cmds_for_options, '$', 0);
      switch(act) {
        case 0: {	
	  if(p2) {
	    if(dkstr_is_bool(p2)) {
	      if(dkstr_is_on(p2)) {
	        j->f1 |= F1_USE_TTT_AS_AD;
	      } else {
	        j->f1 &= (~(F1_USE_TTT_AS_AD));
	      }
	      back = 1;
	    } else {
	      /* ERROR: Not a boolean */
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 55);
	    }
	  } else {
	    j->f1 |= F1_USE_TTT_AS_AD;
	    back = 1;
	  }
	} break;
      }
    } else {
      /*  ERROR: Empty key */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 23);
    }
  } else {
    /* ERROR: Not a key/value pair */
    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 24);
  }
  
  return back;
}



/**	Register a used class.
	@param	j	Jlayout job.
	@param	n	Class name.
	@return	1 on success, 0 on error.
*/
static
int
register_used_class DK_P2(JLJ *,j, char *,n)
{
  int back = 0;
  char *x;
  if((j) && (n)) {
    if((j->uc_st) && (j->uc_it)) {
      x = dksto_it_find_like(j->uc_it, (void *)n, 0);
      if(x) {
        back = 1;
      } else {
        x = dkstr_dup(n);
	if(x) {
	  if(dksto_add(j->uc_st, (void *)x)) {
	    back = 1;
	  } else {
	    dk_delete(x);
	  }
	}
      }
    }
  }
  return back;
}



/**	Register default key/value pair.
	@param	j	Jlayout job.
	@param	l	Line containing the setting.
	@return	1 on success, 0 on error.
*/
static
int
apply_default DK_P2(JLJ *,j, char *,l)
{
  int back = 0;
  char *p1 = NULL, *p2 = NULL, *parts[16];
  size_t nparts; int act;
  
  p1 = l;
  p2 = dkstr_chr(p1, '=');
  if(p2) {
    *(p2++) = '\0';
    p2 = dkstr_start(p2, NULL);
    dkstr_chomp(p1, NULL);
    nparts = dkstr_explode(parts, 15, p1, NULL);
    if(nparts > 0) {
      act = dkstr_find_multi_part_abbr(parts, cmds_for_defaults, '$', 0);
      switch(act) {
        case 0: {	
	  back = default_border(j, p2);
	} break;
	case 1: {	
	  back = default_fill(j, p2);
	  if(back) {
	    back = register_used_class(j, str_gridbagconstraints);
	    if(!back) {
	      jlmsg_error_memory(j);
	    }
	  }
	} break;
	case 2: {	
	  back = default_anchor(j, p2);
	  if(back) {
	    back = register_used_class(j, str_gridbagconstraints);
	    if(!back) {
	      jlmsg_error_memory(j);
	    }
	  }
	} break;
      }
    } else {
      /*  ERROR: Empty key */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 23);
    }
  } else {
    /* ERROR: Not a key/value pair */
    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 24);
  }
  
  return back;
}



/**	Process a control instruction.
	@param	j	Jlayout job.
	@param	l	Line to process.
	@return	1 on success, 0 on error.
*/
static
int
apply_control_instruction DK_P2(JLJ *,j, char *,l)
{
  int back = 0;
  char *p1 = NULL, *p2 = NULL;
  
  p1 = l; p1++;
  p1 = dkstr_start(p1, NULL);
  if(p1) {		
    p2 = dkstr_next(p1, NULL);
    switch(dkstr_array_index(control_instructions, p1, 0)) {
      case 0: {
        if(p2) {	
	  back = apply_default(j, p2);
	} else {	
	  /* ERROR: Empty default line */
	  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 25);
	}
      } break;
      case 1: {		
        if(p2) {
	  back = apply_option(j, p2);
	} else {
	  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 53);
	}
      } break;
      default: {	
        /* ERROR: Unknown control instruction */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 26);
      } break;
    }
  } else {		
    /* ERROR: Empty control instruction */
    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 27);
  }
  
  return back;
}



/**	Find object data structure for a given name.
	Create the object if necessary.
	@param	j	Jlayout job.
	@param	n	object name.
	@param	p	Parent object.
	@param	lcr	Line number of object creation.
	@return	Pointer to object on success, NULL on error.
*/
static
JLO *
find_object_for_name DK_P4(JLJ *,j, char *,n, JLO *,p, unsigned long, lcr)
{
  JLO *back = NULL;
  char *i_border; int i_fill, i_anchor;
  
  back = dksto_it_find_like(j->o_it, n, CR_COMPARE_OBJECT_AND_NAME);
  if(back) {
    if(p) {
      if(back->parent) {	
        /* ERROR: Multiple parents for object */
	jlmsg_log3(j, DK_LOG_LEVEL_ERROR, 10, n, 11);
	back = NULL;
      } else {
        back->parent = p;
      }
    }
  } else {
    back = jlo_new(n);
    if(back) {
      back->l_creation = lcr;
      back->parent = p;
      i_border = NULL;
      i_fill = FILL_NOT_SPECIFIED; i_anchor = ANCHOR_NOT_SPECIFIED;
      i_border = j->def_border;
      i_fill = j->def_fill;
      i_anchor = j->def_anchor;
      if(p) {
        if(p->c_border) { i_border = p->c_border; }
        if(p->c_fill != FILL_NOT_SPECIFIED) { i_fill = p->c_fill; }
        if(p->c_anchor != ANCHOR_NOT_SPECIFIED) { i_anchor = p->c_anchor; }
      } else {
        jlmsg_log3(j, DK_LOG_LEVEL_WARNING, 8, n, 9);
      }
      back->fill = i_fill; back->anchor = i_anchor;
      if(i_border) {
        back->border = dkstr_dup(i_border);
	if(!(back->border)) {
	  jlo_delete(back); back = NULL;
	}
      }
      if(back) {
        if(!dksto_add(j->o_st, (void *)back)) {
          jlo_delete(back); back = NULL;
	  /* ERROR: Memory */
	  jlmsg_error_memory(j);
        }
      }
    } else {
      /* ERROR: Memory */
      jlmsg_error_memory(j);
    }
  }
  
  return back;
}





/**	Process an object definition line
	@param	j	Jlayout job.
	@param	l	Text line containing the object definition.
	@return	1 on success, 0 on error.
*/
static
int
apply_object_definition DK_P2(JLJ *,j, char *,l)
{
  int back = 0;
  char *p1 = NULL, *p2 = NULL;
  
  p1 = l;
  p1++; p1 = dkstr_start(p1, NULL);
  if(p1) {
    p2 = dkstr_chr(p1, ']');
    if(p2) {
      *p2 = '\0';
      p2 = dkstr_next(p1, NULL);
      if(p2) {	
	if(register_used_class(j, p1)) {
          j->o_cur = find_object_for_name(j, p2, NULL, j->errlineno);
	  if(j->o_cur) {
	    if(jlo_get_classname(j->o_cur)) {		
	      /* ERROR: Object definition already exists */
	      jlmsg_log3(j, DK_LOG_LEVEL_ERROR, 6, (j->o_cur)->on, 7);
	    } else {					
	      if(jlo_set_classname(j->o_cur, p1)) {
	        back = 1;
	      } else {
	        /* ERROR: Memory */
	        jlmsg_error_memory(j);
	      }
	    }
	  } else {
	    /* Error already handled by find_object_for_name */
	  }
	} else {
	  jlmsg_error_memory(j);
	}
      } else {
        /* ERROR: No object name */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 28);
      }
    } else {
      /* ERROR: No closing square bracket */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 29);
    }
  } else {
    /* ERROR: Empty text */
    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
  }
  
  return back;
}



/**	Add an event listener to an object.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	tp	Event type.
	@param	t	The listener to add.
	@return	1 on success, 0 on error.
*/
static
int
add_one_listener DK_P4(JLJ *,j, JLO *,o, int,tp, char *,t)
{
  int back = 0;
  JLISTENER *jl;
  
  if((j) && (o)) {		
    if(t) {			
      if(!(o->l_st)) {
        o->l_st = dksto_open(0);
        if(o->l_st) {
          dksto_set_comp(o->l_st,compare_listeners,0);
        }
      }
      if(!(o->l_it)) {
        if(o->l_st) {
          o->l_it = dksto_it_open(o->l_st);
        }
      }
      if(!(o->li_st)) {
        o->li_st = dksto_open(0);
        if(o->li_st) {
          dksto_set_comp(o->li_st,compare_listeners_inverted,0);
        }
      }
      if(!(o->li_it)) {
        if(o->li_st) {
          o->li_it = dksto_it_open(o->li_st);
        }
      }
      if((o->l_st) && (o->l_it) && (o->li_st) && (o->li_it)) {
        
        jl = jlo_listener_new(tp, t, o->n_listeners);
        o->n_listeners += 1UL;
        if(jl) {	
          if(dksto_add(o->l_st, (void *)jl)) {
	    
	    if(dksto_add(o->li_st, (void *)jl)) {
	      
	      if((tp >= 0) && (tp <= MAX_LISTENER_INDEX)) {
	        if(tp != LISTENER_TRANSFER_HANDLER) {
		  back = register_used_class(j, listener_classes[tp]);
		} else {
		  back = 1;
		}
	      } else {
	        back = 1;
	      }
	      
	    }
	  } else {
	    jlo_listener_delete(jl); jl = NULL;
	  }
        }
      }
    } else {
      /* ERROR: Empty listener */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 31);
    }
  } 
  return back;
}



/**	Apply border setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Border setting.
	@return	1 on success, 0 on error.
*/
static
int
apply_border DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  char *x;
  if((j) && (o)) {
    if(o->border) {
      x = o->border; dk_delete(x);
    } o->border = NULL;
    back = 1;
    if(v) {
      o->border = dkstr_dup(v);
      if(!(o->border)) { back = 0; }
    }
  }
  return back;
}



/**	Add one contents element to an object.
	@param	j	Jlayout job.
	@param	o	Current (parent) object.
	@param	c	Object to add (child).
	@param	n	Number (ID) of the child object.
	@return	1 on success, 0 on error.
*/
static
int
add_one_contents_element DK_P4(JLJ *,j, JLO *,o, JLO *,c, unsigned long, n)
{
  int back = 0; JCN *jcn = NULL;
  
  if(!(o->c_st)) {
    o->c_st = dksto_open(0);
    if(o->c_st) {
      dksto_set_comp(o->c_st, compare_contents_nodes, 0);
    }
  }
  if(!(o->c_it)) {
    if(o->c_st) {
      o->c_it = dksto_it_open(o->c_st);
    }
  }
  if((o->c_st) && (o->c_it)) {
    jcn = jlread_cn_new(n, c);
    if(jcn) {
      if(dksto_add(o->c_st, (void *)jcn)) {
        back = 1;
	c->parent = o;
      } else {
        jlread_cn_delete(jcn);
      }
    }
  }
  if(!back) {
    /* ERROR: Memory */
    jlmsg_error_memory(j);
  }
  
  return back;
}



/**	Get long number for position and/or size.
	The number can be specified in the text as absolute number
	or relative (``.'', ``+x'', ``-x'').
	@param	s	Text containing the number (absolute or relative).
	@param	r	Base for relative numbers.
	@return	The number.
*/
static
long
get_long_number DK_P2(char *,s, long,r)
{
  int back = -1L;
  long l;
  
  switch(*s) {
    case '.' : {
      back = r;
    } break;
    case '+' : {
      if(sscanf(&(s[1]), "%ld", &l) == 1) {
        back = r + l;
      }
    } break;
    case '-' : {
      if(sscanf(&(s[1]), "%ld", &l) == 1) {
        back = r - l;
      }
    } break;
    default: {
      if(sscanf(s, "%ld", &l) == 1) {
        back = l;
      }
    } break;
  } 
  return back;
}



/**	Apply fill setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Fill setting.
	@return	1 on success, 0 on error.
*/
static
int
apply_fill DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  if((j) && (o)) {
    o->fill = FILL_NOT_SPECIFIED; back = 1;
    if(v) {
      o->fill = dkstr_array_index(fill_values, v, 0);
      if(o->fill == -1) {
        /* ERROR: Fill value */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 21);
	back = 0;
      }
    }
  }
  return back;
}



/**	Apply anchor setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Anchor setting.
	@return	1 on success, 0 on error.
*/
static
int
apply_anchor DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  if((j) && (o)) {
    o->anchor = ANCHOR_NOT_SPECIFIED; back = 1;
    if(v) {
      o->anchor = dkstr_array_index(anchor_values, v, 0);
      if(o->anchor == -1) {
        back = 0;
	/* ERROR: Illegal anchor value */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 22);
      }
    }
  }
  return back;
}



/**	Add information how to add an object to the container.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	s	Further information for adding the object.
	@return	1 on success, 0 on error.
*/
static
int
add_adding_information DK_P3(JLJ *,j, JLO *,o, char *,s)
{
  int back = 0;
  char *newptr = NULL, *cx = NULL, *ptr = NULL, *ptr1 = NULL, *ptr2 = NULL;
  long x = 0L, y = 0L, w = 1L, h = 1L;
  int anchor, fill;
  
  if(o->parent) {		
    switch((o->parent)->layout) {
      case LAYOUT_GRIDBAG: {
        
        if(s) {
	  ptr1 = dkstr_start(s, NULL);
	  if(ptr1) {		
	    ptr2 = dkstr_next(ptr1, NULL);
	    if(ptr2) {		
	      back = 1;
	      anchor = ANCHOR_NOT_SPECIFIED;
	      fill = FILL_NOT_SPECIFIED;
	      ptr = dkstr_next(ptr2, NULL);
	      x = get_long_number(ptr1, (o->parent)->current_x);
	      
	      y = get_long_number(ptr2, (o->parent)->current_y);
	      
	      w = 1L; h = 1L;
	      if(ptr) {		
		ptr1 = ptr; ptr = NULL;
		ptr2 = dkstr_next(ptr1, NULL);
		if(ptr2) {	
		  ptr = dkstr_next(ptr2, NULL);
		}
		if(ptr1) {	
		  w = get_long_number(ptr1, (o->parent)->current_w);
		}
		if(ptr2) {	
		  h = get_long_number(ptr2, (o->parent)->current_h);
		}
		if(ptr) {
		  ptr1 = ptr; ptr = NULL;
		  ptr2 = dkstr_next(ptr1, NULL);
		  if(ptr1) {	
		    if(!apply_anchor(j, o, ptr1)) {
		      back = 0;
		    }
		  }
		  if(ptr2) {	
		    if(!apply_fill(j, o, ptr2)) {
		      back = 0;
		    }
		  }
		}
	      }
	      if((x != -1L) && (y != -1L) && (back)) {
	        if((w > 0L) && (h > 0L)) {
		  o->pos_x = x; o->pos_y = y;
		  o->pos_w = w; o->pos_h = h;
		}
	        (o->parent)->current_x = x;
		(o->parent)->current_y = y;
		if(w > 0L) { (o->parent)->current_w = w; }
		if(h > 0L) { (o->parent)->current_h = h; }
	      }
	    }
	  }
	}
	if(!back) {
	  
	  /* ERROR: Insufficient placement information */
	  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 32);
	}
      } break;
      case LAYOUT_BORDER: {
        
        back = 1;
	if(s) {
	  ptr = dkstr_start(s, NULL);
	  if(ptr) {
	    back = apply_anchor(j, o, ptr);
	  }
	}
      } break;
      case LAYOUT_CARD: {
        
        back = 1;
	if(s) {
	  ptr = dkstr_start(s, NULL);
	  if(ptr) {
	    newptr = dkstr_dup(ptr);
	    if(newptr) {
	      if(o->card_add_text) {
	        cx = o->card_add_text; dk_delete(cx);
	      }
	      o->card_add_text = newptr;
	    } else {
	      back = 0;
	      /* ERROR: Memory */
	      jlmsg_error_memory(j);
	    }
	  }
	}
      } break;
      default: {
        
	switch((o->parent)->ocn) {
	  case CLASS_JTABBEDPANE : {	
	    back = 1;
	    if(s) {
	      ptr1 = dkstr_start(s, NULL);
	      if(ptr1) {		
		ptr2 = dkstr_dup(ptr1);
		if(ptr2) {
		  if(o->card_add_text) {
		    cx = o->card_add_text; dk_delete(cx);
		  } o->card_add_text = ptr2;
		} else {
		  back = 0;
		  /* ERROR: Memory */
		  jlmsg_error_memory(j);
		}
	      }
	    }
	  } break;
	  default: {			
            back = 1;
	    if(s) {
	      if(dkstr_start(s, NULL)) {
	        /* WARNING: Additional info ignored */
		jlmsg_log1(j, DK_LOG_LEVEL_WARNING, 33);
	      }
	    }
	  } break;
	}
      } break;
    }
  } else {		
  }
  
  return back;
}



/**	Apply contents border setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Border setting as text.
	@return	1 on success, 0 on error.
*/
static
int
apply_contents_border DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  char *x;
  if((j) && (o)) {
    if(o->c_border) {
      x = o->c_border; dk_delete(x);
    } o->c_border = NULL;
    back = 1;
    if(v) {
      o->c_border = dkstr_dup(v);
      if(!(o->c_border)) { back = 0; }
    }
  }
  return back;
}



/**	Apply contents fill setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Fill setting text.
	@return	1 on success, 0 on error.
*/
static
int
apply_contents_fill DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  if((j) && (o)) {
    o->c_fill = FILL_NOT_SPECIFIED; back = 1;
    if(v) {
      o->c_fill = dkstr_array_index(fill_values, v, 0);
      if(o->c_fill == -1) {
        /* ERROR: Fill value */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 21);
	back = 0;
      }
    }
  }
  return back;
}



/**	Apply contents anchor setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Contents anchor setting text.
	@return	1 on success, 0 on error.
*/
static
int
apply_contents_anchor DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  if((j) && (o)) {
    o->c_anchor = ANCHOR_NOT_SPECIFIED; back = 1;
    if(v) {
      o->c_anchor = dkstr_array_index(anchor_values, v, 0);
      if(o->c_anchor == -1) {
        back = 0;
	/* ERROR: Illegal anchor value */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 22);
      }
    }
  }
  return back;
}


/**	Apply a layout type.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Layout name.
	@return	1 on success, 0 on error.
*/
static
int
apply_layout DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  char *ptr1, *ptr2;
  long l1;
  int class_to_register;
  
  if((j) && (o)) {
    o->layout = LAYOUT_NOT_SPECIFIED;
    if(v) {
      ptr1 = dkstr_start(v, NULL);
      if(ptr1) {
        back = 1;
        ptr2 = dkstr_next(ptr1, NULL);
        o->layout = dkstr_array_index(layout_values, v, 0);
        if(o->layout == -1) {	
          back = 0;
	  /* ERROR: Illegal layout value */
	  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 34);
        } else {
	  class_to_register = 0;
	  switch(o->layout) {
	    case LAYOUT_GRIDBAG: {
	      j->f1 |= F1_HAVE_GRIDBAG;
	    } break;
	    case LAYOUT_GRID: {
	      class_to_register = 5;
	      o->grid_layout_r = o->grid_layout_c = 0L;
	      if(ptr2) {
	        ptr1 = dkstr_next(ptr2, NULL);
		if(ptr1) {	/* rows columns */
		  if(sscanf(ptr2, "%ld", &l1) == 1) {
		    o->grid_layout_r = l1;
		    if(sscanf(ptr1, "%ld", &l1) == 1) {
		      o->grid_layout_c = l1;
		    } else {
		      /* ERROR: Not a number */
		      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
		      back = 0;
		    }
		  } else {
		    /* ERROR: Not a number */
		    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
		    back = 0;
		  }
		} else {	/* columns */
		  if(sscanf(ptr2, "%ld", &l1) == 1) {
		    o->grid_layout_c = l1;
		  } else {
		    /* ERROR: Not a number */
		    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
		    back = 0;
		  }
		}
	      }
	    } break;
	    case LAYOUT_GROUP: {
	      class_to_register = 6;
	      back = 0;
	      /* ERROR: GroupLayout not supported */
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 36);
	    } break;
	    case LAYOUT_SPRING: {
	      class_to_register  = 7;
	      back = 0;
	      /* ERROR: SpringLayout not supported */
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 37);
	    } break;
	    case LAYOUT_CARD: { class_to_register = 1; } break;
	    case LAYOUT_BORDER: { class_to_register = 2; } break;
	    case LAYOUT_BOX_X: case LAYOUT_BOX_Y: case LAYOUT_BOX_PAGE: case LAYOUT_BOX_LINE:
	    { class_to_register = 3; } break;
	    case LAYOUT_FLOW: { class_to_register = 4; } break;
	  }
	  if(back) {
	    if(!register_used_class(j, layout_classes[class_to_register])) {
	      back = 0; jlmsg_error_memory(j);
	    }
	  }
        }
      } else {
      }
    }
  } else {	
  }
  
  return back;
}



/**	Add a contents node to the current object.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	jcn	Contents node for one contents object.
	@return	1 on success, 0 on error.
*/
static
int
add_jcn DK_P3(JLJ *,j, JLO *,o, JCN *,jcn)
{
  int back = 0;
  
  if(!(o->c_st)) {
    o->c_st = dksto_open(0);
    if(o->c_st) {
      dksto_set_comp(o->c_st, compare_contents_nodes, 0);
    }
  }
  if(!(o->c_it)) {
    if(o->c_st) {
      o->c_it = dksto_it_open(o->c_st);
    }
  }
  if((o->c_st) && (o->c_it)) {
    if(dksto_add(o->c_st, (void *)jcn)) {
      back = 1;
    }
  } 
  return back;
}



/**	Add remaining text to contents node (IGNORED).
	If there is additional text after contents element name
	and position + size we could store it and use it - but how.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	jcn	Contents node.
	@param	t	Text to add.
	@return	1 on success, 0 on error.
*/
static
int
add_remaining_text_to_jcn DK_P4(JLJ *,j, JLO *,o, JCN *,jcn, char *,t)
{
  int back = 1;
  /* ## no idea yet for remaining text ## */
  return back;
}



/**	Apply contents.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Contents element name, optionally followed by position and size.
*/
static
int
apply_contents DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; int i;
  JLO *jlo = NULL; JCN *jcn = NULL;
  char *p1, *p2;
  
  if((j) && (o) && (v)) {
    p1 = dkstr_start(v, NULL);
    if(p1) {
      if(*p1 == '$') {	
        p2 = dkstr_next(p1, NULL);
	i = dkstr_array_index(cmd_specials, &(p1[1]), 0);
	if(i > -1) {
	  jcn = dk_new(JCN,1);
	  if(jcn) {
	    back = 1;
	    jcn->n = o->n_c;
	    o->n_c += 1UL;
	    jcn->t = JCN_GLUE;
	    switch(i) {
	      case 0: { 
	        jcn->t = JCN_GLUE;
		back = register_used_class(j, str_class_box);
	      } break;
	      case 1: {
	        jcn->t = JCN_SEPARATOR;
	      } break;
	    }
	    jcn->o = NULL;
	    if(p2) {
	      back = add_remaining_text_to_jcn(j, o, jcn, p2);
	    }
	    if(back) {
	      back = add_jcn(j, o, jcn);
	      if(!back) {
	        dk_delete(jcn); jcn = NULL;
	      }
	    }
	  }
	}
      } else {		
        p2 = dkstr_next(p1, NULL);
        jlo = find_object_for_name(j, p1, o, j->errlineno);
        if(jlo) {
          back = add_one_contents_element(j, o, jlo, o->n_c);
	  o->n_c += 1UL;
	  if(p2) {
	    back = add_adding_information(j, jlo, p2);
	  }
        }
      }
    } else {		
    }
  } 
  return back;
}



/**	Apply size setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Size.
	@param	cr	Size type: 2=maximum, 1=preferred, 0=minimum.
	@return	1 on success, 0 on error.
*/
static
int
apply_size DK_P4(JLJ *,j, JLO *,o, char *,v, int,cr)
{
  int back = 0;
  long l;
  char *p1, *p2;
  if((j) && (o)) {
    if(v) {
      p1 = dkstr_start(v, NULL);
      if(p1) {
        p2 = dkstr_next(p1, NULL);
	if(sscanf(p1, "%ld", &l) == 1) {
	  back = 1;
	  switch(cr) {
	    case 2: {
	      o->s_max_x = l;
	    } break;
	    case 1: {
	      o->s_pref_x = l;
	    } break;
	    default: {
	      o->s_min_x = l;
	    } break;
	  }
	  if(p2) {
	    if(sscanf(p2, "%ld", &l) == 1) {
	      switch(cr) {
	        case 2: {
	          o->s_max_y = l;
	        } break;
	        case 1: {
	          o->s_pref_y = l;
	        } break;
	        default: {
	          o->s_min_y = l;
	        } break;
	      }
	    } else {
	      back = 0;
	      /* ERROR: Not a number */
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
	    }
	  } else {
	    switch(cr) {
	      case 2: {
	        o->s_max_y = l;
	      } break;
	      case 1: {
	        o->s_pref_y = l;
	      } break;
	      default: {
	        o->s_min_y = l;
	      } break;
	    }
	  }
	} else {
	  /* ERROR: Not a number */
	  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
	}
      } else {
        /* ERROR: Empty string */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
      }
    } else {
      /* ERROR: Empty string */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  }
  return back;
}



/**	Apply weight setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Component weight.
	@return	1 on success, 0 on error.
*/
static
int
apply_weight DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  double x;
  char *p1, *p2;
  if((j) && (o)) {
    if(v) {
    p1 = dkstr_start(v, NULL);
    if(p1) {
      p2 = dkstr_next(p1, NULL);
      if(sscanf(p1, "%lf", &x) == 1) {
        o->weightx = x;
	back = 1;
	if(p2) {
	  if(sscanf(p2, "%lf", &x) == 1) {
	    o->weighty = x;
	  } else {
	    /* ERROR: Not a number */
	    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
	    back = 0;
	  }
	} else {
	  o->weighty = x;
	}
      } else {
        /* ERROR: Not a number */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
      }
    } else {
      /* ERROR: Empty string */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  } else {
    /* ERROR: Empty string */
    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
  }
  }
  return back;
}



/**	Apply horizontal text position setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Text position.
	@return	1 on success, 0 on error.
*/
static
int
apply_horizontal_text_position DK_P3(JLJ *,j, JLO *,o, char *,v) {
  int back = 0;
  if((j) && (o)) {
    if(v) {
      o->h_textpos = dkstr_array_index(horizontal_text_positions, v, 0);
      if(o->h_textpos != -1) {
        back = register_used_class(j, str_swing_constants);
	if(back == 0) { jlmsg_error_memory(j); }
      } else {
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 60);
      }
    } else {
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  }
  return back;
}



/**	Apply vertical text position setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Vertical text position.
	@return	1 on success, 0 on error.
*/
static
int
apply_vertical_text_position DK_P3(JLJ *,j, JLO *,o, char *,v) {
  int back = 0;
  if((j) && (o)) {
    if(v) {
      o->v_textpos = dkstr_array_index(vertical_text_positions, v, 0);
      if(o->v_textpos != -1) {
        back = register_used_class(j, str_swing_constants);
	if(back == 0) { jlmsg_error_memory(j); }
      } else {
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 60);
      }
    } else {
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  }
  return back;
}



/**	Apply border weight setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Border weights.
	@return	1 on success, 0 on error.
*/
static
int
apply_border_weight DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  double f = 0.0;
  char *p1, *p2;
  if((j) && (o)) {
    if(v) {
      p1 = dkstr_start(v, NULL);
      if(p1) {
        p2 = dkstr_next(p1, NULL);
	if(sscanf(p1, "%lf", &f) == 1) {
	  o->weightt = o->weightl = o->weightr = o->weightb = f;
	  back = 1;
	  if(p2) {
	    p1 = dkstr_next(p2, NULL);
	    if(sscanf(p2, "%lf", &f) == 1) {
	      o->weightl = o->weightr = o->weightb = f;
	      if(p1) {
	        p2 = dkstr_next(p1, NULL);
		if(sscanf(p1, "%lf", &f) == 1) {
		  o->weightr = o->weightb = f;
		  if(p2) {
		    if(sscanf(p2, "%lf", &f) == 1) {
		      o->weightb = f;
		    } else {
		      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
		      back = 0;
		    }
		  }
		} else {
		  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
		  back = 0;
		}
	      }
	    } else {
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
	      back = 0;
	    }
	  }
	} else {
	  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 56);
	}
      } else {
        jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
      }
    } else {
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  }
  return back;
}



/**	Apply menu bar setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Name of the menu bar object.
	@return	1 on success, 0 on error.
*/
static
int
apply_menubar DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  char *p1, *p2;
  JLO *jlo;
  
  if((j) && (o) && (v)) {
    p1 = dkstr_start(v, NULL);
    if(p1) {
      p2 = dkstr_next(p1, NULL);
      jlo = find_object_for_name(j, p1, o, j->errlineno);
      if(jlo) {
        o->menubar = jlo;
	back = 1;
	if(p2) {		
	}
      }
    } else {			
    }
  }
  
  return back;
}


/**	Apply horizontal alignment setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Horizontal alignment setting as string.
	@return	1 on success, 0 on error.
*/
static
int
apply_horizontal_alignment DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  if((j) && (o)) {
    if(v) {
      o->h_align = dkstr_array_index(h_align_types, v, 0);
      if(o->h_align != -1) {
        back = register_used_class(j, str_swing_constants);
	if(back == 0) { jlmsg_error_memory(j); }
      } else {
        /* ERROR: Unknown horizontal alignment */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 57);
      }
    } else {
      /* ERROR: Empty value */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  }
  return back;
}



/**	Apply vertical alignment setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Vertical alignment setting as string.
	@return	1 on success, 0 on error.
*/
static
int
apply_vertical_alignment DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  if((j) && (o)) {
    if(v) {
      o->h_align = dkstr_array_index(v_align_types, v, 0);
      if(o->h_align != -1) {
        back = register_used_class(j, str_swing_constants);
	if(back == 0) { jlmsg_error_memory(j); }
      } else {
        /* ERROR: Unknown vertical alignment */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 57);
      }
    } else {
      /* ERROR: Empty value */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  }
  return back;
}



/**	Apply default close operation setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Close operation.
	@return	1 on success, 0 on error.
*/
static
int
apply_default_close_operation DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  if((j) && (o)) {
    if(v) {
      o->def_close = dkstr_array_index(close_operations, v, 0);
      if(o->def_close != -1) {
        back = register_used_class(j, str_windowconstants);
	if(!back) {
	  jlmsg_error_memory(j);
	}
      } else {
        /* ERROR: Unknown vertical alignment */
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 57);
      }
    } else {
      /* ERROR: Empty value */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 30);
    }
  }
  return back;
}



/**	Apply action command setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Action command.
	@return	1 on success, 0 on error.
*/
static
int
apply_action_command DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; char *x;
  if((j) && (o)) {
    if(o->action_cmd) {
      x = o->action_cmd; dk_delete(x);
      /* WARNING: text definition overwrites previous setting */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 38);
    } o->action_cmd = NULL;
    back = 1;
    if(v) {
      o->action_cmd = dkstr_dup(v);
      if(!(o->action_cmd)) {
        back = 0;
	/* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    }
  }
  return back;
}



/**	Apply tool tip text.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Tool tip text.
	@return	1 on success, 0 on error.
*/
static
int
apply_tool_tip_text DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; char *x;
  if((j) && (o)) {
    if(o->tt_text) {
      x = o->tt_text; dk_delete(x);
      /* WARNING: text definition overwrites previous setting */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 38);
    } o->tt_text = NULL;
    back = 1;
    if(v) {
      o->tt_text = dkstr_dup(v);
      if(!(o->tt_text)) {
        back = 0;
	/* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    }
  }
  return back;
}



/**	Apply title.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Title.
	@return	1 on success, 0 on error.
*/
static
int
add_title DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; char *x;
  if((j) && (o)) {
    if(o->title) {
      x = o->title; dk_delete(x);
      /* WARNING: text definition overwrites previous setting */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 38);
    } o->title = NULL;
    back = 1;
    if(v) {
      o->title = dkstr_dup(v);
      if(!(o->title)) {
        back = 0;
	/* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    }
  }
  return back;
}



/**	Apply accessible description setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Accessible description setting.
	@return	1 on success, 0 on error.
*/
static
int
apply_accessible_description DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; char *x;
  if((j) && (o)) {
    if(o->acd_text) {
      x = o->acd_text; dk_delete(x);
      /* WARNING: text definition overwrites previous setting */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 38);
    } o->acd_text = NULL;
    back = 1;
    if(v) {
      o->acd_text = dkstr_dup(v);
      if(!(o->acd_text)) {
        back = 0;
	/* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    }
  }
  return back;
}



/**	Apply text setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Text.
	@return	1 on success, 0 on error.
*/
static
int
apply_text DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; char *x;
  if((j) && (o)) {
    if(o->text) {
      x = o->text; dk_delete(x);
      /* WARNING: text definition overwrites previous setting */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 38);
    } o->text = NULL;
    back = 1;
    if(v) {
      o->text = dkstr_dup(v);
      if(!(o->text)) {
        back = 0;
	/* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    }
  }
  return back;
}



/**	Apply icon file name setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Icon file name.
	@return	1 on success, 0 on error.
*/
static
int
apply_icon_file_name DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  char *ptr1, *ptr2, *x;
  
  if((j) && (o)) {
    if(v) {
      ptr1 = dkstr_start(v, NULL);
      if(ptr1) {
        ptr2 = dkstr_dup(ptr1);
	if(ptr2) {
	  if(o->icon_file) {
	    x = o->icon_file; dk_delete(x);
	  } o->icon_file = ptr2;
	  back = 1;
	} else {
	  /* ERROR: Memory */
	  jlmsg_error_memory(j);
	}
      }
    }
  }
  
  return back;
}



/**	Apply constructor setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Constructor argument.
	@return	1 on success, 0 on error.
*/	
static
int
apply_constructor DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; char *x;
  if((j) && (o)) {
    if(o->constructor) {
      x = o->constructor; dk_delete(x);
      /* WARNING: Constructor definition overrides previous setting */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 38);
    } o->constructor = NULL;
    back = 1;
    if(v) {
      o->constructor = dkstr_dup(v);
      if(!(o->constructor)) {
        back = 0;
	/* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    }
  }
  return back;
}



/**	Apply text width setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Width setting.
	@return	1 on success, 0 on error.
*/
static
int
apply_text_width DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0; char *x;
  if((j) && (o)) {
    if(o->tf_width) {
      x = o->tf_width; dk_delete(x);
      /* WARNING: New width setting overrides previous setting */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 38);
    } o->tf_width = NULL;
    back = 1;
    if(v) {
      o->tf_width = dkstr_dup(v);
      if(!(o->tf_width)) {
        back = 0;
	/* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    }
  }
  return back;
}



/**	Apply button group name.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Button group name.
	@return	1 on success, 0 on error.
*/
static
int
apply_button_group DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  JSG *g;
  
  if((j) && (o)) {
    if(v) {
      g = dksto_it_find_like(j->b_it, (void *)v, CR_COMPARE_OBJECT_AND_NAME);
      if(!g) {
        g = jsg_new(v);
	if(g) {
	  if(!dksto_add(j->b_st, (void *)g)) {
	    jsg_delete(g); g = NULL;
	  }
	}
      }
      if(g) {
        if(dksto_add(g->s, (void *)o)) {
	  back = 1;
	  j->f1 |= F1_HAVE_BUTTON_GROUPS;
	}
      }
      if(!back) {
        /* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    } else {
      /* ERROR: Missing group name */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 39);
    }
  }
  
  return back;
}



/**	Apply use content pane setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	String containing boolean value.
	@return	1 on success, 0 on error.
*/
static
int
apply_use_content_pane DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 1;
  if(v) {
    if(dkstr_is_bool(v)) {
      if(dkstr_is_on(v)) {
        o->f2 |= F2_USE_CONTENT_PANE;
	back = register_used_class(j, str_Container);
	if(!back) { jlmsg_error_memory(j); }
      } else {
        o->f2 &= (~(F2_USE_CONTENT_PANE));
      }
    } else {
      back = 0;
      /* ERROR: Not a boolean */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 40);
    }
  } else {
    o->f2 |= F2_USE_CONTENT_PANE;
    back = register_used_class(j, str_Container);
    if(!back) { jlmsg_error_memory(j); }
  }
  return back;
}



/**	Apply component border setting.
	@param	j	Jlayout job
	@param	o	Current object.
	@param	v	Component border description.
	@return	1 on success, 0 on error.
*/
static
int
apply_component_border DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  char *p1, *p2, *p3, *p4, *p5;
  int i;
  
  if((j) && (o) && (v)) {
    if(o->border_type == BORDER_NOT_SPECIFIED) {	
      p1 = dkstr_start(v, NULL);
      if(p1) {
        p2 = dkstr_next(p1, NULL);
        back = 1;
        switch(dkstr_array_index(border_types, p1, 0)) {
          case 0: {	/* empty */
	    o->border_type = BORDER_EMPTY;
	    if(p2) {
	      p3 = dkstr_next(p2, NULL);
	      if(sscanf(p2, "%d", &i) == 0) {
	        o->bo_top = o->bo_left = o->bo_right = o->bo_bottom = i;
		p2 = p3;
		if(p2) {
		  p3 = dkstr_next(p2, NULL);
		  if(sscanf(p2, "%d", &i) == 0) {
		    o->bo_left = i;
		    p2 = p3;
		    if(p2) {
		      if(p2) {
		        p3 = dkstr_next(p2, NULL);
			if(sscanf(p2, "%d", &i) == 0) {
			  o->bo_right = i;
			  p2 = p3;
			  if(p2) {
			    if(sscanf(p2, "%d", &i) == 0) {
			      o->bo_bottom = i;
			    } else {
			      back = 0;
			      /* ERROR: Not a number */
			      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
			    }
			  }
			} else {
			  back = 0;
			  /* ERROR: Not a number */
			  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
			}
		      }
		    }
		  } else {
		    back = 0;
		    /* ERROR: Not a number */
		    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
		  }
		}
	      } else {
	        back = 0;
	        /* ERROR: Not a number */
		jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
	      }
	    }
	  } break;
          case 1: {	/* etched */
	    o->border_type = BORDER_ETCHED_LOWERED;
	    if(p2) {
	      switch(dkstr_array_index(border_sub_types, p2, 0)) {
	        case 0: {
	          o->border_type = BORDER_ETCHED_LOWERED;
		  back = register_used_class(j, str_etched_border);
		  if(back == 0) { jlmsg_error_memory(j); }
	        } break;
	        case 1: {
	          o->border_type = BORDER_ETCHED_RAISED;
		  back = register_used_class(j, str_etched_border);
		  if(back == 0) { jlmsg_error_memory(j); }
	        } break;
	        default: {
	          back = 0;
		  /* ERROR: Unknown sub type */
		  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 41);
	        } break;
	      }
	    }
	  } break;
          case 2: {	/* bevel */
	    o->border_type = BORDER_BEVEL_LOWERED;
	    if(p2) {
	      switch(dkstr_array_index(border_sub_types, p2, 0)) {
	        case 0: {
	          o->border_type = BORDER_BEVEL_LOWERED;
	        } break;
	        case 1: {
	          o->border_type = BORDER_BEVEL_RAISED;
	        } break;
	        default: {
	          back = 0;
		  /* ERROR: Unknown sub type */
		  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 41);
	        } break;
	      }
	    }
	  } break;
          case 3: {	/* line */
	    o->border_type = BORDER_LINE;
	    if(p2) {
	      p3 = dkstr_next(p2, NULL);
              p4 = dkstr_dup(p2);
	      if(p4) {
	        if(o->border_text) {
		  p5 = o->border_text; dk_delete(p5);
		}
		o->border_text = p4;
		if(p3) {
		  if(sscanf(p3, "%d", &i) == 1) {
		    o->bo_top = i;
		  } else {
		    back = 0;
		    /* ERROR: Not a number */
		    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
		  }
		}
	      } else {
	        back = 0;
		/* ERROR: Memory */
		jlmsg_error_memory(j);
	      }
	    } else {
	      back = 0;
	      /* ERROR: Missing color */
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 42);
	    }
	  } break;
          case 4: {	/* matte */
	    
	    o->border_type = BORDER_MATTE;
	    back = 0;
	    if(p2) {			
	      p3 = dkstr_next(p2, NULL);
	      if(sscanf(p2, "%d", &i) == 1) {
	        o->bo_top = i;
		p2 = p3;
		if(p2) {		
		  p3 = dkstr_next(p2, NULL);
		  if(sscanf(p2, "%d", &i) == 1) {
		    o->bo_left = i;
		    p2 = p3;
		    if(p2) {		
		      p3 = dkstr_next(p2, NULL);
		      if(sscanf(p2, "%d", &i) == 1) {
		        o->bo_right = i;
			p2 = p3;
			if(p2) {	
			  p3 = dkstr_next(p2, NULL);
			  if(sscanf(p2, "%d", &i) == 1) {
			    o->bo_bottom = i;
			    p2 = p3;
			    if(p2) {	
			      p3 = dkstr_chr(p2, ':');
			      if(p3) {	
			        *(p3++) = '\0';
				p3 = dkstr_start(p3, NULL);
				if(p3) {	
				  o->border_subtype = dkstr_array_index(
				    cmd_icon_color, p2, 0
				  );
				  if(o->border_subtype > -1) {
				    p4 = dkstr_dup(p3);	
				    if(p4) {		
				      if(o->border_text) {
				        p5 = o->border_text; dk_delete(p5);
				      }
				      o->border_text = p4; back = 1;
				    } else {
				      /* ERROR: Memory */
				      jlmsg_error_memory(j);
				    }
				  } else {
				    /* ERROR: Must be icon: or color: */
				    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 43);
				  }
				} else {
				  /* ERROR: Missing icon: or color: */
				  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 43);
				}
			      } else {
			        /* ERROR: must be icon: or color: */
				jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 43);
			      }
			    } else {
			      /* ERROR: Too few arguments */
			      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 44);
			    }
			  } else {
			    /* ERROR: Not a number */
			    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
			  }
			} else {
			  /* ERROR: Too few arguments */
			  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 44);
			}
		      } else {
		        /* ERROR: Not a number */
			jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
		      }
		    } else {
		      /* ERROR: Too few arguments */
		      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 44);
		    }
		  } else {
		    /* ERROR: Not a number */
		    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
		  }
		} else {
		  /* ERROR: Too few arguments */
		  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 44);
		}
	      } else {
	        /* ERROR: Not a number */
		jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 35);
	      }
	    } else {
	      /* ERROR: Too few arguments */
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 44);
	    }
	  } break;
          case 5: {	/* titled */
	    o->border_type = BORDER_TITLED;
	    if(p2) {
	      p3 = dkstr_dup(p2);
	      if(p3) {
	        if(o->border_text) {
	          p4 = o->border_text; dk_delete(p4);
	        }
	        o->border_text = p3;
		back = register_used_class(j, str_titled_border);
		if(back == 0) { jlmsg_error_memory(j); }
	      } else {
	        back = 0;
	        /* ERROR: Memory */
		jlmsg_error_memory(j);
	      }
	    } else {
	      back = 0;
	      /* ERROR: No title specified */
	      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 45);
	    }
	  } break;
	  default: {
	    back = 0;
	    /* ERROR: Unknown component border type */
	    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 46);
	  } break;
        }
      }
    } else {
      /* ERROR: Border type already specified */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 47);
    }
    if(back) {
      if(!register_used_class(j, str_borderfactory)) {
        back = 0; jlmsg_error_memory(j);
      }
    }
  } 
  return back;
}



/**	Apply enabled setting.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	String containing a boolean value.
	@return	1 on success, 0 on error.
*/
static
int
apply_enabled DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 1;
  if(v) {
    if(dkstr_is_bool(v)) {
      if(dkstr_is_on(v)) {
        o->enab = ENABLED_YES;
      } else {
        o->enab = ENABLED_NO;
      }
    }
  }
  return back;
}



/**	Assign a size group to an object.
	@param	j	Jlayout job.
	@param	o	Current object.
	@param	v	Size group name.
	@return	1 on success, 0 on error.
*/
static
int
apply_size_group DK_P3(JLJ *,j, JLO *,o, char *,v)
{
  int back = 0;
  JSG *g;
  if((j) && (o)) {
    if(v) {
      g = dksto_it_find_like(j->g_it, (void *)v, CR_COMPARE_OBJECT_AND_NAME);
      if(!g) {
        g = jsg_new(v);
	if(g) {
	  if(!dksto_add(j->g_st, (void *)g)) {
	    jsg_delete(g); g = NULL;
	  }
	}
      }
      if(g) {
        if(dksto_add(g->s, (void *)o)) {
	  j->f1 |= F1_HAVE_SIZE_GROUP;
	  back = register_used_class(j, str_jcomponent);
	  if(!back) {
	    jlmsg_error_memory(j);
	  }
	}
      }
      if(!back) {
        /* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    } else {
      /* ERROR: Missing group name */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 48);
    }
  }
  return back;
}



/**	Process an attribute line (key=value).
	@param	j	Jlayout job.
	@param	l	Input line.
	@return	1 on success, 0 on error.
*/
static
int
apply_object_attribute DK_P2(JLJ *,j, char *,l)
{
  int back = 0;
  char *p1, *p2, *p3, *p4, *xdel, *parts[16]; size_t nparts; int act;
  
  p1 = l;
  p2 = dkstr_chr(p1, '=');
  if(p2) {
    *(p2++) = '\0';
    p2 = dkstr_start(p2, NULL);

    if(p2) {

      dkstr_chomp(p1, NULL);
      nparts = dkstr_explode(parts, 15, p1, NULL);
      if(nparts > 0) {
        act = dkstr_find_multi_part_abbr(parts, cmd_for_objects, '$', 0);
        switch(act) {
          case 0: {	/* border */
	    back = apply_border(j, j->o_cur, p2);
	  } break;
          case 1: {	/* fill */
	    back = apply_fill(j, j->o_cur, p2);
	    if(back) {
	      back = register_used_class(j, str_gridbagconstraints);
	      if(!back) {
	        jlmsg_error_memory(j);
	      }
	    }
	  } break;
          case 2: {	/* anchor */
	    back = apply_anchor(j, j->o_cur, p2);
	    if(back) {
	      back = register_used_class(j, str_gridbagconstraints);
	      if(!back) {
	        jlmsg_error_memory(j);
	      }
	    }
	  } break;
          case 3: {	/* contents border */
	    back = apply_contents_border(j, j->o_cur, p2);
	  } break;
          case 4: {	/* contents fill */
	    back = apply_contents_fill(j, j->o_cur, p2);
	  } break;
          case 5: {	/* contents anchor */
	    back = apply_contents_anchor(j, j->o_cur, p2);
	  } break;
          case 6: {	/* action listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_ACTION, p2);
	  } break;
          case 7: {	/* item listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_ITEM, p2);
	  } break;
          case 8: {	/* window listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_WINDOW, p2);
	  } break;
	  case 9: {
	    back = apply_layout(j, j->o_cur, p2);
	  } break;
	  case 10: {
	    back = apply_contents(j, j->o_cur, p2);
	  } break;
	  case 11: {
	    if((j->o_cur)->ocn == CLASS_JPANEL) {		
	      if(p2) {			
	        if((j->o_cur)->border_type == BORDER_NOT_SPECIFIED) {
	          p3 = dkstr_dup(p2);
		  if(p3) {		
		    if((j->o_cur)->border_text) {
		      /* Warning: Border text already defined */
		      jlmsg_log1(j, DK_LOG_LEVEL_WARNING, 38);
		      p4 = (j->o_cur)->border_text;
		      dk_delete(p4);
		    }
		    (j->o_cur)->border_text = p3;
		    (j->o_cur)->border_type = BORDER_TITLED;
		    back = 1;
		  } else {
		    /* ERROR: Memory */
		    jlmsg_error_memory(j);
		  }
	        } else {
	          /* ERROR: Border already specified */
		  jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 47);
	        }
	      } else {
	        /* ERROR: No text */
	        jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 48);
	      }
	    } else {			
	      back = apply_text(j, j->o_cur, p2);
	    }
	  } break;
	  case 12: {
	    back = apply_constructor(j, j->o_cur, p2);
	  } break;
	  case 13: {
	    back = apply_text_width(j, j->o_cur, p2);
	  } break;
	  case 14: {
	    back = apply_size_group(j, j->o_cur, p2);
	  } break;
	  case 15: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_CARET, p2);
	  } break;
	  case 16: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_CHANGE, p2);
	  } break;
	  case 17: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_COMPONENT, p2);
	  } break;
	  case 18: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_CONTAINER, p2);
	  } break;
	  case 19: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_DOCUMENT, p2);
	  } break;
	  case 20: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_FOCUS, p2);
	  } break;
	  case 21: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_INTERNAL_FRAME, p2);
	  } break;
	  case 22: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_KEY, p2);
	  } break;
	  case 23: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_LIST_DATA, p2);
	  } break;
	  case 24: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_LIST_SELECTION, p2);
	  } break;
	  case 25: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_MOUSE, p2);
	  } break;
	  case 26: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_MOUSE_MOTION, p2);
	  } break;
	  case 27: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_MOUSE_WHEEL, p2);
	  } break;
	  case 28: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_PROPERTY_CHANGE, p2);
	  } break;
	  case 29: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_TABLE_MODEL, p2);
	  } break;
	  case 30: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_TREE_EXPANSION, p2);
	  } break;
	  case 31: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_TREE_MODEL, p2);
	  } break;
	  case 32: {	/* listener */
	    back = add_one_listener(j, j->o_cur, LISTENER_TREE_SELECTION, p2);
	  } break;
	  case 33: {
	    back = add_one_listener(j, j->o_cur, LISTENER_TREE_WILL_EXPAND, p2);
	  } break;
	  case 34: {
	    back = add_one_listener(j, j->o_cur, LISTENER_UNDOABLE_EDIT, p2);
	  } break;
	  case 35: {
	    back = apply_icon_file_name(j, j->o_cur, p2);
	    j->f1 |= F1_HAVE_ICON_FILE_NAMES;
	    if(back) {
	      back = register_used_class(j, str_imageicon);
	      if(!back) {
	        jlmsg_error_memory(j);
	      }
	    }
	  } break;
	  case 36: {
	    back = apply_button_group(j, j->o_cur, p2);
	    if(back) {
	      back = register_used_class(j, str_button_group);
	      if(!back) {
	        jlmsg_error_memory(j);
	      }
	    }
	  } break;
	  case 37: {
	    back = apply_component_border(j, j->o_cur, p2);
	  } break;
	  case 38: {
	    back= apply_use_content_pane(j, j->o_cur, p2);
	  } break;
	  case 39: {
	    back = apply_menubar(j, j->o_cur, p2);
	  } break;
	  case 40: {
	    back = apply_weight(j, j->o_cur, p2);
	  } break;
	  case 41: {
	    back = apply_size(j, j->o_cur, p2, 0);
	  } break;
	  case 42: {
	    back = apply_size(j, j->o_cur, p2, 1);
	  } break;
	  case 43: {
	    back = apply_size(j, j->o_cur, p2, 2);
	  } break;
	  case 44: {
	    back = apply_tool_tip_text(j, j->o_cur, p2);
	  } break;
	  case 45: {
	    back = apply_accessible_description(j, j->o_cur, p2);
	  } break;
	  case 46: {
	    back = apply_action_command(j, j->o_cur, p2);
	  } break;
	  case 47: {
	    back = apply_horizontal_alignment(j, j->o_cur, p2);
	  } break;
	  case 48: {
	    back = apply_vertical_alignment(j, j->o_cur, p2);
	  } break;
	  case 49: {
	    back = add_one_listener(j, j->o_cur, LISTENER_TRANSFER_HANDLER, p2);
	  } break;
	  case 50: {
	    back = add_title(j, j->o_cur, p2);
	  } break;
	  case 51: {
	    back = apply_default_close_operation(j, j->o_cur, p2);
	  } break;
	  case 52: {
	    back = apply_enabled(j, j->o_cur, p2);
	  } break;
	  case 53: {	/* font */
	    if(p2) {
	      if((j->o_cur)->font) {
	        xdel = (j->o_cur)->font; dk_delete(xdel);
	      }
	      (j->o_cur)->font = dkstr_dup(p2);
	      if((j->o_cur)->font) {
	        back = register_used_class(j, str_class_font);
	      } else { jlmsg_error_memory(j); }
	    }
	  } break;
	  case 54: {	/* foreground */
	    if(p2) {
	      if((j->o_cur)->foreground) {
	        xdel = (j->o_cur)->foreground; dk_delete(xdel);
	      }
	      (j->o_cur)->foreground = dkstr_dup(p2);
	      if((j->o_cur)->foreground) {
	        back = register_used_class(j, str_class_color);
	      } else { jlmsg_error_memory(j); }
	    }
	  } break;
	  case 55: {	/* background */
	    if(p2) {
	      if((j->o_cur)->background) {
	        xdel = (j->o_cur)->background; dk_delete(xdel);
	      }
	      (j->o_cur)->background = dkstr_dup(p2);
	      if((j->o_cur)->background) {
	        back = register_used_class(j, str_class_color);
	      } else { jlmsg_error_memory(j); }
	    }
	  } break;
	  case 56: {	/* font style */
	    
	    if(p2) {
	      if(strstr(p2, "-bold")) {
	        (j->o_cur)->font_changes |= 0x02;
	      } else {
	        if(strstr(p2, "bold")) {
		  (j->o_cur)->font_changes |= 0x01;
		}
	      }
	      if(strstr(p2, "-italic")) {
	        (j->o_cur)->font_changes |= 0x08;
	      } else {
	        if(strstr(p2, "italic")) {
		  (j->o_cur)->font_changes |= 0x04;
		}
	      }
	      back = 1;
	      if((j->o_cur)->font_changes) {
		j->f1 |= F1_HAVE_FONT_STYLE;
	        if(register_used_class(j, str_class_font)) {
		  back = register_used_class(j, str_jcomponent);
		  if(!back) {
		    jlmsg_error_memory(j);
		  }
		} else {
		  jlmsg_error_memory(j); back = 0;
		}
	      }
	    }
	  } break;
	  case 57: {	/* border weight */
	    back = apply_border_weight(j, j->o_cur, p2);
	  } break;
	  case 58: {
	    back = apply_horizontal_text_position(j, j->o_cur, p2);
	  } break;
	  case 59: {
	    back = apply_vertical_text_position(j, j->o_cur, p2);
	  } break;
	  default: {
	    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 13);
	  } break;
        }
      } else {
        /* ERROR: empty key */
        jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 23);
      }
    } else {
      /* ERROR: Empty value */
      jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 50);
    }
  } else {
    /* ERROR: Empty value */
    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 50);
  }
  
  return back;
}



/**	Read entire input file.
	@param	j	Jlayout job.
	@param	inf	Input file.
	@return	1 on success, 0 on error.
*/
static
int
apply_input DK_P2(JLJ *,j, FILE *,inf)
{
  int back = 1, last_back = 1;
  char *p1;
  
  j->errfilename = j->ifname; j->errlineno = 0UL;
  while(fgets(j->input_buffer, j->sz_input_buffer, inf)) {
    j->errlineno += 1UL;
    if(back == 1) {
      dkstr_delcomm(j->input_buffer, '#');
      p1 = dkstr_start(j->input_buffer, NULL);
      if(p1) {		
        dkstr_chomp(p1, NULL);	
	switch(*p1) {
	  case '.' : {	
	    if(!apply_control_instruction(j, p1)) { back = 0; }
	  } break;
	  case '[' : {	
	    if(!apply_object_definition(j, p1)) { back = 0; }
	  } break;
	  default: {	
	    if(!apply_object_attribute(j, p1)) { back = 0; }
	  } break;
	}
      } else {		
      }
    }
    if(back != 1) {
      if(last_back) {
        /* ERROR: Processing aborted due to errors */
	
	jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 12);
      }
    }
    last_back = back;
  }
  j->errfilename = NULL; j->errlineno = 0UL;
  
  return back;
}



/**	Prepare JLJ structure to read input (create storages
	and iterators).
	@param	j	Jlayout job.
	@return	1 on success, 0 on error.
*/
static
int
prepare_to_read_input DK_P1(JLJ *,j)
{
  int back = 0;
  
  j->f1 = 0UL;
  j->o_st = dksto_open(0);
  if(j->o_st) {
    dksto_set_comp(j->o_st, jlread_compare_objects_by_name, CR_COMPARE_OBJECTS);
    j->o_main = NULL; j->o_cur = NULL;
    j->o_main = jlo_new(NULL);
    (j->o_main)->f2 |= F2_USE_CONTENT_PANE;
    j->o_cur = j->o_main;
    if(j->o_main) {
      j->o_it = dksto_it_open(j->o_st);
      if(j->o_it) {
        j->g_st = dksto_open(0);
        if(j->g_st) {
          dksto_set_comp(
            j->g_st, jlread_compare_groups_by_name, CR_COMPARE_OBJECTS
          );
          j->g_it = dksto_it_open(j->g_st);
          if(j->g_it) {
            j->b_st = dksto_open(0);
            if(j->b_st) {
              dksto_set_comp(
                j->b_st, jlread_compare_groups_by_name, CR_COMPARE_OBJECTS
              );
              j->b_it = dksto_it_open(j->b_st);
              if(j->b_it) {
      	        j->uc_st = dksto_open(0);
      	        if(j->uc_st) {
      	          dksto_set_comp(j->uc_st, compare_classes_by_name, 0);
      	          j->uc_it = dksto_it_open(j->uc_st);
      	          if(j->uc_it) {
      	            back = register_used_class(j, str_Container);
		    if(!back) {
		      jlmsg_error_memory(j);
		    }
      	          } else {
      	            jlmsg_error_memory(j);
      	          }
      	        } else {
      	          jlmsg_error_memory(j);
      	        }
              } else {
                /* ERROR: Memory */
      	        jlmsg_error_memory(j);
              }
            } else {
              /* ERROR: Memory */
              jlmsg_error_memory(j);
            }
          } else {
            /* ERROR: Memory */
            jlmsg_error_memory(j);
          }
        } else {
          /* ERROR: Memory */
          jlmsg_error_memory(j);
        }
      } else {
        /* ERROR: Memory */
	jlmsg_error_memory(j);
      }
    } else {
      /* ERROR: Memory */
      jlmsg_error_memory(j);
    }
  } else {
    /* ERROR: Memory */
    jlmsg_error_memory(j);
  }
  
  return back;
}




int
jlread DK_P1(JLJ *,j)
{
  int back = 0;
  FILE *inf;
  
  if(j) {
    if(j->ifname) {
      if(prepare_to_read_input(j)) {
        if(j->a) {
          inf = dkapp_fopen(j->a, j->ifname, str_r);
	  if(!inf) {
	    dkapp_err_fopenr(j->a, j->ifname);
	  }
        } else {
          inf = dksf_fopen(j->ifname, str_r);
	  if(!inf) {
	    /* ERROR: Failed to read file */
	    jlmsg_log1(j, DK_LOG_LEVEL_ERROR, 51);
	  }
        }
        if(inf) {
          back = apply_input(j, inf);
          fclose(inf);
        }
      }
    }
  }
  
  return back;
}


