2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
26 * Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
27 * ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
28 * the full copyright text.
35 static char rcsid[] = "$TOG: UilLstMac.c /main/15 1997/03/12 15:21:48 dbl $"
40 * (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
46 ** User Interface Language Compiler (UIL)
50 ** This module contain the routines for creating the machine listing.
64 #include <Mrm/MrmAppl.h>
65 #include <X11/Xmd.h> /* For 64-bit architecture dependencies */
69 #include <DXm/DXmHelpB.h>
77 ** DEFINE and MACRO DEFINITIONS
81 /* Holds offset info for machine code listing. */
83 typedef struct _off_info {
84 unsigned short int w_off_type;
85 unsigned short int w_off_offset;
90 #define k_arglist_off 2
91 #define k_children_off 3
92 #define k_comment_off 4
93 #define k_creation_off 5
94 #define k_callback_off 6
95 #define k_resource_off 7
97 #define k_unknown_off 9
98 #define k_resource_id_off 10
99 #define k_child_off 11
100 #define k_text_entry_off 12
101 #define k_null_text_entry_off 13
102 #define k_single_float_off 14 /* single float data type RAP */
104 #define k_off_stack_size 300
106 static off_info_type off_info_stack [k_off_stack_size];
108 static int off_info_cnt = 0;
113 #define off_stack_empty (off_info_cnt == 0)
115 #define _Offset(type,base,field) \
116 ((unsigned int)(base + XtOffsetOf(type, field)))
118 #if defined(__STDC__)
119 #define _OffsetArray(type,base,field) \
120 ((unsigned int)(base + XtOffsetOf(type, field)))
122 #define _OffsetArray(type,base,field) \
123 ((unsigned int)(base + XtOffsetOf(type, field[0])))
125 #define _Pointer(base,offset) ((char *)(base)+(offset))
127 #define ASNHEADERLEN 3
128 #define CSLONGBIT (unsigned char)(0x80)
129 #define ASNstrlen(a) (ASNHEADERLEN+ \
130 (((unsigned char)(a)[ASNHEADERLEN]&CSLONGBIT)? \
131 (((unsigned short)((a)[ASNHEADERLEN+1])<<8) | \
132 (unsigned short)((a)[ASNHEADERLEN+2]))+3 : \
133 ((unsigned short)((a)[ASNHEADERLEN]))+1))
137 ** EXTERNAL VARIABLE DECLARATIONS
144 ** GLOBAL VARIABLE DECLARATIONS
151 ** OWN VARIABLE DECLARATIONS
159 ** FUNCTIONAL DESCRIPTION:
161 ** This function saves the machine code listing information for widgets.
163 ** FORMAL PARAMETERS:
165 ** widget_entry Symbol node for this widget
166 ** az_context context containing the URM output information.
182 ** the machine code is saved in the source record structure for
188 void save_widget_machine_code ( widget_entry, az_context )
190 sym_widget_entry_type * widget_entry;
191 URMResourceContext * az_context;
195 RGMWidgetRecordPtr w_rec;
197 unsigned short int w_rec_size;
198 src_source_record_type * az_src_rec;
200 #define _WRPointer(w_rec,offset) ((char *)(w_rec)+(offset))
202 #define _WROffset(field) (_Offset(RGMWidgetRecord,0,field))
204 az_src_rec = widget_entry->header.az_src_rec;
206 if (widget_entry->resource_id != 0 ) {
207 sprintf (buffer, "Resource ID: %08X", widget_entry->resource_id);
208 src_append_machine_code (
213 } else if (widget_entry->obj_header.az_name != NULL) {
214 sprintf (buffer, "Resource index: %s",
215 widget_entry->obj_header.az_name->c_text);
216 src_append_machine_code (
223 w_rec = (RGMWidgetRecordPtr) UrmRCBuffer (az_context);
225 src_append_machine_code (
227 _WROffset (validation),
228 sizeof (w_rec->validation), (char*)& w_rec->validation,
231 sprintf (buffer, "size: %d", w_rec->size);
233 src_append_machine_code (
236 sizeof (w_rec->size), (char*)& w_rec->size,
239 w_rec_size = w_rec->size;
241 sprintf (buffer, "access: %s",
242 access_from_code (w_rec->access) );
244 src_append_machine_code (
247 sizeof (w_rec->access), (char*)& w_rec->access,
250 sprintf (buffer, "locked: ");
253 strcat (buffer, "true");
255 strcat (buffer, "false");
258 src_append_machine_code (
261 sizeof (w_rec->lock), (char*)& w_rec->lock,
264 sprintf (buffer, "type: ");
266 strcat (buffer, class_name_from_code (w_rec->type));
268 src_append_machine_code (
271 sizeof (w_rec->type), (char*)& w_rec->type,
274 if (w_rec->name_offs == (MrmOffset) 0) {
275 sprintf (buffer, "no name specified");
277 sprintf (buffer, "name: offset %X (hex)",
279 off_put (k_name_off, w_rec->name_offs);
282 src_append_machine_code (
284 _WROffset (name_offs),
285 sizeof (w_rec->name_offs),
286 (char*)& w_rec->name_offs,
289 if (w_rec->class_offs == (MrmOffset) 0) {
290 sprintf (buffer, "class: builtin");
292 sprintf (buffer, "class: offset %X (hex)",
294 off_put (k_class_off, w_rec->class_offs);
297 src_append_machine_code (
299 _WROffset (class_offs),
300 sizeof (w_rec->class_offs),
301 (char*)& w_rec->class_offs,
304 if (w_rec->arglist_offs == (MrmOffset) 0) {
305 sprintf (buffer, "no argument list");
307 sprintf (buffer, "argument list offset: %X (hex)", w_rec->arglist_offs);
308 off_put (k_arglist_off, w_rec->arglist_offs);
311 src_append_machine_code (
313 _WROffset (arglist_offs),
314 sizeof (w_rec->arglist_offs),
315 (char*)& w_rec->arglist_offs,
318 if (w_rec->children_offs == (MrmOffset) 0) {
319 sprintf (buffer, "no children");
321 sprintf (buffer, "children list offset: %X (hex)",
322 w_rec->children_offs);
323 off_put (k_children_off, w_rec->children_offs);
326 src_append_machine_code (
328 _WROffset (children_offs),
329 sizeof (w_rec->children_offs),
330 (char*)& w_rec->children_offs,
333 if (w_rec->comment_offs == (MrmOffset) 0) {
334 sprintf (buffer, "no comment specified");
336 sprintf (buffer, "comment: offset %X (hex)",
337 w_rec->comment_offs);
338 off_put (k_comment_off, w_rec->comment_offs);
341 src_append_machine_code (
343 _WROffset (comment_offs),
344 sizeof (w_rec->comment_offs),
345 (char*)& w_rec->comment_offs,
348 if (w_rec->creation_offs == (MrmOffset) 0) {
349 sprintf (buffer, "no creation callback");
351 sprintf (buffer, "creation callback offset: %X (hex)",
352 w_rec->creation_offs);
353 off_put (k_creation_off, w_rec->creation_offs);
356 src_append_machine_code (
358 _WROffset (creation_offs),
359 sizeof (w_rec->creation_offs),
360 (char*)& w_rec->creation_offs,
363 unload_stack(( char *) w_rec, w_rec_size, az_src_rec );
369 ** FUNCTIONAL DESCRIPTION:
371 ** This function unloads entries placed on a stack and outputs them
372 ** into the listing. The routine is used by both widgets and gadgets
373 ** to output their argument, control, and callback lists.
375 ** FORMAL PARAMETERS:
377 ** rec base of the record being annotated
378 ** rec_sizr size of the record being annotated
379 ** az_src_rec address of the source for record being annotated
392 void unload_stack( rec, rec_size, az_src_rec )
396 src_source_record_type *az_src_rec;
400 char buffer [132], * ptr;
403 while ( ! off_stack_empty ) {
405 unsigned short off_type, off_offset;
407 off_get (& off_type, & off_offset);
413 case k_comment_off : {
415 ptr = (char *) _Pointer(rec, off_offset);
416 src_append_machine_code (
417 az_src_rec, off_offset,
418 strlen (ptr) + 1, ptr, NULL );
422 case k_unknown_off : {
424 unsigned short int len;
426 /* Write out everything up to the next offset or the end of the
429 if ( ! off_stack_empty ) {
430 unsigned short int next_type, next_offset;
432 off_get (& next_type, & next_offset);
433 off_put (next_type, next_offset);
434 len = next_offset - off_offset;
436 len = rec_size - off_offset;
439 ptr = (char *) _Pointer(rec, off_offset);
440 src_append_machine_code (
441 az_src_rec, off_offset,
446 case k_arglist_off : {
448 RGMArgListDescPtr argdesc;
449 RGMArgumentPtr arg_ptr;
452 argdesc = (RGMArgListDescPtr) _Pointer(rec, off_offset);
454 sprintf (buffer, "argument count: %d", argdesc->count);
456 src_append_machine_code (
458 _Offset (RGMArgListDesc, off_offset, count),
459 sizeof (argdesc->count),
460 (char*)& argdesc->count,
463 sprintf (buffer, "related argument count: %d", argdesc->extra);
465 src_append_machine_code (
467 _Offset (RGMArgListDesc, off_offset, extra),
468 sizeof (argdesc->extra),
469 (char*)& argdesc->extra,
472 off_offset = _OffsetArray (RGMArgListDesc, off_offset, args);
474 for (j = 0, arg_ptr = argdesc->args;
476 j++, arg_ptr++, off_offset += sizeof (RGMArgument)) {
478 if (arg_ptr->tag_code != UilMrmUnknownCode )
483 resource_name_from_code(arg_ptr->tag_code));
488 _Pointer(rec,arg_ptr->stg_or_relcode.tag_offs);
490 "(%d) arg type: %s (user defined)",
495 src_append_machine_code (
497 _Offset (RGMArgument, off_offset, tag_code),
498 sizeof (arg_ptr->tag_code),
499 (char*)& arg_ptr->tag_code,
502 if (arg_ptr->stg_or_relcode.tag_offs == (MrmOffset) 0) {
503 sprintf (buffer, "(%d) no tag offset", j);
505 sprintf (buffer, "(%d) tag offset: %X (hex)",
506 j, arg_ptr->stg_or_relcode.tag_offs);
507 off_put (k_name_off, arg_ptr->stg_or_relcode.tag_offs);
510 src_append_machine_code (
512 _Offset (RGMArgument, off_offset, stg_or_relcode.tag_offs),
513 sizeof (arg_ptr->stg_or_relcode.tag_offs),
514 (char*)& arg_ptr->stg_or_relcode.tag_offs,
517 sprintf (buffer, "(%d) type: %s",
518 j, type_from_code (arg_ptr->arg_val.rep_type) );
520 src_append_machine_code (
522 _Offset (RGMArgument, off_offset,
524 sizeof (arg_ptr->arg_val.rep_type),
525 (char*)& arg_ptr->arg_val.rep_type,
528 sprintf (buffer, "(%d) ", j);
530 format_arg_value (& arg_ptr->arg_val,
531 & buffer [strlen (buffer)]);
533 src_append_machine_code (
535 _Offset (RGMArgument, off_offset,
537 sizeof (arg_ptr->arg_val.datum),
538 (char*)& arg_ptr->arg_val.datum,
550 dptr = (double *) _Pointer (rec, off_offset);
551 sprintf (buffer, "floating point value: %g", (* dptr));
552 src_append_machine_code (
555 sizeof (double), (char*)dptr, buffer );
559 /* single float data type RAP */
560 case k_single_float_off :
564 fptr = (float *) _Pointer(rec, off_offset);
565 sprintf(buffer, "Single float value: %g", (* fptr));
566 src_append_machine_code (
569 sizeof (float), (char*)fptr, buffer);
574 case k_creation_off :
575 case k_callback_off : {
577 RGMCallbackDescPtr cb_desc_ptr;
578 RGMCallbackItemPtr cb_item_ptr;
582 (RGMCallbackDescPtr) _Pointer (rec, off_offset);
584 src_append_machine_code (
586 _Offset (RGMCallbackDesc, off_offset, validation),
587 sizeof (cb_desc_ptr->validation),
588 (char*)& cb_desc_ptr->validation,
589 "callback descriptor" );
591 sprintf (buffer, "callback count: %d", cb_desc_ptr->count);
593 src_append_machine_code (
595 _Offset (RGMCallbackDesc, off_offset, count),
596 sizeof (cb_desc_ptr->count),
597 (char*)& cb_desc_ptr->count,
601 _OffsetArray (RGMCallbackDesc, off_offset, item);
603 for (j = 0, cb_item_ptr = cb_desc_ptr->item;
604 j < cb_desc_ptr->count;
606 off_offset += sizeof (RGMCallbackItem)) {
609 "(%d) routine name offset: %X (hex)",
610 j, cb_item_ptr->cb_item.routine);
612 src_append_machine_code (
614 _Offset (RGMCallbackItem, off_offset,
617 sizeof (cb_item_ptr->cb_item.routine),
618 (char*)& cb_item_ptr->cb_item.routine,
619 #else /* 64-bit architecture */
621 (char*)& cb_item_ptr->cb_item,
625 off_put (k_name_off, cb_item_ptr->cb_item.routine);
627 sprintf (buffer, "(%d) routine tag type: %s",
629 cb_item_ptr->cb_item.rep_type) );
631 src_append_machine_code
633 _Offset (RGMCallbackItem, off_offset,
636 sizeof (cb_item_ptr->cb_item.rep_type),
637 (char*)& cb_item_ptr->cb_item.rep_type,
638 #else /* 64-bit architecture */
640 (char*)& cb_item_ptr->cb_item + 4,
644 sprintf (buffer, "(%d) value: ", j);
645 src_append_machine_code
647 _Offset (RGMCallbackItem, off_offset,
649 sizeof (cb_item_ptr->cb_item.datum),
650 (char*)& cb_item_ptr->cb_item.datum,
658 case k_resource_off : {
660 RGMResourceDescPtr r_desc_ptr;
663 (RGMResourceDescPtr) _Pointer (rec, off_offset);
665 sprintf (buffer, "resource descriptor, size: %d",
668 src_append_machine_code (
670 _Offset (RGMResourceDesc, off_offset, size),
671 sizeof (r_desc_ptr->size),
672 (char*)& r_desc_ptr->size,
675 sprintf (buffer, "access: %s",
676 access_from_code (r_desc_ptr->access) );
678 src_append_machine_code (
680 _Offset (RGMResourceDesc, off_offset, access),
681 sizeof (r_desc_ptr->access),
682 (char*)& r_desc_ptr->access,
685 switch (r_desc_ptr->type) {
687 sprintf (buffer, "index, offset: %X (hex)",
688 _Offset (RGMResourceDesc, off_offset, key) );
691 _Offset (RGMResourceDesc, off_offset, key) );
696 sprintf (buffer, "resource ID, offset: %X (hex)",
697 _Offset (RGMResourceDesc, off_offset, key) );
699 off_put (k_resource_id_off,
700 _Offset (RGMResourceDesc, off_offset, key) );
704 sprintf (buffer, "unknown resource type");
708 src_append_machine_code (
710 _Offset (RGMResourceDesc, off_offset, type),
711 sizeof (r_desc_ptr->type),
712 (char*)& r_desc_ptr->type,
715 sprintf (buffer, "resource group: %s",
716 group_from_code (r_desc_ptr->res_group) );
718 src_append_machine_code (
720 _Offset (RGMResourceDesc, off_offset, res_group),
721 sizeof (r_desc_ptr->res_group),
722 (char*)& r_desc_ptr->res_group,
725 sprintf (buffer, "resource type: %s",
726 (r_desc_ptr->res_group == URMgLiteral) ?
727 type_from_code (r_desc_ptr->cvt_type) :
728 class_name_from_code (r_desc_ptr->cvt_type) );
730 src_append_machine_code (
732 _Offset (RGMResourceDesc, off_offset, cvt_type),
733 sizeof (r_desc_ptr->cvt_type),
734 (char*)& r_desc_ptr->cvt_type,
740 case k_resource_id_off : {
742 sprintf (buffer, "resource id");
744 src_append_machine_code (
747 sizeof (MrmResource_id),
748 (char *) _Pointer (rec, off_offset),
754 case k_children_off : {
756 RGMChildrenDescPtr c_desc_ptr;
759 c_desc_ptr = (RGMChildrenDescPtr) _Pointer(rec, off_offset);
761 sprintf (buffer, "Children count: %d",
764 src_append_machine_code (
766 _Offset (RGMChildrenDesc, off_offset, count),
767 sizeof (c_desc_ptr->count),
768 (char*)& c_desc_ptr->count,
772 _OffsetArray (RGMChildrenDesc, off_offset, child);
774 for (j = 0; j < c_desc_ptr->count;
775 j++, off_offset += sizeof (RGMChildDesc)) {
777 off_put (k_child_off, off_offset);
787 RGMChildDescPtr c_ptr;
790 c_ptr = (RGMChildDescPtr) _Pointer(rec, off_offset);
797 sprintf (buffer, "(%d) managed", j);
799 sprintf (buffer, "(%d) unmanaged", j);
802 src_append_machine_code (
804 _Offset (RGMChildDesc, off_offset, manage),
805 sizeof (c_ptr->manage),
806 (char*)& c_ptr->manage,
809 sprintf (buffer, "(%d) access: %s", j,
810 access_from_code (c_ptr->access) );
812 src_append_machine_code (
814 _Offset (RGMChildDesc, off_offset, access),
815 sizeof (c_ptr->access),
816 (char*)& c_ptr->access,
819 switch (c_ptr->type) {
821 sprintf (buffer, "(%d) index, offset: %X (hex)",
822 j, c_ptr->key.index_offs);
824 src_append_machine_code (
826 _Offset (RGMChildDesc, off_offset, type),
827 sizeof (c_ptr->type) + sizeof (c_ptr->key),
828 (char*)& c_ptr->type,
831 off_put (k_name_off, c_ptr->key.index_offs);
837 "(%d) resource ID, offset: %X (hex)",
838 j, _Offset (RGMChildDesc, off_offset, key) );
840 src_append_machine_code (
842 _Offset (RGMChildDesc, off_offset, type),
843 sizeof (c_ptr->type),
844 (char*)& c_ptr->type,
847 off_put (k_resource_id_off,
848 _Offset (RGMChildDesc, off_offset, key) );
853 sprintf (buffer, "(%d) unknown class", j);
855 src_append_machine_code (
857 _Offset (RGMChildDesc, off_offset, type),
858 sizeof (c_ptr->type),
859 (char*)& c_ptr->type,
875 src_append_machine_code ( az_src_rec, 0, 0, 0, 0 );
881 ** FUNCTIONAL DESCRIPTION:
883 ** This function saves the machine code listing information for values.
885 ** FORMAL PARAMETERS:
887 ** value_entry Symbol node for this value
888 ** az_context context containing the URM output information.
904 ** the machine code is saved in the source record structure for this
910 void save_value_machine_code ( value_entry, az_context )
912 sym_value_entry_type * value_entry;
913 URMResourceContext * az_context;
916 src_source_record_type * az_src_rec;
917 char buffer [132], * rc_buffer;
918 unsigned short int rc_size;
920 az_src_rec = value_entry->header.az_src_rec;
922 if (value_entry->resource_id != 0) {
923 sprintf (buffer, "Resource ID: %08X", value_entry->resource_id);
924 src_append_machine_code (
929 } else if (value_entry->obj_header.az_name != NULL) {
930 sprintf (buffer, "Resource index: %s",
931 value_entry->obj_header.az_name->c_text);
932 src_append_machine_code
939 sprintf (buffer, "size: %d, group: %s",
940 UrmRCSize (az_context),
941 group_from_code (UrmRCGroup (az_context)) );
942 src_append_machine_code ( az_src_rec, 0, 0, 0, buffer );
944 sprintf (buffer, "type: %s, access: %s, locked: ",
945 type_from_code (UrmRCType (az_context)),
946 access_from_code (UrmRCAccess (az_context)) );
948 if (UrmRCLock (az_context)) {
949 strcat (buffer, "true");
951 strcat (buffer, "false");
954 src_append_machine_code ( az_src_rec, 0, 0, 0, buffer );
956 rc_buffer = UrmRCBuffer (az_context);
957 rc_size = UrmRCSize (az_context);
960 ** Case on the type of literal.
963 switch (value_entry->b_type)
965 case sym_k_bool_value:
967 if ( * (unsigned long *) rc_buffer )
968 sprintf (buffer, "value: true");
970 sprintf (buffer, "value: false");
971 src_append_machine_code (
972 az_src_rec, 0, rc_size, rc_buffer, buffer );
975 case sym_k_integer_value:
976 case sym_k_horizontal_integer_value:
977 case sym_k_vertical_integer_value:
979 sprintf (buffer, "value: %d",
980 (* (unsigned long *) rc_buffer) );
981 src_append_machine_code (
982 az_src_rec, 0, rc_size, rc_buffer, buffer );
985 case sym_k_integer_table_value:
986 case sym_k_rgb_value: /* rgb data type RAP */
991 for (offset = 0; offset < (int)rc_size; offset += sizeof(int), index++)
993 sprintf (buffer, "value[%d]: %d",
994 index, ((unsigned long *) rc_buffer)[index] );
996 src_append_machine_code
997 (az_src_rec, 0, sizeof(int),
998 (char*)&(((unsigned long *)rc_buffer)[index]), buffer );
1003 case sym_k_float_value:
1004 case sym_k_horizontal_float_value:
1005 case sym_k_vertical_float_value:
1006 sprintf (buffer, "value: %g",
1007 (* (double *) rc_buffer) );
1008 src_append_machine_code (
1009 az_src_rec, 0, rc_size, rc_buffer, buffer );
1012 case sym_k_single_float_value:
1013 sprintf (buffer, "value: %g",
1014 (* (float *) rc_buffer));
1015 src_append_machine_code
1016 (az_src_rec, 0, rc_size, rc_buffer, buffer );
1019 case sym_k_char_8_value:
1020 case sym_k_color_value:
1021 case sym_k_color_table_value:
1022 case sym_k_icon_value:
1023 case sym_k_font_value:
1024 case sym_k_fontset_value:
1025 case sym_k_font_table_value:
1026 case sym_k_reason_value:
1027 case sym_k_argument_value:
1028 case sym_k_identifier_value:
1029 case sym_k_compound_string_value:
1030 case sym_k_xbitmapfile_value:
1031 case sym_k_keysym_value:
1032 src_append_machine_code (
1035 rc_size, rc_buffer, 0 );
1038 case sym_k_asciz_table_value:
1039 case sym_k_string_table_value: {
1040 RGMTextVectorPtr tv_ptr;
1041 unsigned short off_type, off_offset, off_cnt;
1045 tv_ptr = (RGMTextVectorPtr) rc_buffer;
1046 src_append_machine_code (
1048 _Offset (RGMTextVector, off_offset, validation),
1049 sizeof (tv_ptr->validation),
1050 (char*)& tv_ptr->validation,
1053 sprintf (buffer, "count: %d", tv_ptr->count);
1054 src_append_machine_code (
1056 _Offset (RGMTextVector, off_offset, count),
1057 sizeof (tv_ptr->count), (char*)& tv_ptr->count,
1060 off_offset = _OffsetArray (RGMTextVector, off_offset, item);
1061 for (i = 0; i < tv_ptr->count;
1062 i++, off_offset += sizeof (RGMTextEntry)) {
1064 off_put (k_text_entry_off, off_offset);
1067 off_put (k_null_text_entry_off, off_offset);
1069 while ( ! off_stack_empty ) {
1071 RGMTextEntryPtr te_ptr;
1072 off_get (& off_type, & off_offset);
1077 char *stringPtr = (char *) _Pointer (rc_buffer,off_offset);
1078 src_append_machine_code (az_src_rec, off_offset,
1079 ASNstrlen( stringPtr ),
1084 case k_null_text_entry_off :
1086 src_append_machine_code (
1087 az_src_rec, off_offset,
1088 sizeof (RGMTextEntry),
1089 (char*)_Pointer (rc_buffer, off_offset),
1090 "end of text vector" );
1094 case k_text_entry_off :
1096 te_ptr = (RGMTextEntryPtr)
1097 _Pointer (rc_buffer, off_offset);
1099 sprintf (buffer, "(%d) type: %s, offset: %X (hex)",
1101 type_from_code (te_ptr->text_item.rep_type),
1102 te_ptr->text_item.offset );
1104 src_append_machine_code (
1106 _Offset (RGMTextEntry, off_offset,
1108 sizeof (te_ptr->text_item),
1109 (char*)& te_ptr->text_item,
1114 off_put (k_name_off, te_ptr->text_item.offset);
1120 sprintf (buffer, "(%d) unknown text entry", i);
1122 src_append_machine_code (
1134 case sym_k_trans_table_value:
1136 src_append_machine_code (
1137 az_src_rec, 0, rc_size, rc_buffer, NULL );
1143 sprintf (buffer, "unknown value");
1145 src_append_machine_code (
1154 src_append_machine_code ( az_src_rec, 0, 0, 0, 0 );
1160 ** FUNCTIONAL DESCRIPTION:
1162 ** This function saves the machine code listing information for modules.
1164 ** FORMAL PARAMETERS:
1166 ** az_src_rec Source record for this machine code info.
1167 ** az_context context containing the URM output information.
1173 ** IMPLICIT OUTPUTS:
1183 ** the machine code is saved in the source record structure
1188 void save_module_machine_code ( az_src_rec, az_context )
1190 src_source_record_type * az_src_rec;
1191 URMResourceContext * az_context;
1195 RGMModuleDescPtr m_rec;
1196 RGMTopmostDescPtr t_rec;
1198 unsigned short off_offset;
1203 m_rec = (RGMModuleDescPtr) UrmRCBuffer (az_context);
1205 src_append_machine_code (
1207 _Offset (RGMModuleDesc, off_offset, validation),
1208 sizeof (m_rec->validation), (char*)& m_rec->validation,
1211 sprintf (buffer, "topmost count: %d", m_rec->count);
1213 src_append_machine_code (
1215 _Offset (RGMModuleDesc, off_offset, count),
1216 sizeof (m_rec->count), (char*)& m_rec->count,
1219 off_offset = _OffsetArray (RGMModuleDesc, off_offset, topmost);
1221 for (i = 0, t_rec = m_rec->topmost;
1223 i++, t_rec++, off_offset += sizeof (RGMTopmostDesc)) {
1225 sprintf (buffer, "(%d) %s", i, t_rec->index);
1227 src_append_machine_code (
1229 _OffsetArray (RGMTopmostDesc, off_offset, index),
1230 strlen(t_rec->index), t_rec->index,
1235 src_append_machine_code ( az_src_rec, 0, 0, 0, 0 );
1241 ** FUNCTIONAL DESCRIPTION:
1243 ** This function adds an offset entry to the offset stack for
1244 ** machine code. The entry is inserted in the proper place in
1245 ** the stack depending on the offset value.
1247 ** FORMAL PARAMETERS:
1249 ** off_type type of offset entry
1250 ** off_offset offset value for this offset entry
1254 ** off_info_cnt number of offset stack entries
1255 ** off_info_stack stack containing offset entries
1257 ** IMPLICIT OUTPUTS:
1259 ** off_info_cnt number of offset stack entries
1260 ** off_info_stack stack containing offset entries
1268 ** the offset info is saved in the offset stack
1275 (unsigned short off_type, unsigned short off_offset)
1278 off_info_type off_info, * off_info_ptr;
1281 if (off_info_cnt >= k_off_stack_size) {
1282 diag_issue_internal_error ("stack overflow in machine listing");
1285 off_info.w_off_type = off_type;
1286 off_info.w_off_offset = off_offset;
1288 /* Insert on the stack before the first entry with a lower offset
1291 for (i = 0, off_info_ptr = off_info_stack;
1292 i < off_info_cnt; i++, off_info_ptr++) {
1293 if (off_info.w_off_offset > off_info_ptr->w_off_offset) {
1298 _move ( & off_info_ptr [1], off_info_ptr,
1299 (off_info_cnt - i) * sizeof (off_info_type) );
1301 (* off_info_ptr) = off_info;
1308 ** FUNCTIONAL DESCRIPTION:
1310 ** This function removes an offset entry to the offset stack for
1313 ** FORMAL PARAMETERS:
1315 ** off_type address to receive the type of offset entry
1316 ** off_offset address to receive the offset value for this
1321 ** off_info_cnt number of offset stack entries
1322 ** off_info_stack stack containing offset entries
1324 ** IMPLICIT OUTPUTS:
1326 ** off_info_cnt number of offset stack entries
1327 ** off_info_stack stack containing offset entries
1335 ** the offset info is retrieved from the offset stack
1340 void off_get (off_type, off_offset)
1342 unsigned short * off_type;
1343 unsigned short * off_offset;
1346 off_info_type * off_info_ptr;
1348 if (off_info_cnt <= 0) {
1349 diag_issue_internal_error ("stack underflow in machine listing");
1352 /* Remove from the stack the entry with the lowest offset value */
1354 off_info_ptr = & off_info_stack [off_info_cnt - 1];
1356 (* off_type) = off_info_ptr->w_off_type;
1357 (* off_offset) = off_info_ptr->w_off_offset;
1363 char * type_from_code
1370 * PROCEDURE DESCRIPTION:
1372 * This procedure returns the string corresponding to a URM type code
1374 * FORMAL PARAMETERS:
1376 * type type code from RGMrType...
1388 * The string corresponding to the type code
1401 case MrmRtypeInteger:
1402 return uil_datatype_names[sym_k_integer_value];
1403 case MrmRtypeHorizontalInteger:
1404 return uil_datatype_names[sym_k_horizontal_integer_value];
1405 case MrmRtypeVerticalInteger:
1406 return uil_datatype_names[sym_k_vertical_integer_value];
1407 case MrmRtypeBoolean:
1408 return uil_datatype_names[sym_k_bool_value];
1410 return uil_datatype_names[sym_k_char_8_value];
1411 case MrmRtypeChar8Vector:
1412 return uil_datatype_names[sym_k_asciz_table_value];
1413 case MrmRtypeCString:
1414 return uil_datatype_names[sym_k_compound_string_value];
1415 case MrmRtypeCStringVector:
1416 return uil_datatype_names[sym_k_string_table_value];
1418 return uil_datatype_names[sym_k_float_value];
1419 case MrmRtypeHorizontalFloat:
1420 return uil_datatype_names[sym_k_horizontal_float_value];
1421 case MrmRtypeVerticalFloat:
1422 return uil_datatype_names[sym_k_vertical_float_value];
1423 case MrmRtypeSingleFloat: /* single float data type RAP */
1424 return uil_datatype_names[sym_k_single_float_value];
1425 case MrmRtypeCallback:
1427 case MrmRtypePixmapImage:
1428 return "pixmap image";
1429 case MrmRtypePixmapDDIF:
1430 return "pixmap DDIF";
1431 case MrmRtypeResource:
1433 case MrmRtypeAddrName:
1435 case MrmRtypeIconImage:
1436 return uil_datatype_names[sym_k_icon_value];
1438 return uil_datatype_names[sym_k_font_value];
1439 case MrmRtypeFontSet:
1440 return uil_datatype_names[sym_k_fontset_value];
1441 case MrmRtypeFontList:
1442 return uil_datatype_names[sym_k_font_table_value];
1444 return uil_datatype_names[sym_k_color_value];
1445 case MrmRtypeColorTable:
1446 return uil_datatype_names[sym_k_color_table_value];
1448 return uil_datatype_names[sym_k_any_value];
1449 case MrmRtypeTransTable:
1450 return uil_datatype_names[sym_k_trans_table_value];
1451 case MrmRtypeClassRecName:
1452 return uil_datatype_names[sym_k_class_rec_name_value];
1453 case MrmRtypeIntegerVector:
1454 return uil_datatype_names[sym_k_integer_table_value];
1455 case MrmRtypeXBitmapFile:
1456 return uil_datatype_names[sym_k_xbitmapfile_value];
1457 case MrmRtypeKeysym:
1458 return uil_datatype_names[sym_k_keysym_value];
1465 char * access_from_code
1467 (MrmFlag access_code)
1472 * PROCEDURE DESCRIPTION:
1474 * This procedure returns the string corresponding to a URM access code
1476 * FORMAL PARAMETERS:
1478 * access_code access code
1490 * The string corresponding to the access code
1501 switch (access_code) {
1502 case URMaPublic: return "public";
1503 case URMaPrivate: return "private";
1504 default: return "unknown";
1509 char * group_from_code
1511 (MrmGroup group_code)
1516 * PROCEDURE DESCRIPTION:
1518 * This procedure returns the string corresponding to a URM group code
1520 * FORMAL PARAMETERS:
1522 * group_code group code
1534 * The string corresponding to the group code
1545 switch (group_code) {
1546 case URMgWidget: return "widget";
1547 case URMgLiteral: return "literal";
1548 case URMgResourceSet: return "resource set";
1549 default: return "unknown";
1555 void format_arg_value (argval_ptr, buffer)
1557 RGMArgValuePtr argval_ptr;
1563 * FUNCTION PROTOTYPE
1565 * PROCEDURE DESCRIPTION:
1567 * This routine formats a value descriptor into the buffer.
1569 * FORMAL PARAMETERS:
1571 * argval_ptr pointer to the argument value descriptor
1572 * buffer buffer to receive the formatted value
1590 switch ( argval_ptr->rep_type ) {
1592 case MrmRtypeInteger:
1593 case MrmRtypeHorizontalInteger:
1594 case MrmRtypeVerticalInteger:
1595 sprintf (buffer, "value: %d", argval_ptr->datum.ival);
1598 case MrmRtypeBoolean:
1599 if (argval_ptr->datum.ival) {
1600 sprintf (buffer, "value: true");
1602 sprintf (buffer, "value: false");
1607 case MrmRtypeCStringVector:
1608 case MrmRtypePixmapImage:
1609 case MrmRtypePixmapDDIF:
1610 case MrmRtypeCString:
1611 case MrmRtypeAddrName:
1612 case MrmRtypeKeysym:
1613 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1614 off_put (k_unknown_off, argval_ptr->datum.offset);
1618 case MrmRtypeHorizontalFloat:
1619 case MrmRtypeVerticalFloat:
1620 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1621 off_put (k_float_off, argval_ptr->datum.offset);
1624 case MrmRtypeSingleFloat: /* single float data type RAP */
1625 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1626 off_put (k_single_float_off, argval_ptr->datum.offset);
1629 case MrmRtypeCallback:
1630 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1631 off_put (k_callback_off, argval_ptr->datum.offset);
1634 case MrmRtypeResource:
1635 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1636 off_put (k_resource_off, argval_ptr->datum.offset);
1640 sprintf (buffer, "value unknown");
1647 char * class_name_from_code
1654 * PROCEDURE DESCRIPTION:
1656 * This procedure returns the string corresponding to a URM class code
1658 * FORMAL PARAMETERS:
1660 * class class code from URMwc...
1672 * The string corresponding to the class code
1687 * Find the sym_k code for the class, then return its name
1689 for ( sym_code=sym_k_error_object+1;
1690 sym_code<=uil_max_object;
1692 if ( uil_widget_compr[sym_code] == class )
1693 return uil_widget_names[sym_code];
1699 char * resource_name_from_code
1706 * PROCEDURE DESCRIPTION:
1708 * This procedure returns the string corresponding to a compression code
1710 * FORMAL PARAMETERS:
1712 * resource compression code for argument or reason
1724 * The string corresponding to the resource code
1739 * Find the sym_k code for the resource, then return its name
1741 for ( sym_code=0 ; sym_code<=uil_max_arg ; sym_code++ )
1742 if ( uil_arg_compr[sym_code] == resource )
1743 return uil_argument_names[sym_code];
1744 for ( sym_code=0 ; sym_code<=uil_max_reason ; sym_code++ )
1745 if ( uil_reas_compr[sym_code] == resource )
1746 return uil_reason_names[sym_code];
1747 for ( sym_code=0 ; sym_code<=uil_max_child ; sym_code++ )
1748 if ( uil_child_compr[sym_code] == resource )
1749 return uil_child_names[sym_code];