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: UilSrcSrc.c /main/13 1997/03/12 15:21:40 dbl $"
40 * (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
46 ** User Interface Language Compiler (UIL)
50 ** This module contains the procedure for managing the UIL source
72 ** DEFINE and MACRO DEFINITIONS
80 ** EXTERNAL VARIABLE DECLARATIONS
87 ** GLOBAL VARIABLE DECLARATIONS
92 ** define the source buffer data structures
95 externaldef(uil_comp_glbl) src_source_buffer_type *src_az_current_source_buffer;
96 externaldef(uil_comp_glbl) src_source_buffer_type *src_az_avail_source_buffer;
97 externaldef(uil_comp_glbl) src_message_item_type *src_az_orphan_messages;
99 externaldef(uil_comp_glbl) long Uil_file_size;
105 ** define the source record data structures
108 externaldef(uil_comp_glbl) src_source_record_type
109 *src_az_current_source_record;
110 externaldef(uil_comp_glbl) src_source_record_type
111 *src_az_first_source_record;
113 externaldef(uil_comp_glbl) uil_fcb_type
114 *src_az_source_file_table[src_k_max_source_files];
115 externaldef(uil_comp_glbl) int
116 src_l_last_source_file_number;
120 ** OWN VARIABLE DECLARATIONS
123 static uil_fcb_type *main_fcb;
124 static char *include_dir;
125 static unsigned short main_dir_len;
132 ** FUNCTIONAL DESCRIPTION:
134 ** This procedure initializes the reading of the UIL source program.
136 ** FORMAL PARAMETERS:
146 ** src_az_first_source_buffer
147 ** src_az_current_source_buffer
148 ** src_l_last_source_file_number
149 ** src_az_source_file_table
150 ** src_az_current_source_record
161 ** source file is opened
162 ** source buffer structure is setup
163 ** source record structure is setup
169 src_initialize_source(void)
171 /* initialize source data structures */
173 src_az_current_source_buffer = NULL;
174 src_az_avail_source_buffer = NULL;
175 src_l_last_source_file_number = -1;
176 src_az_first_source_record = NULL;
177 src_az_current_source_record =
178 (src_source_record_type *) &src_az_first_source_record;
180 /* Initialize Own storage */
187 /* open the source file */
188 if ( Uil_cmd_z_command.ac_source_file == NULL )
189 diag_issue_diagnostic (d_src_open,
190 diag_k_no_source, diag_k_no_column,
193 src_open_file ( Uil_cmd_z_command.ac_source_file, NULL );
195 /* fixes initial filename is NULL bug in callable UIL */
196 Uil_current_file = Uil_cmd_z_command.ac_source_file;
203 ** FUNCTIONAL DESCRIPTION:
205 ** This procedure does the cleanup processing of the source files
208 ** FORMAL PARAMETERS:
215 ** src_az_first_source_buffer
216 ** src_az_current_source_buffer
217 ** src_l_last_source_file_number
218 ** src_az_source_file_table
219 ** src_az_current_source_record
231 ** structures are freed
237 Uil_src_cleanup_source(void)
240 int i; /* index over fcbs */
241 src_source_buffer_type *buffer_to_free;
242 src_source_record_type *record_to_free;
243 src_machine_code_type *first_code_item;
244 src_machine_code_type *code_item_to_free;
245 status l_close_status;
248 ** Loop through all open files freeing their fcbs
250 for (i = 0; i <= src_l_last_source_file_number; i++)
252 /* it is possible to get an error before the files are open,
253 so check and see if table is NULL before opening */
254 if (src_az_source_file_table[i] == NULL)
256 l_close_status = close_source_file (src_az_source_file_table[i]);
257 if ( l_close_status == src_k_close_error )
259 diag_issue_diagnostic (d_src_close,
260 diag_k_no_source, diag_k_no_column,
261 src_az_source_file_table[i]->expanded_name);
263 _free_memory ((char*)src_az_source_file_table [i]);
264 src_az_source_file_table[i] = NULL;
268 ** Loop through list of current source buffers, freeing them
270 while (src_az_current_source_buffer != NULL)
272 buffer_to_free = src_az_current_source_buffer;
273 src_az_current_source_buffer =
274 src_az_current_source_buffer->az_prior_source_buffer;
275 _free_memory ((char*)buffer_to_free);
279 ** Loop through list of source records, freeing them
281 while (src_az_first_source_record != NULL)
283 record_to_free = src_az_first_source_record;
284 first_code_item = record_to_free->az_machine_code_list;
286 while (first_code_item != NULL)
288 code_item_to_free = first_code_item;
289 first_code_item = first_code_item->az_next_machine_code;
290 _free_memory((char *)code_item_to_free);
293 src_az_first_source_record =
294 src_az_first_source_record->az_next_source_record;
295 _free_memory ((char*)record_to_free);
301 /* BEGIN OSF FIX pir 2240 */
302 /* Memory pointed to by main_fcb already freed. */
303 /* END OSF FIX pir 2240 */
304 _free_memory (include_dir);
311 ** FUNCTIONAL DESCRIPTION:
313 ** This procedure opens a file and sets up the static pointers to
314 ** read from this file.
316 ** FORMAL PARAMETERS:
318 ** c_file_name file to open
322 ** src_az_first_source_buffer
323 ** src_az_current_source_buffer
324 ** src_l_last_source_file_number
325 ** src_az_source_file_table
329 ** src_az_first_source_buffer
330 ** src_az_current_source_buffer
331 ** src_l_last_source_file_number
332 ** src_az_source_file_table
340 ** input file is opened
341 ** input buffer structure is setup
342 ** input record structure is setup
348 src_open_file (XmConst char *c_file_name,
349 char *full_file_name)
351 uil_fcb_type *az_fcb; /* file control block ptr */
352 status l_open_status; /* status variable */
353 src_source_buffer_type *az_source_buffer; /* source buffer ptr */
355 /* allocate fcb and source buffer */
357 az_fcb = (uil_fcb_type *) _get_memory (sizeof (uil_fcb_type));
359 if (src_az_avail_source_buffer != NULL) {
360 az_source_buffer = src_az_avail_source_buffer;
361 src_az_avail_source_buffer =
362 src_az_avail_source_buffer->az_prior_source_buffer;
365 (src_source_buffer_type *)
366 _get_memory (sizeof (src_source_buffer_type));
369 /* Call the OS-specific open file procedure */
371 l_open_status = open_source_file (
376 /* If the file is not found, a fatal error is generated. */
378 if ( l_open_status == src_k_open_error ) {
379 diag_issue_diagnostic( d_src_open,
380 diag_k_no_source, diag_k_no_column,
384 /* put fcb in the file table */
386 src_l_last_source_file_number++;
388 if (src_l_last_source_file_number >= src_k_max_source_files) {
389 diag_issue_diagnostic (
391 src_az_current_source_record,
392 src_az_current_source_buffer -> w_current_position - 1,
393 az_fcb->expanded_name );
396 src_az_source_file_table[ src_l_last_source_file_number ] = az_fcb;
398 /* Complete the OS-independent initialization. Get the size of the file
399 ** for %complete info then initialize a source
400 ** buffer placing a null in the buffer will cause the lexical analyzer
401 ** to start by reading the first line of the file
405 if (stat(az_fcb->expanded_name, &stbuf) == -1) {
406 diag_issue_diagnostic( d_src_open,
407 diag_k_no_source, diag_k_no_column,
408 az_fcb->expanded_name );
411 Uil_file_size = stbuf.st_size;
413 if (full_file_name != NULL)
414 strcpy (full_file_name, az_fcb->expanded_name);
416 az_fcb->v_position_before_get = FALSE;
418 az_source_buffer->w_current_line_number = 0;
419 az_source_buffer->b_file_number = src_l_last_source_file_number;
420 az_source_buffer->w_current_position = 0;
421 az_source_buffer->c_text[ 0 ] = 0;
423 /* make the source buffer current */
425 az_source_buffer->az_prior_source_buffer =
426 src_az_current_source_buffer;
427 src_az_current_source_buffer = az_source_buffer;
434 ** FUNCTIONAL DESCRIPTION:
436 ** This procedure reads the next source line;
438 ** FORMAL PARAMETERS:
444 ** src_az_source_file_table
448 ** src_az_current_source_buffer
449 ** src_az_current_source_record
453 ** src_k_end_source no more source lines
454 ** src_k_read_normal new line in the source buffer
458 ** may issue diagnostics if error occurs reading record
459 ** may restore previous source upon reaching end of current source
465 src_get_source_line(void)
467 uil_fcb_type *az_fcb;
468 src_source_record_type *az_source_record;
469 status l_read_status;
471 /* Return if already at the end of file */
473 if (src_az_current_source_buffer == NULL)
474 return src_k_end_source;
476 /* Find the current fcb */
478 az_fcb = src_az_source_file_table
479 [ src_az_current_source_buffer->b_file_number ];
481 /* Read the next record */
483 l_read_status = get_line( az_fcb );
485 /* Increment lines processed count, and update current file */
486 Uil_lines_processed++;
487 Uil_current_file = az_fcb->expanded_name;
489 if ( (l_read_status == src_k_read_normal) ||
490 (l_read_status == src_k_read_truncated) )
492 /* Read was successful
493 * Set position to the start of the record */
495 src_az_current_source_buffer->w_current_position = 0;
497 /* Allocate and initialize a source record */
500 (src_source_record_type *)
501 _get_memory( sizeof( src_source_record_type ) );
503 az_source_record->az_next_source_record = NULL;
504 az_source_record->w_line_number =
505 ++src_az_current_source_buffer->w_current_line_number;
506 az_source_record->b_file_number =
507 src_az_current_source_buffer->b_file_number;
508 az_source_record->az_message_list = NULL;
509 az_source_record->az_machine_code_list = NULL;
510 az_source_record->w_machine_code_cnt = 0;
511 az_source_record->z_access_key = az_fcb->last_key;
513 /* was uninitialized; fixes listing problem on HP (RAP) */
514 az_source_record->b_flags = 0;
516 /* Link the source record to the end of source record list */
518 src_az_current_source_record->az_next_source_record =
520 src_az_current_source_record = az_source_record;
522 if (l_read_status == src_k_read_truncated)
523 diag_issue_diagnostic( d_src_truncate,
524 src_az_current_source_record,
526 src_k_max_source_line_length );
528 return src_k_read_normal;
531 /* Check for end of file */
533 if (l_read_status == src_k_end_source)
535 src_source_buffer_type *az_prior_source_buffer;
537 /* get prior source buffer */
539 az_prior_source_buffer =
540 src_az_current_source_buffer->az_prior_source_buffer;
542 /* place current source buffer on the available list */
544 src_az_current_source_buffer->az_prior_source_buffer =
545 src_az_avail_source_buffer;
546 src_az_avail_source_buffer = src_az_current_source_buffer;
548 /* if there is no prior source buffer - return end of source */
550 if (az_prior_source_buffer == NULL)
551 return src_k_end_source;
553 /* restore the prior buffer as current */
555 src_az_current_source_buffer = az_prior_source_buffer;
557 return src_k_read_normal;
560 /* must have been an error */
562 diag_issue_diagnostic( d_src_read,
563 src_az_current_source_record,
565 az_fcb->expanded_name );
567 _assert( FALSE, "read past source error" );
568 return(src_k_read_error);
579 ** FUNCTIONAL DESCRIPTION:
581 ** open the source file.
583 ** FORMAL PARAMETERS:
585 ** c_file_name source file to open
586 ** az_fcb file control block for the file
587 ** az_source_buffer source buffer for the file
604 ** file is opened and has a source buffer associated with it
610 open_source_file( XmConst char *c_file_name,
611 uil_fcb_type *az_fcb,
612 src_source_buffer_type *az_source_buffer )
615 static unsigned short main_dir_len = 0;
617 int i; /* loop index through include files */
621 /* place the file name in the expanded_name buffer */
623 strcpy(buffer, c_file_name);
625 /* Determine if this is the main file or an include file. */
627 main_file = (main_fcb == NULL);
634 /* Save the directory info for the main file. */
636 for (len = strlen (c_file_name),
637 ptr = & c_file_name [len - 1];
638 len > 0; len--, ptr--) {
639 if ((* ptr) == '/') {
647 /* Open the main file. */
649 az_fcb->az_file_ptr = fopen(c_file_name, "r");
652 static char XmConst c_include_dir[]= "/usr/include/";
653 Boolean search_user_include=True;
654 Boolean specific_directory=False;
656 /* See if the file name has a leading slash and set the flag.
657 Look in the specified directory for the include file. If the dir
658 is not specified (leading slash), look in the main file's directory */
660 if (c_file_name[0] == '/') {
661 specific_directory = True;
664 if (!specific_directory) {
665 _move (buffer, main_fcb -> expanded_name, main_dir_len);
666 _move (& buffer [main_dir_len],
667 c_file_name, strlen (c_file_name) + 1); /* + NULL */
669 strcpy (buffer, c_file_name);
672 /* Open the include file. */
674 az_fcb->az_file_ptr = fopen (buffer, "r");
676 /* If a specific directory was specified, or if the file was found,
679 if ( (specific_directory) || (az_fcb -> az_file_ptr != NULL) ) {
683 /* Look in the command line specified include directories, if any. */
685 for (i = 0; i < Uil_cmd_z_command.include_dir_count; i++) {
688 inc_dir_len = strlen (Uil_cmd_z_command.ac_include_dir[i]);
689 if (inc_dir_len == 0) {
690 search_user_include = False;
692 _move (buffer, Uil_cmd_z_command.ac_include_dir[i], inc_dir_len);
694 /* Add '/' if not specified at end of directory */
696 if (Uil_cmd_z_command.ac_include_dir[i][inc_dir_len - 1] != '/') {
697 buffer [inc_dir_len] = '/';
701 _move (& buffer [inc_dir_len],
702 c_file_name, strlen (c_file_name) + 1); /* + NULL */
704 /* Open the include file. If found, we are done. */
706 az_fcb->az_file_ptr = fopen (buffer, "r");
708 if (az_fcb -> az_file_ptr != NULL) {
713 /* Look in the default include directory. */
714 if (search_user_include) {
715 _move(buffer, c_include_dir, sizeof c_include_dir - 1); /* no NULL */
716 _move(&buffer[sizeof c_include_dir - 1],
717 c_file_name, strlen (c_file_name) + 1); /* + NULL */
719 /* Open the include file. */
720 az_fcb->az_file_ptr = fopen (buffer, "r");
726 /* check the open status. */
728 if (az_fcb->az_file_ptr == NULL)
729 return src_k_open_error;
731 /* open succeeded - place buffer address in fcb */
733 az_fcb->c_buffer = az_source_buffer->c_text;
734 az_fcb->c_buffer[ src_k_max_source_line_length ] = 0;
735 strcpy(az_fcb->expanded_name, buffer);
737 return src_k_open_normal;
743 ** FUNCTIONAL DESCRIPTION:
745 ** close the source file.
747 ** FORMAL PARAMETERS:
749 ** az_fcb file control block for the file
761 ** src_k_close_normal
772 close_source_file( uil_fcb_type *az_fcb )
774 status l_close_status;
780 l_close_status = fclose (az_fcb->az_file_ptr);
782 if ( l_close_status != EOF )
783 return src_k_close_normal;
785 return src_k_close_error;
790 ** FUNCTIONAL DESCRIPTION:
792 ** read line of the source file.
794 ** FORMAL PARAMETERS:
796 ** az_fcb file control block for the file
810 ** src_k_read_truncated
815 ** next record in file is read
821 get_line( uil_fcb_type *az_fcb )
823 status l_read_status;
827 ** if v_position_before_get is true, we need to reposition
828 ** before the get because another retrieve has altered the
832 if (az_fcb->v_position_before_get)
834 fseek( az_fcb->az_file_ptr,
835 az_fcb->last_key.l_key,
837 l_read_status = (status) (fgets(az_fcb->c_buffer,
838 src_k_max_source_line_length,
839 az_fcb->az_file_ptr) != NULL);
840 az_fcb->v_position_before_get = FALSE;
843 /* get the current offset */
845 az_fcb->last_key.l_key = ftell(az_fcb->az_file_ptr);
847 /* read the next line */
849 l_read_status = (status) (fgets(az_fcb->c_buffer,
850 src_k_max_source_line_length,
851 az_fcb->az_file_ptr) != NULL );
853 if ( l_read_status != 0 )
855 /* Read was successful
856 * Find \n character an replace with a null */
858 c_new_line = (char *) strchr( az_fcb->c_buffer, '\n' );
860 if (c_new_line == NULL) {
862 /* Fix for CR 3044 -- only return truncated if not at eof */
864 if (!feof(az_fcb->az_file_ptr))
865 return src_k_read_truncated;
870 return src_k_read_normal;
873 /* Check for end of file */
875 if (feof(az_fcb->az_file_ptr))
877 if (sym_az_current_section_entry->prev_section != NULL)
879 sym_include_file_entry_type *include_entry;
882 ** This is the end of an include file. Set the pointers so that the sections
883 ** in the include file hang off the previous list correctly.
885 include_entry = (sym_include_file_entry_type *)
886 sym_az_current_section_entry->prev_section->entries;
887 include_entry->sections = sym_az_current_section_entry;
888 sym_az_current_section_entry = sym_az_current_section_entry->prev_section;
890 return src_k_end_source;
893 /* must have been an error */
895 return src_k_read_error;
900 ** FUNCTIONAL DESCRIPTION:
902 ** re-read line of the source file.
904 ** FORMAL PARAMETERS:
906 ** az_fcb file control block for the file
907 ** c_buffer pointer to buffer to hold the source line
908 ** z_access_key key to retrieve the source line
916 ** v_position_before_read = TRUE
920 ** true if the record can be retrieved
921 ** false if the record cannot be retrieved
925 ** change next record for the file
931 reget_line( uil_fcb_type *az_fcb,
933 XmConst z_key *z_access_key )
935 status l_read_status;
938 fseek( az_fcb->az_file_ptr,
942 l_read_status = (status) (fgets(c_buffer,
943 src_k_max_source_line_length,
944 az_fcb->az_file_ptr) != NULL );
946 az_fcb->v_position_before_get = TRUE;
948 if ( l_read_status != 0 )
950 /* Read was successful
951 * Find \n character an replace with a null */
953 c_new_line = (char *) strchr( c_buffer, '\n' );
955 if (c_new_line == NULL) {
957 /* Fix for CR 3044 -- only return truncated if not at eof */
959 if (!feof(az_fcb->az_file_ptr))
960 return src_k_read_truncated;
968 /* must have been an error */
976 ** FUNCTIONAL DESCRIPTION:
978 ** Given a source record, this function returns the file name of
979 ** the file containing that source record.
981 ** FORMAL PARAMETERS:
983 ** az_src_rec pointer to a source record structure
987 ** src_az_source_file_table
995 ** pointer to the file name string
1005 *src_get_file_name(XmConst src_source_record_type *az_src_rec)
1009 /* Find the correct fcb */
1011 fcb = src_az_source_file_table[ az_src_rec->b_file_number ];
1013 /* Return a pointer to file name */
1015 return fcb->expanded_name;
1020 ** FUNCTIONAL DESCRIPTION:
1022 ** Given a source record, this function retrieves the text of the
1023 ** line corresponding to that source line.
1025 ** FORMAL PARAMETERS:
1027 ** az_src_rec pointer to a source record structure
1028 ** c_buffer pointer to buffer to hold the text
1032 ** src_az_source_file_table
1034 ** IMPLICIT OUTPUTS:
1040 ** true if there is a source line
1041 ** false if there is no source line
1045 ** buffer is set to the contents of source line
1050 static char XmConst no_source[] = "[ source not available ]";
1054 boolean src_retrieve_source
1056 (XmConst src_source_record_type *az_src_rec,
1062 /* check if there is any source */
1064 if (az_src_rec == diag_k_no_source)
1066 _move( c_buffer, no_source, sizeof no_source );
1071 ** check if we are dealing with the current source record
1072 ** in which case we don't need to reread the source
1075 if ((az_src_rec->b_file_number ==
1076 src_az_current_source_buffer->b_file_number)
1078 (az_src_rec->w_line_number ==
1079 src_az_current_source_buffer->w_current_line_number)
1083 src_az_current_source_buffer->c_text);
1088 ** Will have to reread the data from the file.
1091 /* Find the correct fcb */
1093 fcb = src_az_source_file_table[ az_src_rec->b_file_number ];
1097 if (reget_line( fcb, c_buffer, (z_key *) &(az_src_rec->z_access_key) ))
1100 _move( c_buffer, no_source, sizeof no_source );
1108 ** FUNCTIONAL DESCRIPTION:
1110 ** This function adds diagnostic information to the source representation.
1111 ** This permit diagnostics to be placed in the listing.
1113 ** FORMAL PARAMETERS:
1115 ** az_src_rec source line diagnostic issued against
1116 ** l_src_pos offset of diagnostic in the source line
1117 ** c_msg_text text of diagnostic
1118 ** l_msg_number message number for diagnostic
1124 ** IMPLICIT OUTPUTS:
1134 ** diagnostic stuff away in the source structure
1140 src_append_diag_info( XmConst src_source_record_type *az_src_rec,
1141 XmConst int l_src_pos,
1142 XmConst char *c_msg_text,
1143 XmConst int l_msg_number )
1145 src_message_item_type *az_msg_item;
1147 src_message_item_type *current;
1148 src_message_item_type **prior;
1151 ** create the message item and fill it in.
1154 l_msg_length = strlen( c_msg_text ) + 1; /* includes null */
1156 az_msg_item = (src_message_item_type *)
1157 _get_memory( sizeof( src_message_item_type ) + l_msg_length );
1159 az_msg_item->l_message_number = l_msg_number;
1160 az_msg_item->b_source_pos = l_src_pos;
1162 _move( (az_msg_item->c_text), c_msg_text, l_msg_length );
1165 ** Link the message from its source line
1166 ** Messages are in ascending column order for a line with
1167 ** messages without column info at the end
1168 ** Messages without source are appended to a list of orphans
1171 if (az_src_rec == diag_k_no_source)
1172 prior = &src_az_orphan_messages;
1174 prior = (src_message_item_type **)&(az_src_rec->az_message_list);
1180 prior = &(current->az_next_message),
1183 if (l_src_pos < (int)current->b_source_pos)
1187 az_msg_item->az_next_message = current;
1188 *prior = az_msg_item;
1195 ** FUNCTIONAL DESCRIPTION:
1197 ** This function adds machine code information to the source
1198 ** representation. This permits machine code to be placed in the listing.
1200 ** FORMAL PARAMETERS:
1202 ** az_src_rec source line machine code is associated with.
1203 ** l_offset offset in the record for this code element
1204 ** l_code_len length of the binary machine code buffer
1205 ** c_code buffer containing the machine code in binary form
1206 ** c_text_arg text of machine code; optional
1212 ** IMPLICIT OUTPUTS:
1222 ** Machine code stuffed away in the source structure
1228 src_append_machine_code ( src_source_record_type *az_src_rec,
1229 XmConst int l_offset,
1230 XmConst int l_code_len,
1231 XmConst char *c_code,
1232 XmConst char *c_text_arg )
1234 src_machine_code_type *az_code_item;
1236 XmConst char *c_text;
1238 if (c_text_arg == NULL) {
1241 c_text = c_text_arg;
1245 ** create the machine code item and fill it in.
1248 l_text_len = strlen( c_text ) + 1; /* includes null */
1250 az_code_item = (src_machine_code_type *) _get_memory(
1251 sizeof( src_machine_code_type ) + l_text_len + l_code_len );
1253 az_code_item -> w_offset = l_offset;
1254 az_code_item -> w_code_len = l_code_len;
1255 _move( (az_code_item->data.c_data), c_code, l_code_len );
1256 _move( &(az_code_item->data.c_data [l_code_len]), c_text, l_text_len );
1259 ** Link the machine code to its source line, at the head of
1260 ** the machine code list.
1263 az_code_item->az_next_machine_code = az_src_rec->az_machine_code_list;
1264 az_src_rec->az_machine_code_list = az_code_item;
1265 az_src_rec->w_machine_code_cnt++;