4 * Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
5 * ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
6 * the full copyright text.
13 static char rcsid[] = "$TOG: UilLstMac.c /main/15 1997/03/12 15:21:48 dbl $"
18 * (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
24 ** User Interface Language Compiler (UIL)
28 ** This module contain the routines for creating the machine listing.
42 #include <Mrm/MrmAppl.h>
43 #include <X11/Xmd.h> /* For 64-bit architecture dependencies */
47 #include <DXm/DXmHelpB.h>
55 ** DEFINE and MACRO DEFINITIONS
59 /* Holds offset info for machine code listing. */
61 typedef struct _off_info {
62 unsigned short int w_off_type;
63 unsigned short int w_off_offset;
68 #define k_arglist_off 2
69 #define k_children_off 3
70 #define k_comment_off 4
71 #define k_creation_off 5
72 #define k_callback_off 6
73 #define k_resource_off 7
75 #define k_unknown_off 9
76 #define k_resource_id_off 10
77 #define k_child_off 11
78 #define k_text_entry_off 12
79 #define k_null_text_entry_off 13
80 #define k_single_float_off 14 /* single float data type RAP */
82 #define k_off_stack_size 300
84 static off_info_type off_info_stack [k_off_stack_size];
86 static int off_info_cnt = 0;
91 #define off_stack_empty (off_info_cnt == 0)
93 #define _Offset(type,base,field) \
94 ((unsigned int)(base + XtOffsetOf(type, field)))
97 #define _OffsetArray(type,base,field) \
98 ((unsigned int)(base + XtOffsetOf(type, field)))
100 #define _OffsetArray(type,base,field) \
101 ((unsigned int)(base + XtOffsetOf(type, field[0])))
103 #define _Pointer(base,offset) ((char *)(base)+(offset))
105 #define ASNHEADERLEN 3
106 #define CSLONGBIT (unsigned char)(0x80)
107 #define ASNstrlen(a) (ASNHEADERLEN+ \
108 (((unsigned char)(a)[ASNHEADERLEN]&CSLONGBIT)? \
109 (((unsigned short)((a)[ASNHEADERLEN+1])<<8) | \
110 (unsigned short)((a)[ASNHEADERLEN+2]))+3 : \
111 ((unsigned short)((a)[ASNHEADERLEN]))+1))
115 ** EXTERNAL VARIABLE DECLARATIONS
122 ** GLOBAL VARIABLE DECLARATIONS
129 ** OWN VARIABLE DECLARATIONS
137 ** FUNCTIONAL DESCRIPTION:
139 ** This function saves the machine code listing information for widgets.
141 ** FORMAL PARAMETERS:
143 ** widget_entry Symbol node for this widget
144 ** az_context context containing the URM output information.
160 ** the machine code is saved in the source record structure for
166 void save_widget_machine_code ( widget_entry, az_context )
168 sym_widget_entry_type * widget_entry;
169 URMResourceContext * az_context;
173 RGMWidgetRecordPtr w_rec;
175 unsigned short int w_rec_size;
176 src_source_record_type * az_src_rec;
178 #define _WRPointer(w_rec,offset) ((char *)(w_rec)+(offset))
180 #define _WROffset(field) (_Offset(RGMWidgetRecord,0,field))
182 az_src_rec = widget_entry->header.az_src_rec;
184 if (widget_entry->resource_id != 0 ) {
185 sprintf (buffer, "Resource ID: %08X", widget_entry->resource_id);
186 src_append_machine_code (
191 } else if (widget_entry->obj_header.az_name != NULL) {
192 sprintf (buffer, "Resource index: %s",
193 widget_entry->obj_header.az_name->c_text);
194 src_append_machine_code (
201 w_rec = (RGMWidgetRecordPtr) UrmRCBuffer (az_context);
203 src_append_machine_code (
205 _WROffset (validation),
206 sizeof (w_rec->validation), (char*)& w_rec->validation,
209 sprintf (buffer, "size: %d", w_rec->size);
211 src_append_machine_code (
214 sizeof (w_rec->size), (char*)& w_rec->size,
217 w_rec_size = w_rec->size;
219 sprintf (buffer, "access: %s",
220 access_from_code (w_rec->access) );
222 src_append_machine_code (
225 sizeof (w_rec->access), (char*)& w_rec->access,
228 sprintf (buffer, "locked: ");
231 strcat (buffer, "true");
233 strcat (buffer, "false");
236 src_append_machine_code (
239 sizeof (w_rec->lock), (char*)& w_rec->lock,
242 sprintf (buffer, "type: ");
244 strcat (buffer, class_name_from_code (w_rec->type));
246 src_append_machine_code (
249 sizeof (w_rec->type), (char*)& w_rec->type,
252 if (w_rec->name_offs == (MrmOffset) 0) {
253 sprintf (buffer, "no name specified");
255 sprintf (buffer, "name: offset %X (hex)",
257 off_put (k_name_off, w_rec->name_offs);
260 src_append_machine_code (
262 _WROffset (name_offs),
263 sizeof (w_rec->name_offs),
264 (char*)& w_rec->name_offs,
267 if (w_rec->class_offs == (MrmOffset) 0) {
268 sprintf (buffer, "class: builtin");
270 sprintf (buffer, "class: offset %X (hex)",
272 off_put (k_class_off, w_rec->class_offs);
275 src_append_machine_code (
277 _WROffset (class_offs),
278 sizeof (w_rec->class_offs),
279 (char*)& w_rec->class_offs,
282 if (w_rec->arglist_offs == (MrmOffset) 0) {
283 sprintf (buffer, "no argument list");
285 sprintf (buffer, "argument list offset: %X (hex)", w_rec->arglist_offs);
286 off_put (k_arglist_off, w_rec->arglist_offs);
289 src_append_machine_code (
291 _WROffset (arglist_offs),
292 sizeof (w_rec->arglist_offs),
293 (char*)& w_rec->arglist_offs,
296 if (w_rec->children_offs == (MrmOffset) 0) {
297 sprintf (buffer, "no children");
299 sprintf (buffer, "children list offset: %X (hex)",
300 w_rec->children_offs);
301 off_put (k_children_off, w_rec->children_offs);
304 src_append_machine_code (
306 _WROffset (children_offs),
307 sizeof (w_rec->children_offs),
308 (char*)& w_rec->children_offs,
311 if (w_rec->comment_offs == (MrmOffset) 0) {
312 sprintf (buffer, "no comment specified");
314 sprintf (buffer, "comment: offset %X (hex)",
315 w_rec->comment_offs);
316 off_put (k_comment_off, w_rec->comment_offs);
319 src_append_machine_code (
321 _WROffset (comment_offs),
322 sizeof (w_rec->comment_offs),
323 (char*)& w_rec->comment_offs,
326 if (w_rec->creation_offs == (MrmOffset) 0) {
327 sprintf (buffer, "no creation callback");
329 sprintf (buffer, "creation callback offset: %X (hex)",
330 w_rec->creation_offs);
331 off_put (k_creation_off, w_rec->creation_offs);
334 src_append_machine_code (
336 _WROffset (creation_offs),
337 sizeof (w_rec->creation_offs),
338 (char*)& w_rec->creation_offs,
341 unload_stack(( char *) w_rec, w_rec_size, az_src_rec );
347 ** FUNCTIONAL DESCRIPTION:
349 ** This function unloads entries placed on a stack and outputs them
350 ** into the listing. The routine is used by both widgets and gadgets
351 ** to output their argument, control, and callback lists.
353 ** FORMAL PARAMETERS:
355 ** rec base of the record being annotated
356 ** rec_sizr size of the record being annotated
357 ** az_src_rec address of the source for record being annotated
370 void unload_stack( rec, rec_size, az_src_rec )
374 src_source_record_type *az_src_rec;
378 char buffer [132], * ptr;
381 while ( ! off_stack_empty ) {
383 unsigned short off_type, off_offset;
385 off_get (& off_type, & off_offset);
391 case k_comment_off : {
393 ptr = (char *) _Pointer(rec, off_offset);
394 src_append_machine_code (
395 az_src_rec, off_offset,
396 strlen (ptr) + 1, ptr, NULL );
400 case k_unknown_off : {
402 unsigned short int len;
404 /* Write out everything up to the next offset or the end of the
407 if ( ! off_stack_empty ) {
408 unsigned short int next_type, next_offset;
410 off_get (& next_type, & next_offset);
411 off_put (next_type, next_offset);
412 len = next_offset - off_offset;
414 len = rec_size - off_offset;
417 ptr = (char *) _Pointer(rec, off_offset);
418 src_append_machine_code (
419 az_src_rec, off_offset,
424 case k_arglist_off : {
426 RGMArgListDescPtr argdesc;
427 RGMArgumentPtr arg_ptr;
430 argdesc = (RGMArgListDescPtr) _Pointer(rec, off_offset);
432 sprintf (buffer, "argument count: %d", argdesc->count);
434 src_append_machine_code (
436 _Offset (RGMArgListDesc, off_offset, count),
437 sizeof (argdesc->count),
438 (char*)& argdesc->count,
441 sprintf (buffer, "related argument count: %d", argdesc->extra);
443 src_append_machine_code (
445 _Offset (RGMArgListDesc, off_offset, extra),
446 sizeof (argdesc->extra),
447 (char*)& argdesc->extra,
450 off_offset = _OffsetArray (RGMArgListDesc, off_offset, args);
452 for (j = 0, arg_ptr = argdesc->args;
454 j++, arg_ptr++, off_offset += sizeof (RGMArgument)) {
456 if (arg_ptr->tag_code != UilMrmUnknownCode )
461 resource_name_from_code(arg_ptr->tag_code));
466 _Pointer(rec,arg_ptr->stg_or_relcode.tag_offs);
468 "(%d) arg type: %s (user defined)",
473 src_append_machine_code (
475 _Offset (RGMArgument, off_offset, tag_code),
476 sizeof (arg_ptr->tag_code),
477 (char*)& arg_ptr->tag_code,
480 if (arg_ptr->stg_or_relcode.tag_offs == (MrmOffset) 0) {
481 sprintf (buffer, "(%d) no tag offset", j);
483 sprintf (buffer, "(%d) tag offset: %X (hex)",
484 j, arg_ptr->stg_or_relcode.tag_offs);
485 off_put (k_name_off, arg_ptr->stg_or_relcode.tag_offs);
488 src_append_machine_code (
490 _Offset (RGMArgument, off_offset, stg_or_relcode.tag_offs),
491 sizeof (arg_ptr->stg_or_relcode.tag_offs),
492 (char*)& arg_ptr->stg_or_relcode.tag_offs,
495 sprintf (buffer, "(%d) type: %s",
496 j, type_from_code (arg_ptr->arg_val.rep_type) );
498 src_append_machine_code (
500 _Offset (RGMArgument, off_offset,
502 sizeof (arg_ptr->arg_val.rep_type),
503 (char*)& arg_ptr->arg_val.rep_type,
506 sprintf (buffer, "(%d) ", j);
508 format_arg_value (& arg_ptr->arg_val,
509 & buffer [strlen (buffer)]);
511 src_append_machine_code (
513 _Offset (RGMArgument, off_offset,
515 sizeof (arg_ptr->arg_val.datum),
516 (char*)& arg_ptr->arg_val.datum,
528 dptr = (double *) _Pointer (rec, off_offset);
529 sprintf (buffer, "floating point value: %g", (* dptr));
530 src_append_machine_code (
533 sizeof (double), (char*)dptr, buffer );
537 /* single float data type RAP */
538 case k_single_float_off :
542 fptr = (float *) _Pointer(rec, off_offset);
543 sprintf(buffer, "Single float value: %g", (* fptr));
544 src_append_machine_code (
547 sizeof (float), (char*)fptr, buffer);
552 case k_creation_off :
553 case k_callback_off : {
555 RGMCallbackDescPtr cb_desc_ptr;
556 RGMCallbackItemPtr cb_item_ptr;
560 (RGMCallbackDescPtr) _Pointer (rec, off_offset);
562 src_append_machine_code (
564 _Offset (RGMCallbackDesc, off_offset, validation),
565 sizeof (cb_desc_ptr->validation),
566 (char*)& cb_desc_ptr->validation,
567 "callback descriptor" );
569 sprintf (buffer, "callback count: %d", cb_desc_ptr->count);
571 src_append_machine_code (
573 _Offset (RGMCallbackDesc, off_offset, count),
574 sizeof (cb_desc_ptr->count),
575 (char*)& cb_desc_ptr->count,
579 _OffsetArray (RGMCallbackDesc, off_offset, item);
581 for (j = 0, cb_item_ptr = cb_desc_ptr->item;
582 j < cb_desc_ptr->count;
584 off_offset += sizeof (RGMCallbackItem)) {
587 "(%d) routine name offset: %X (hex)",
588 j, cb_item_ptr->cb_item.routine);
590 src_append_machine_code (
592 _Offset (RGMCallbackItem, off_offset,
595 sizeof (cb_item_ptr->cb_item.routine),
596 (char*)& cb_item_ptr->cb_item.routine,
597 #else /* 64-bit architecture */
599 (char*)& cb_item_ptr->cb_item,
603 off_put (k_name_off, cb_item_ptr->cb_item.routine);
605 sprintf (buffer, "(%d) routine tag type: %s",
607 cb_item_ptr->cb_item.rep_type) );
609 src_append_machine_code
611 _Offset (RGMCallbackItem, off_offset,
614 sizeof (cb_item_ptr->cb_item.rep_type),
615 (char*)& cb_item_ptr->cb_item.rep_type,
616 #else /* 64-bit architecture */
618 (char*)& cb_item_ptr->cb_item + 4,
622 sprintf (buffer, "(%d) value: ", j);
623 src_append_machine_code
625 _Offset (RGMCallbackItem, off_offset,
627 sizeof (cb_item_ptr->cb_item.datum),
628 (char*)& cb_item_ptr->cb_item.datum,
636 case k_resource_off : {
638 RGMResourceDescPtr r_desc_ptr;
641 (RGMResourceDescPtr) _Pointer (rec, off_offset);
643 sprintf (buffer, "resource descriptor, size: %d",
646 src_append_machine_code (
648 _Offset (RGMResourceDesc, off_offset, size),
649 sizeof (r_desc_ptr->size),
650 (char*)& r_desc_ptr->size,
653 sprintf (buffer, "access: %s",
654 access_from_code (r_desc_ptr->access) );
656 src_append_machine_code (
658 _Offset (RGMResourceDesc, off_offset, access),
659 sizeof (r_desc_ptr->access),
660 (char*)& r_desc_ptr->access,
663 switch (r_desc_ptr->type) {
665 sprintf (buffer, "index, offset: %X (hex)",
666 _Offset (RGMResourceDesc, off_offset, key) );
669 _Offset (RGMResourceDesc, off_offset, key) );
674 sprintf (buffer, "resource ID, offset: %X (hex)",
675 _Offset (RGMResourceDesc, off_offset, key) );
677 off_put (k_resource_id_off,
678 _Offset (RGMResourceDesc, off_offset, key) );
682 sprintf (buffer, "unknown resource type");
686 src_append_machine_code (
688 _Offset (RGMResourceDesc, off_offset, type),
689 sizeof (r_desc_ptr->type),
690 (char*)& r_desc_ptr->type,
693 sprintf (buffer, "resource group: %s",
694 group_from_code (r_desc_ptr->res_group) );
696 src_append_machine_code (
698 _Offset (RGMResourceDesc, off_offset, res_group),
699 sizeof (r_desc_ptr->res_group),
700 (char*)& r_desc_ptr->res_group,
703 sprintf (buffer, "resource type: %s",
704 (r_desc_ptr->res_group == URMgLiteral) ?
705 type_from_code (r_desc_ptr->cvt_type) :
706 class_name_from_code (r_desc_ptr->cvt_type) );
708 src_append_machine_code (
710 _Offset (RGMResourceDesc, off_offset, cvt_type),
711 sizeof (r_desc_ptr->cvt_type),
712 (char*)& r_desc_ptr->cvt_type,
718 case k_resource_id_off : {
720 sprintf (buffer, "resource id");
722 src_append_machine_code (
725 sizeof (MrmResource_id),
726 (char *) _Pointer (rec, off_offset),
732 case k_children_off : {
734 RGMChildrenDescPtr c_desc_ptr;
737 c_desc_ptr = (RGMChildrenDescPtr) _Pointer(rec, off_offset);
739 sprintf (buffer, "Children count: %d",
742 src_append_machine_code (
744 _Offset (RGMChildrenDesc, off_offset, count),
745 sizeof (c_desc_ptr->count),
746 (char*)& c_desc_ptr->count,
750 _OffsetArray (RGMChildrenDesc, off_offset, child);
752 for (j = 0; j < c_desc_ptr->count;
753 j++, off_offset += sizeof (RGMChildDesc)) {
755 off_put (k_child_off, off_offset);
765 RGMChildDescPtr c_ptr;
768 c_ptr = (RGMChildDescPtr) _Pointer(rec, off_offset);
775 sprintf (buffer, "(%d) managed", j);
777 sprintf (buffer, "(%d) unmanaged", j);
780 src_append_machine_code (
782 _Offset (RGMChildDesc, off_offset, manage),
783 sizeof (c_ptr->manage),
784 (char*)& c_ptr->manage,
787 sprintf (buffer, "(%d) access: %s", j,
788 access_from_code (c_ptr->access) );
790 src_append_machine_code (
792 _Offset (RGMChildDesc, off_offset, access),
793 sizeof (c_ptr->access),
794 (char*)& c_ptr->access,
797 switch (c_ptr->type) {
799 sprintf (buffer, "(%d) index, offset: %X (hex)",
800 j, c_ptr->key.index_offs);
802 src_append_machine_code (
804 _Offset (RGMChildDesc, off_offset, type),
805 sizeof (c_ptr->type) + sizeof (c_ptr->key),
806 (char*)& c_ptr->type,
809 off_put (k_name_off, c_ptr->key.index_offs);
815 "(%d) resource ID, offset: %X (hex)",
816 j, _Offset (RGMChildDesc, off_offset, key) );
818 src_append_machine_code (
820 _Offset (RGMChildDesc, off_offset, type),
821 sizeof (c_ptr->type),
822 (char*)& c_ptr->type,
825 off_put (k_resource_id_off,
826 _Offset (RGMChildDesc, off_offset, key) );
831 sprintf (buffer, "(%d) unknown class", j);
833 src_append_machine_code (
835 _Offset (RGMChildDesc, off_offset, type),
836 sizeof (c_ptr->type),
837 (char*)& c_ptr->type,
853 src_append_machine_code ( az_src_rec, 0, 0, 0, 0 );
859 ** FUNCTIONAL DESCRIPTION:
861 ** This function saves the machine code listing information for values.
863 ** FORMAL PARAMETERS:
865 ** value_entry Symbol node for this value
866 ** az_context context containing the URM output information.
882 ** the machine code is saved in the source record structure for this
888 void save_value_machine_code ( value_entry, az_context )
890 sym_value_entry_type * value_entry;
891 URMResourceContext * az_context;
894 src_source_record_type * az_src_rec;
895 char buffer [132], * rc_buffer;
896 unsigned short int rc_size;
898 az_src_rec = value_entry->header.az_src_rec;
900 if (value_entry->resource_id != 0) {
901 sprintf (buffer, "Resource ID: %08X", value_entry->resource_id);
902 src_append_machine_code (
907 } else if (value_entry->obj_header.az_name != NULL) {
908 sprintf (buffer, "Resource index: %s",
909 value_entry->obj_header.az_name->c_text);
910 src_append_machine_code
917 sprintf (buffer, "size: %d, group: %s",
918 UrmRCSize (az_context),
919 group_from_code (UrmRCGroup (az_context)) );
920 src_append_machine_code ( az_src_rec, 0, 0, 0, buffer );
922 sprintf (buffer, "type: %s, access: %s, locked: ",
923 type_from_code (UrmRCType (az_context)),
924 access_from_code (UrmRCAccess (az_context)) );
926 if (UrmRCLock (az_context)) {
927 strcat (buffer, "true");
929 strcat (buffer, "false");
932 src_append_machine_code ( az_src_rec, 0, 0, 0, buffer );
934 rc_buffer = UrmRCBuffer (az_context);
935 rc_size = UrmRCSize (az_context);
938 ** Case on the type of literal.
941 switch (value_entry->b_type)
943 case sym_k_bool_value:
945 if ( * (unsigned long *) rc_buffer )
946 sprintf (buffer, "value: true");
948 sprintf (buffer, "value: false");
949 src_append_machine_code (
950 az_src_rec, 0, rc_size, rc_buffer, buffer );
953 case sym_k_integer_value:
954 case sym_k_horizontal_integer_value:
955 case sym_k_vertical_integer_value:
957 sprintf (buffer, "value: %d",
958 (* (unsigned long *) rc_buffer) );
959 src_append_machine_code (
960 az_src_rec, 0, rc_size, rc_buffer, buffer );
963 case sym_k_integer_table_value:
964 case sym_k_rgb_value: /* rgb data type RAP */
969 for (offset = 0; offset < (int)rc_size; offset += sizeof(int), index++)
971 sprintf (buffer, "value[%d]: %d",
972 index, ((unsigned long *) rc_buffer)[index] );
974 src_append_machine_code
975 (az_src_rec, 0, sizeof(int),
976 (char*)&(((unsigned long *)rc_buffer)[index]), buffer );
981 case sym_k_float_value:
982 case sym_k_horizontal_float_value:
983 case sym_k_vertical_float_value:
984 sprintf (buffer, "value: %g",
985 (* (double *) rc_buffer) );
986 src_append_machine_code (
987 az_src_rec, 0, rc_size, rc_buffer, buffer );
990 case sym_k_single_float_value:
991 sprintf (buffer, "value: %g",
992 (* (float *) rc_buffer));
993 src_append_machine_code
994 (az_src_rec, 0, rc_size, rc_buffer, buffer );
997 case sym_k_char_8_value:
998 case sym_k_color_value:
999 case sym_k_color_table_value:
1000 case sym_k_icon_value:
1001 case sym_k_font_value:
1002 case sym_k_fontset_value:
1003 case sym_k_font_table_value:
1004 case sym_k_reason_value:
1005 case sym_k_argument_value:
1006 case sym_k_identifier_value:
1007 case sym_k_compound_string_value:
1008 case sym_k_xbitmapfile_value:
1009 case sym_k_keysym_value:
1010 src_append_machine_code (
1013 rc_size, rc_buffer, 0 );
1016 case sym_k_asciz_table_value:
1017 case sym_k_string_table_value: {
1018 RGMTextVectorPtr tv_ptr;
1019 unsigned short off_type, off_offset, off_cnt;
1023 tv_ptr = (RGMTextVectorPtr) rc_buffer;
1024 src_append_machine_code (
1026 _Offset (RGMTextVector, off_offset, validation),
1027 sizeof (tv_ptr->validation),
1028 (char*)& tv_ptr->validation,
1031 sprintf (buffer, "count: %d", tv_ptr->count);
1032 src_append_machine_code (
1034 _Offset (RGMTextVector, off_offset, count),
1035 sizeof (tv_ptr->count), (char*)& tv_ptr->count,
1038 off_offset = _OffsetArray (RGMTextVector, off_offset, item);
1039 for (i = 0; i < tv_ptr->count;
1040 i++, off_offset += sizeof (RGMTextEntry)) {
1042 off_put (k_text_entry_off, off_offset);
1045 off_put (k_null_text_entry_off, off_offset);
1047 while ( ! off_stack_empty ) {
1049 RGMTextEntryPtr te_ptr;
1050 off_get (& off_type, & off_offset);
1055 char *stringPtr = (char *) _Pointer (rc_buffer,off_offset);
1056 src_append_machine_code (az_src_rec, off_offset,
1057 ASNstrlen( stringPtr ),
1062 case k_null_text_entry_off :
1064 src_append_machine_code (
1065 az_src_rec, off_offset,
1066 sizeof (RGMTextEntry),
1067 (char*)_Pointer (rc_buffer, off_offset),
1068 "end of text vector" );
1072 case k_text_entry_off :
1074 te_ptr = (RGMTextEntryPtr)
1075 _Pointer (rc_buffer, off_offset);
1077 sprintf (buffer, "(%d) type: %s, offset: %X (hex)",
1079 type_from_code (te_ptr->text_item.rep_type),
1080 te_ptr->text_item.offset );
1082 src_append_machine_code (
1084 _Offset (RGMTextEntry, off_offset,
1086 sizeof (te_ptr->text_item),
1087 (char*)& te_ptr->text_item,
1092 off_put (k_name_off, te_ptr->text_item.offset);
1098 sprintf (buffer, "(%d) unknown text entry", i);
1100 src_append_machine_code (
1112 case sym_k_trans_table_value:
1114 src_append_machine_code (
1115 az_src_rec, 0, rc_size, rc_buffer, NULL );
1121 sprintf (buffer, "unknown value");
1123 src_append_machine_code (
1132 src_append_machine_code ( az_src_rec, 0, 0, 0, 0 );
1138 ** FUNCTIONAL DESCRIPTION:
1140 ** This function saves the machine code listing information for modules.
1142 ** FORMAL PARAMETERS:
1144 ** az_src_rec Source record for this machine code info.
1145 ** az_context context containing the URM output information.
1151 ** IMPLICIT OUTPUTS:
1161 ** the machine code is saved in the source record structure
1166 void save_module_machine_code ( az_src_rec, az_context )
1168 src_source_record_type * az_src_rec;
1169 URMResourceContext * az_context;
1173 RGMModuleDescPtr m_rec;
1174 RGMTopmostDescPtr t_rec;
1176 unsigned short off_offset;
1181 m_rec = (RGMModuleDescPtr) UrmRCBuffer (az_context);
1183 src_append_machine_code (
1185 _Offset (RGMModuleDesc, off_offset, validation),
1186 sizeof (m_rec->validation), (char*)& m_rec->validation,
1189 sprintf (buffer, "topmost count: %d", m_rec->count);
1191 src_append_machine_code (
1193 _Offset (RGMModuleDesc, off_offset, count),
1194 sizeof (m_rec->count), (char*)& m_rec->count,
1197 off_offset = _OffsetArray (RGMModuleDesc, off_offset, topmost);
1199 for (i = 0, t_rec = m_rec->topmost;
1201 i++, t_rec++, off_offset += sizeof (RGMTopmostDesc)) {
1203 sprintf (buffer, "(%d) %s", i, t_rec->index);
1205 src_append_machine_code (
1207 _OffsetArray (RGMTopmostDesc, off_offset, index),
1208 strlen(t_rec->index), t_rec->index,
1213 src_append_machine_code ( az_src_rec, 0, 0, 0, 0 );
1219 ** FUNCTIONAL DESCRIPTION:
1221 ** This function adds an offset entry to the offset stack for
1222 ** machine code. The entry is inserted in the proper place in
1223 ** the stack depending on the offset value.
1225 ** FORMAL PARAMETERS:
1227 ** off_type type of offset entry
1228 ** off_offset offset value for this offset entry
1232 ** off_info_cnt number of offset stack entries
1233 ** off_info_stack stack containing offset entries
1235 ** IMPLICIT OUTPUTS:
1237 ** off_info_cnt number of offset stack entries
1238 ** off_info_stack stack containing offset entries
1246 ** the offset info is saved in the offset stack
1253 (unsigned short off_type, unsigned short off_offset)
1256 off_info_type off_info, * off_info_ptr;
1259 if (off_info_cnt >= k_off_stack_size) {
1260 diag_issue_internal_error ("stack overflow in machine listing");
1263 off_info.w_off_type = off_type;
1264 off_info.w_off_offset = off_offset;
1266 /* Insert on the stack before the first entry with a lower offset
1269 for (i = 0, off_info_ptr = off_info_stack;
1270 i < off_info_cnt; i++, off_info_ptr++) {
1271 if (off_info.w_off_offset > off_info_ptr->w_off_offset) {
1276 _move ( & off_info_ptr [1], off_info_ptr,
1277 (off_info_cnt - i) * sizeof (off_info_type) );
1279 (* off_info_ptr) = off_info;
1286 ** FUNCTIONAL DESCRIPTION:
1288 ** This function removes an offset entry to the offset stack for
1291 ** FORMAL PARAMETERS:
1293 ** off_type address to receive the type of offset entry
1294 ** off_offset address to receive the offset value for this
1299 ** off_info_cnt number of offset stack entries
1300 ** off_info_stack stack containing offset entries
1302 ** IMPLICIT OUTPUTS:
1304 ** off_info_cnt number of offset stack entries
1305 ** off_info_stack stack containing offset entries
1313 ** the offset info is retrieved from the offset stack
1318 void off_get (off_type, off_offset)
1320 unsigned short * off_type;
1321 unsigned short * off_offset;
1324 off_info_type * off_info_ptr;
1326 if (off_info_cnt <= 0) {
1327 diag_issue_internal_error ("stack underflow in machine listing");
1330 /* Remove from the stack the entry with the lowest offset value */
1332 off_info_ptr = & off_info_stack [off_info_cnt - 1];
1334 (* off_type) = off_info_ptr->w_off_type;
1335 (* off_offset) = off_info_ptr->w_off_offset;
1341 char * type_from_code
1348 * PROCEDURE DESCRIPTION:
1350 * This procedure returns the string corresponding to a URM type code
1352 * FORMAL PARAMETERS:
1354 * type type code from RGMrType...
1366 * The string corresponding to the type code
1379 case MrmRtypeInteger:
1380 return uil_datatype_names[sym_k_integer_value];
1381 case MrmRtypeHorizontalInteger:
1382 return uil_datatype_names[sym_k_horizontal_integer_value];
1383 case MrmRtypeVerticalInteger:
1384 return uil_datatype_names[sym_k_vertical_integer_value];
1385 case MrmRtypeBoolean:
1386 return uil_datatype_names[sym_k_bool_value];
1388 return uil_datatype_names[sym_k_char_8_value];
1389 case MrmRtypeChar8Vector:
1390 return uil_datatype_names[sym_k_asciz_table_value];
1391 case MrmRtypeCString:
1392 return uil_datatype_names[sym_k_compound_string_value];
1393 case MrmRtypeCStringVector:
1394 return uil_datatype_names[sym_k_string_table_value];
1396 return uil_datatype_names[sym_k_float_value];
1397 case MrmRtypeHorizontalFloat:
1398 return uil_datatype_names[sym_k_horizontal_float_value];
1399 case MrmRtypeVerticalFloat:
1400 return uil_datatype_names[sym_k_vertical_float_value];
1401 case MrmRtypeSingleFloat: /* single float data type RAP */
1402 return uil_datatype_names[sym_k_single_float_value];
1403 case MrmRtypeCallback:
1405 case MrmRtypePixmapImage:
1406 return "pixmap image";
1407 case MrmRtypePixmapDDIF:
1408 return "pixmap DDIF";
1409 case MrmRtypeResource:
1411 case MrmRtypeAddrName:
1413 case MrmRtypeIconImage:
1414 return uil_datatype_names[sym_k_icon_value];
1416 return uil_datatype_names[sym_k_font_value];
1417 case MrmRtypeFontSet:
1418 return uil_datatype_names[sym_k_fontset_value];
1419 case MrmRtypeFontList:
1420 return uil_datatype_names[sym_k_font_table_value];
1422 return uil_datatype_names[sym_k_color_value];
1423 case MrmRtypeColorTable:
1424 return uil_datatype_names[sym_k_color_table_value];
1426 return uil_datatype_names[sym_k_any_value];
1427 case MrmRtypeTransTable:
1428 return uil_datatype_names[sym_k_trans_table_value];
1429 case MrmRtypeClassRecName:
1430 return uil_datatype_names[sym_k_class_rec_name_value];
1431 case MrmRtypeIntegerVector:
1432 return uil_datatype_names[sym_k_integer_table_value];
1433 case MrmRtypeXBitmapFile:
1434 return uil_datatype_names[sym_k_xbitmapfile_value];
1435 case MrmRtypeKeysym:
1436 return uil_datatype_names[sym_k_keysym_value];
1443 char * access_from_code
1445 (MrmFlag access_code)
1450 * PROCEDURE DESCRIPTION:
1452 * This procedure returns the string corresponding to a URM access code
1454 * FORMAL PARAMETERS:
1456 * access_code access code
1468 * The string corresponding to the access code
1479 switch (access_code) {
1480 case URMaPublic: return "public";
1481 case URMaPrivate: return "private";
1482 default: return "unknown";
1487 char * group_from_code
1489 (MrmGroup group_code)
1494 * PROCEDURE DESCRIPTION:
1496 * This procedure returns the string corresponding to a URM group code
1498 * FORMAL PARAMETERS:
1500 * group_code group code
1512 * The string corresponding to the group code
1523 switch (group_code) {
1524 case URMgWidget: return "widget";
1525 case URMgLiteral: return "literal";
1526 case URMgResourceSet: return "resource set";
1527 default: return "unknown";
1533 void format_arg_value (argval_ptr, buffer)
1535 RGMArgValuePtr argval_ptr;
1541 * FUNCTION PROTOTYPE
1543 * PROCEDURE DESCRIPTION:
1545 * This routine formats a value descriptor into the buffer.
1547 * FORMAL PARAMETERS:
1549 * argval_ptr pointer to the argument value descriptor
1550 * buffer buffer to receive the formatted value
1568 switch ( argval_ptr->rep_type ) {
1570 case MrmRtypeInteger:
1571 case MrmRtypeHorizontalInteger:
1572 case MrmRtypeVerticalInteger:
1573 sprintf (buffer, "value: %d", argval_ptr->datum.ival);
1576 case MrmRtypeBoolean:
1577 if (argval_ptr->datum.ival) {
1578 sprintf (buffer, "value: true");
1580 sprintf (buffer, "value: false");
1585 case MrmRtypeCStringVector:
1586 case MrmRtypePixmapImage:
1587 case MrmRtypePixmapDDIF:
1588 case MrmRtypeCString:
1589 case MrmRtypeAddrName:
1590 case MrmRtypeKeysym:
1591 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1592 off_put (k_unknown_off, argval_ptr->datum.offset);
1596 case MrmRtypeHorizontalFloat:
1597 case MrmRtypeVerticalFloat:
1598 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1599 off_put (k_float_off, argval_ptr->datum.offset);
1602 case MrmRtypeSingleFloat: /* single float data type RAP */
1603 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1604 off_put (k_single_float_off, argval_ptr->datum.offset);
1607 case MrmRtypeCallback:
1608 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1609 off_put (k_callback_off, argval_ptr->datum.offset);
1612 case MrmRtypeResource:
1613 sprintf (buffer, "offset: %X (hex)", argval_ptr->datum.offset);
1614 off_put (k_resource_off, argval_ptr->datum.offset);
1618 sprintf (buffer, "value unknown");
1625 char * class_name_from_code
1632 * PROCEDURE DESCRIPTION:
1634 * This procedure returns the string corresponding to a URM class code
1636 * FORMAL PARAMETERS:
1638 * class class code from URMwc...
1650 * The string corresponding to the class code
1665 * Find the sym_k code for the class, then return its name
1667 for ( sym_code=sym_k_error_object+1;
1668 sym_code<=uil_max_object;
1670 if ( uil_widget_compr[sym_code] == class )
1671 return uil_widget_names[sym_code];
1677 char * resource_name_from_code
1684 * PROCEDURE DESCRIPTION:
1686 * This procedure returns the string corresponding to a compression code
1688 * FORMAL PARAMETERS:
1690 * resource compression code for argument or reason
1702 * The string corresponding to the resource code
1717 * Find the sym_k code for the resource, then return its name
1719 for ( sym_code=0 ; sym_code<=uil_max_arg ; sym_code++ )
1720 if ( uil_arg_compr[sym_code] == resource )
1721 return uil_argument_names[sym_code];
1722 for ( sym_code=0 ; sym_code<=uil_max_reason ; sym_code++ )
1723 if ( uil_reas_compr[sym_code] == resource )
1724 return uil_reason_names[sym_code];
1725 for ( sym_code=0 ; sym_code<=uil_max_child ; sym_code++ )
1726 if ( uil_child_compr[sym_code] == resource )
1727 return uil_child_names[sym_code];