49d24f65fc2e75d76b2aeded3cfbb819825d8825
[binutils-gdb.git] / gas / listing.c
1 /* listing.c - mainting assembly listings
2 Copyright (C) 1991, 1992 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 /*
21 Contributed by Steve Chamberlain
22 sac@cygnus.com
23
24
25 A listing page looks like:
26
27 LISTING_HEADER sourcefilename pagenumber
28 TITLE LINE
29 SUBTITLE LINE
30 linenumber address data source
31 linenumber address data source
32 linenumber address data source
33 linenumber address data source
34
35 If not overridden, the listing commands are:
36
37 .title "stuff"
38 Put "stuff" onto the title line
39 .sbttl "stuff"
40 Put stuff onto the subtitle line
41
42 If these commands come within 10 lines of the top of the page, they
43 will affect the page they are on, as well as any subsequent page
44
45 .eject
46 Thow a page
47 .list
48 Increment the enable listing counter
49 .nolist
50 Decrement the enable listing counter
51
52 .psize Y[,X]
53 Set the paper size to X wide and Y high. Setting a psize Y of
54 zero will suppress form feeds except where demanded by .eject
55
56 If the counter goes below zero, listing is suppressed.
57
58
59 Listings are a maintained by read calling various listing_<foo>
60 functions. What happens most is that the macro NO_LISTING is not
61 defined (from the Makefile), then the macro LISTING_NEWLINE expands
62 into a call to listing_newline. The call is done from read.c, every
63 time it sees a newline, and -l is on the command line.
64
65 The function listing_newline remembers the frag associated with the
66 newline, and creates a new frag - note that this is wasteful, but not
67 a big deal, since listing slows things down a lot anyway. The
68 function also rememebers when the filename changes.
69
70 When all the input has finished, and gas has had a chance to settle
71 down, the listing is output. This is done by running down the list of
72 frag/source file records, and opening the files as needed and printing
73 out the bytes and chars associated with them.
74
75 The only things which the architecture can change about the listing
76 are defined in these macros:
77
78 LISTING_HEADER The name of the architecture
79 LISTING_WORD_SIZE The make of the number of bytes in a word, this determines
80 the clumping of the output data. eg a value of
81 2 makes words look like 1234 5678, whilst 1
82 would make the same value look like 12 34 56
83 78
84 LISTING_LHS_WIDTH Number of words of above size for the lhs
85
86 LISTING_LHS_WIDTH_SECOND Number of words for the data on the lhs
87 for the second line
88
89 LISTING_LHS_CONT_LINES Max number of lines to use up for a continutation
90 LISTING_RHS_WIDTH Number of chars from the input file to print
91 on a line
92 */
93
94 #include "as.h"
95
96 #include <obstack.h>
97 #include "input-file.h"
98 #include "targ-cpu.h"
99
100 char *malloc();
101
102 #ifndef NO_LISTING
103 #ifndef LISTING_HEADER
104 #define LISTING_HEADER "GAS LISTING"
105 #endif
106 #ifndef LISTING_WORD_SIZE
107 #define LISTING_WORD_SIZE 4
108 #endif
109 #ifndef LISTING_LHS_WIDTH
110 #define LISTING_LHS_WIDTH 1
111 #endif
112 #ifndef LISTING_LHS_WIDTH_SECOND
113 #define LISTING_LHS_WIDTH_SECOND 1
114 #endif
115 #ifndef LISTING_RHS_WIDTH
116 #define LISTING_RHS_WIDTH 100
117 #endif
118 #ifndef LISTING_LHS_CONT_LINES
119 #define LISTING_LHS_CONT_LINES 4
120 #endif
121
122
123
124
125 /* This structure remembers which .s were used */
126 typedef struct file_info_struct
127 {
128 char *filename;
129 int linenum;
130 FILE *file;
131 struct file_info_struct *next;
132 int end_pending;
133
134 } file_info_type ;
135
136
137 /* this structure rememebrs which line from which file goes into which
138 frag */
139 typedef struct list_info_struct
140 {
141 /* Frag which this line of source is nearest to */
142 fragS *frag;
143 /* The actual line in the source file */
144 unsigned int line;
145 /* Pointer to the file info struct for the file which this line
146 belongs to */
147 file_info_type *file;
148
149 /* Next in list */
150 struct list_info_struct *next;
151
152
153 /* Pointer to the file info struct for the high level language
154 source line that belongs here */
155 file_info_type *hll_file;
156
157 /* High level language source line */
158 int hll_line;
159
160
161 /* Pointer to any error message associated with this line */
162 char *message;
163
164 enum
165 {
166 EDICT_NONE,
167 EDICT_SBTTL,
168 EDICT_TITLE,
169 EDICT_NOLIST,
170 EDICT_LIST,
171 EDICT_EJECT
172 } edict;
173 char *edict_arg;
174
175 } list_info_type;
176
177
178 static struct list_info_struct *head;
179 struct list_info_struct *listing_tail;
180 extern int listing;
181 extern unsigned int physical_input_line;
182 extern fragS *frag_now;
183
184
185 static int paper_width = 200;
186 static int paper_height = 60;
187
188
189 /* this static array is used to keep the text of data to be printed
190 before the start of the line.
191 It is stored so we can give a bit more info on the next line. To much, and large
192 initialized arrays will use up lots of paper.
193 */
194
195 static char data_buffer[100];
196 static unsigned int data_buffer_size;
197
198
199 static void
200 DEFUN(listing_message,(name, message),
201 char *name AND
202 char *message)
203 {
204 unsigned int l = strlen(name) + strlen(message)+1;
205 char *n = (char*)malloc(l);
206 strcpy(n,name);
207 strcat(n,message);
208 if(listing_tail != (list_info_type *)NULL)
209 {
210 listing_tail->message = n;
211 }
212
213 }
214
215
216
217
218 void
219 DEFUN(listing_warning,(message),
220 char *message)
221 {
222 listing_message("Warning:", message);
223 }
224
225 void
226 DEFUN(listing_error,(message),
227 char *message)
228 {
229 listing_message("Error:", message);
230 }
231
232
233
234
235 static file_info_type *file_info_head;
236
237 static file_info_type *
238 DEFUN(file_info, (file_name),
239 char *file_name)
240 {
241 /* Find an entry with this file name */
242 file_info_type *p = file_info_head;
243
244 while (p != (file_info_type *)NULL)
245 {
246 if (strcmp(p->filename, file_name) == 0)
247 return p;
248 p = p->next;
249 }
250
251 /* Make new entry */
252
253 p = (file_info_type *)xmalloc(sizeof(file_info_type));
254 p->next = file_info_head;
255 file_info_head = p;
256 p->filename = xmalloc(strlen(file_name)+1);
257 strcpy(p->filename, file_name);
258 p->linenum = 0;
259 p->end_pending = 0;
260
261 p->file = fopen(p->filename,"rb");
262 if (p->file) fgetc(p->file);
263
264
265
266 return p;
267
268 }
269
270
271 static void
272 DEFUN_VOID(new_frag)
273 {
274
275 frag_wane(frag_now);
276 frag_new(0);
277
278 }
279
280 void
281 DEFUN(listing_newline,(ps),
282 char *ps)
283 {
284 char *s = ps;
285 extern char *file_name;
286 static unsigned int last_line =0xffff ;
287
288
289 list_info_type *new;
290 if (physical_input_line != last_line)
291 {
292 last_line = physical_input_line;
293 new_frag();
294
295 new = (list_info_type *)malloc(sizeof(list_info_type));
296 new->frag = frag_now;
297 new->line = physical_input_line ;
298 new->file = file_info(file_name);
299
300 if (listing_tail)
301 {
302 listing_tail->next = new;
303 }
304 else
305 {
306 head = new;
307 }
308 listing_tail = new;
309 new->next = (list_info_type *)NULL;
310 new->message = (char *)NULL;
311 new->edict = EDICT_NONE;
312 new->hll_file = (file_info_type*)NULL;
313 new->hll_line = 0;
314 new_frag();
315 }
316 }
317
318
319 /*
320 This function returns the next source line from the file supplied,
321 truncated to size. It appends a fake line to the end of each input
322 file to make
323 */
324
325 static char *
326 DEFUN(buffer_line,(file, line, size),
327 file_info_type *file AND
328 char *line AND
329 unsigned int size)
330 {
331 unsigned int count = 0;
332 int c;
333
334 char *p = line;
335
336 /* If we couldn't open the file, return an empty line */
337 if (file->file == (FILE*)NULL)
338 {
339 return "";
340 }
341
342 if (file->end_pending == 10) {
343 *p ++ = '\n';
344 fseek(file->file, 0,0 );
345 file->linenum = 0;
346 file->end_pending = 0;
347 }
348 c = fgetc(file->file);
349
350
351 size -= 1; /* leave room for null */
352
353 while (c != EOF && c != '\n')
354 {
355 if (count < size)
356 *p++ = c;
357 count++;
358
359 c= fgetc(file->file);
360
361 }
362 if (c == EOF)
363 {
364 file->end_pending ++;
365 *p++ = '.';
366 *p++ = '.';
367 *p++ = '.';
368 }
369 file->linenum++;
370 *p++ = 0;
371 return line;
372 }
373
374
375 static char *fn;
376
377 static unsigned int eject; /* Eject pending */
378 static unsigned int page; /* Current page number */
379 static char *title; /* current title */
380 static char *subtitle; /* current subtitle */
381 static unsigned int on_page; /* number of lines printed on current page */
382
383
384 static void
385 DEFUN(listing_page,(list),
386 list_info_type *list)
387 {
388 /* Grope around, see if we can see a title or subtitle edict coming up
389 soon (we look down 10 lines of the page and see if it's there)*/
390 if ((eject || (on_page >= paper_height)) && paper_height != 0)
391 {
392 unsigned int c = 10;
393 int had_title = 0;
394 int had_subtitle = 0;
395
396 page++;
397
398 while (c != 0 && list)
399 {
400 if (list->edict == EDICT_SBTTL && !had_subtitle)
401 {
402 had_subtitle = 1;
403 subtitle = list->edict_arg;
404 }
405 if (list->edict == EDICT_TITLE && !had_title)
406 {
407 had_title = 1;
408 title = list->edict_arg;
409 }
410 list = list->next;
411 c--;
412 }
413
414
415 if (page > 1)
416 {
417 printf("\f");
418 }
419
420 printf("%s %s \t\t\tpage %d\n", LISTING_HEADER, fn, page);
421 printf("%s\n", title);
422 printf("%s\n", subtitle);
423 on_page = 3;
424 eject = 0;
425 }
426 }
427
428
429 static unsigned int
430 DEFUN(calc_hex,(list),
431 list_info_type *list)
432 {
433 list_info_type *first = list;
434 list_info_type *last = first;
435 unsigned int address = ~0;
436
437 fragS *frag;
438 fragS *frag_ptr;
439
440 unsigned int byte_in_frag = 0;
441
442 int anything = 0;
443
444 /* Find first frag which says it belongs to this line */
445 frag = list->frag;
446 while (frag && frag->line != list)
447 frag = frag->fr_next;
448
449 frag_ptr = frag;
450
451 data_buffer_size = 0;
452
453 /* Dump all the frags which belong to this line */
454 while (frag_ptr != (fragS *)NULL && frag_ptr->line == first)
455 {
456 /* Print as many bytes from the fixed part as is sensible */
457 while(byte_in_frag < frag_ptr->fr_fix && data_buffer_size < sizeof(data_buffer)-10)
458 {
459 if (address == ~0)
460 {
461 address = frag_ptr->fr_address;
462 }
463
464 sprintf(data_buffer + data_buffer_size,
465 "%02X",
466 (frag_ptr->fr_literal[byte_in_frag]) & 0xff);
467 data_buffer_size += 2;
468 byte_in_frag++;
469 }
470 {
471 unsigned int var_rep_max = byte_in_frag;
472 unsigned int var_rep_idx = byte_in_frag;
473
474 /* Print as many bytes from the variable part as is sensible */
475 while (byte_in_frag < frag_ptr->fr_var * frag_ptr->fr_offset
476 && data_buffer_size < sizeof(data_buffer)-10)
477 {
478 if (address == ~0)
479 {
480 address = frag_ptr->fr_address;
481 }
482 sprintf(data_buffer + data_buffer_size,
483 "%02X",
484 (frag_ptr->fr_literal[var_rep_idx]) & 0xff);
485 #if 0
486 data_buffer[data_buffer_size++] = '*';
487 data_buffer[data_buffer_size++] = '*';
488 #endif
489 data_buffer_size +=2;
490
491 var_rep_idx ++;
492 byte_in_frag++;
493
494 if (var_rep_idx >= frag_ptr->fr_var)
495 var_rep_idx = var_rep_max;
496 }
497 }
498
499 frag_ptr = frag_ptr->fr_next;
500 }
501 data_buffer[data_buffer_size++] = 0;
502 return address;
503 }
504
505
506
507
508
509
510 static void
511 DEFUN(print_lines,(list, string, address),
512 list_info_type *list AND
513 char *string AND
514 unsigned int address)
515 {
516 unsigned int idx;
517 unsigned int nchars;
518 unsigned int lines;
519 unsigned int byte_in_word =0;
520 char *src = data_buffer;
521
522 /* Print the stuff on the first line */
523 listing_page(list);
524 nchars = (LISTING_WORD_SIZE*2 +1) * LISTING_LHS_WIDTH ;
525 /* Print the hex for the first line */
526 if (address == ~0)
527 {
528 printf("% 4d ", list->line);
529 for (idx = 0; idx < nchars; idx++)
530 printf(" ");
531
532 printf("\t%s\n", string ? string : "");
533 on_page++;
534 listing_page(0);
535
536 }
537 else
538 {
539 if (had_errors())
540 {
541 printf("% 4d ???? ", list->line);
542 }
543 else
544 {
545 printf("% 4d %04x ", list->line, address);
546 }
547
548 /* And the data to go along with it */
549 idx = 0;
550
551 while (*src && idx < nchars)
552 {
553 printf("%c%c", src[0], src[1]);
554 src += 2;
555 byte_in_word++;
556 if (byte_in_word == LISTING_WORD_SIZE)
557 {
558 printf(" ");
559 idx++;
560 byte_in_word = 0;
561 }
562 idx+=2;
563 }
564
565 for (;idx < nchars; idx++)
566 printf(" ");
567
568 printf("\t%s\n", string ? string : "");
569 on_page++;
570 listing_page(list);
571 if (list->message)
572 {
573 printf("**** %s\n",list->message);
574 listing_page(list);
575 on_page++;
576 }
577
578 for (lines = 0;
579 lines < LISTING_LHS_CONT_LINES
580 && *src;
581 lines++) {
582 nchars = ((LISTING_WORD_SIZE*2) +1) * LISTING_LHS_WIDTH_SECOND -1;
583 idx = 0;
584 /* Print any more lines of data, but more compactly */
585 printf("% 4d ", list->line);
586
587 while (*src && idx < nchars)
588 {
589 printf("%c%c", src[0], src[1]);
590 src+=2;
591 idx+=2;
592 byte_in_word++;
593 if (byte_in_word == LISTING_WORD_SIZE)
594 {
595 printf(" ");
596 idx++;
597 byte_in_word = 0;
598 }
599 }
600
601 printf("\n");
602 on_page++;
603 listing_page(list);
604
605 }
606
607
608 }
609 }
610
611
612
613
614
615
616 static void
617 DEFUN_VOID(list_symbol_table)
618 {
619 extern symbolS *symbol_rootP;
620
621 symbolS *ptr ;
622 eject = 1;
623 listing_page(0);
624 printf("DEFINED SYMBOLS\n");
625 on_page++;
626
627 for (ptr = symbol_rootP; ptr != (symbolS*)NULL; ptr = symbol_next(ptr))
628 {
629 if (ptr->sy_frag->line)
630 {
631 if (S_GET_NAME(ptr))
632 {
633
634 if (strlen(S_GET_NAME(ptr)))
635 {
636 printf("%20s:%-5d %2d:%08x %s \n",
637 ptr->sy_frag->line->file->filename,
638 ptr->sy_frag->line->line,
639 S_GET_SEGMENT(ptr),
640 S_GET_VALUE(ptr),
641 S_GET_NAME(ptr));
642 }
643
644 else
645 {
646 printf("%20s:%-5d %2d:%08x\n",
647 ptr->sy_frag->line->file->filename,
648 ptr->sy_frag->line->line,
649 S_GET_SEGMENT(ptr),
650 S_GET_VALUE(ptr));
651
652
653 }
654
655 on_page++;
656 listing_page(0);
657 }
658 }
659
660 }
661 printf("\n");
662 on_page++;
663 listing_page(0);
664 printf("UNDEFINED SYMBOLS\n");
665 on_page++;
666 listing_page(0);
667
668 for (ptr = symbol_rootP; ptr != (symbolS*)NULL; ptr = symbol_next(ptr))
669 {
670 if (S_GET_NAME(ptr) && strlen(S_GET_NAME(ptr)) != 0)
671 {
672 if (ptr->sy_frag->line == 0)
673 {
674 printf("%s\n", S_GET_NAME(ptr));
675 on_page++;
676 listing_page(0);
677 }
678 }
679 }
680 }
681
682 void
683 DEFUN(print_source,(current_file, list, buffer, width),
684 file_info_type *current_file AND
685 list_info_type *list AND
686 char *buffer AND
687 unsigned int width)
688 {
689 if (current_file->file) {
690 while (current_file->linenum < list->hll_line)
691 {
692 char * p = buffer_line(current_file, buffer, width);
693 printf("%4d:%-13s **** %s\n", current_file->linenum, current_file->filename, p);
694 on_page++;
695 listing_page(list);
696 }
697 }
698 }
699
700 /* Sometimes the user doesn't want to be bothered by the debugging
701 records inserted by the compiler, see if the line is suspicioous */
702
703 static int
704 DEFUN(debugging_pseudo,(line),
705 char *line)
706 {
707 while (isspace(*line))
708 line++;
709
710 if(*line != '.') return 0;
711
712 line++;
713
714 if (strncmp(line, "def",3) == 0) return 1;
715 if (strncmp(line, "val",3) == 0) return 1;
716 if (strncmp(line, "scl",3) == 0) return 1;
717 if (strncmp(line, "line",4) == 0) return 1;
718 if (strncmp(line, "endef",5) == 0) return 1;
719 if (strncmp(line, "ln",2) ==0) return 1;
720 if (strncmp(line, "type",4) ==0) return 1;
721 if (strncmp(line, "size",4) == 0) return 1;
722 if (strncmp(line, "dim",3) ==0) return 1;
723 if (strncmp(line, "tag",3) == 0) return 1;
724
725 return 0;
726
727 }
728
729 void
730 DEFUN(listing_listing,(name),
731 char *name)
732 {
733 list_info_type *list = head;
734 file_info_type *current_hll_file = (file_info_type *)NULL;
735
736 unsigned int page= 1;
737 unsigned int prev = 0;
738 char *message;
739 char *buffer;
740 char *p;
741 unsigned int addr = 0;
742 int on_page = 0;
743 int show_listing = 1;
744 unsigned int width;
745
746 buffer = malloc(LISTING_RHS_WIDTH);
747 eject = 1;
748 list = head;
749
750 while (list != (list_info_type *)NULL && 0)
751 {
752 if (list->next)
753 list->frag = list->next->frag;
754 list = list->next;
755
756 }
757
758 list = head->next;
759
760
761 while ( list)
762 {
763 width = LISTING_RHS_WIDTH > paper_width ? paper_width :
764 LISTING_RHS_WIDTH;
765
766 switch (list->edict) {
767 case EDICT_LIST:
768 show_listing++;
769 break;
770 case EDICT_NOLIST:
771 show_listing--;
772 break;
773 case EDICT_EJECT:
774 break;
775 case EDICT_NONE:
776 break;
777 case EDICT_TITLE:
778 title = list->edict_arg;
779 break;
780 case EDICT_SBTTL:
781 subtitle = list->edict_arg;
782 break;
783 default:
784 abort();
785 }
786
787 if (show_listing > 0)
788 {
789 /* Scan down the list and print all the stuff which can be done
790 with this line (or lines) */
791 message = 0;
792
793 if (list->hll_file)
794 {
795 current_hll_file = list->hll_file;
796 }
797
798 if (current_hll_file && list->hll_line && listing & LISTING_HLL)
799 {
800 print_source(current_hll_file, list, buffer, width);
801 }
802
803 p = buffer_line(list->file, buffer, width);
804
805 if (! ((listing & LISTING_NODEBUG) && debugging_pseudo(p)))
806 {
807 print_lines(list, p, calc_hex(list));
808 }
809
810 if (list->edict == EDICT_EJECT)
811 {
812 eject = 1;
813 }
814 }
815 else
816 {
817
818 p = buffer_line(list->file, buffer, width);
819 }
820
821 list = list->next;
822 }
823 free(buffer);
824 }
825
826 void
827 DEFUN(listing_print,(name),
828 char *name)
829 {
830 title = "";
831 subtitle = "";
832
833 if (listing & LISTING_NOFORM)
834 {
835 paper_height = 0;
836 }
837
838 if (listing & LISTING_LISTING)
839 {
840 listing_listing(name);
841
842 }
843 if (listing & LISTING_SYMBOLS)
844 {
845 list_symbol_table();
846 }
847 }
848
849
850 void
851 DEFUN(listing_file,(name),
852 char *name)
853 {
854 fn = name;
855 }
856
857 void
858 DEFUN_VOID(listing_eject)
859 {
860 listing_tail->edict = EDICT_EJECT;
861 }
862
863 void
864 DEFUN_VOID(listing_flags)
865 {
866
867 }
868 void
869 DEFUN(listing_list,(on),
870 unsigned int on)
871 {
872 listing_tail->edict = on ? EDICT_LIST : EDICT_NOLIST;
873 }
874
875
876 void
877 DEFUN_VOID(listing_psize)
878 {
879 paper_height = get_absolute_expression();
880
881 if (paper_height < 0 || paper_height > 1000)
882 {
883 paper_height = 0;
884 as_warn("strange paper height, set to no form");
885 }
886 if (*input_line_pointer == ',')
887 {
888 input_line_pointer++;
889 paper_width = get_absolute_expression();
890 }
891 }
892
893
894 void
895 DEFUN(listing_title,(depth),
896 unsigned int depth)
897 {
898 char *start;
899 char *title;
900 unsigned int length;
901
902 SKIP_WHITESPACE();
903 if (*input_line_pointer=='\"') {
904 input_line_pointer++;
905 start = input_line_pointer;
906
907 while (*input_line_pointer)
908 {
909 if (*input_line_pointer == '\"')
910 {
911 length = input_line_pointer - start;
912 title = malloc(length + 1);
913 memcpy(title, start, length);
914 title[length] = 0;
915 listing_tail->edict = depth ? EDICT_SBTTL : EDICT_TITLE;
916 listing_tail->edict_arg = title;
917 input_line_pointer++;
918 demand_empty_rest_of_line();
919 return;
920 }
921 else if (*input_line_pointer == '\n')
922 {
923 as_bad("New line in title");
924 demand_empty_rest_of_line();
925 return;
926 }
927 else
928 {
929 input_line_pointer++;
930 }
931 }
932 }
933 else
934 {
935 as_bad("expecting title in quotes");
936 }
937 }
938
939
940
941 void
942 DEFUN(listing_source_line,(line),
943 unsigned int line)
944 {
945 new_frag();
946 listing_tail->hll_line = line;
947 new_frag();
948
949 }
950
951 void
952 DEFUN(listing_source_file,(file),
953 char *file)
954 {
955 listing_tail->hll_file = file_info(file);
956 }
957
958
959
960 #else
961
962
963 /* Dummy functions for when compiled without listing enabled */
964
965 void
966 DEFUN_VOID(listing_flags)
967 {
968 s_ignore();
969 }
970
971 void DEFUN_VOID(listing_list)
972 {
973 s_ignore();
974 }
975
976 void DEFUN_VOID(listing_eject)
977 {
978 s_ignore();
979 }
980 void DEFUN(listing_psize)
981 {
982 s_ignore();
983 }
984
985 void DEFUN(listing_title, (depth),
986 unsigned int depth)
987 {
988 s_ignore();
989 }
990 void
991 DEFUN(listing_file,(name),
992 char *name)
993 {
994
995 }
996
997 void DEFUN(listing_newline,(name),
998 char *name)
999 {
1000
1001 }
1002
1003 void DEFUN(listing_source_line,(n),
1004 unsigned int n)
1005 {
1006
1007 }
1008 void DEFUN(listing_source_file, (n),
1009 char *n)
1010 {
1011
1012 }
1013
1014
1015
1016 #endif
1017