1 /* listing.c listing file generator for the Netwide Assembler
3 * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
4 * Julian Hall. All rights reserved. The software is
5 * redistributable under the licence given in the file "Licence"
6 * distributed in the NASM archive.
8 * initial version 2/vii/97 by Simon Tatham
24 #define LIST_MAX_LEN 216 /* something sensible */
25 #define LIST_INDENT 40
26 #define LIST_HEXBIT 18
28 typedef struct MacroInhibit MacroInhibit
;
30 static struct MacroInhibit
{
36 static char xdigit
[] = "0123456789ABCDEF";
38 #define HEX(a,b) (*(a)=xdigit[((b)>>4)&15],(a)[1]=xdigit[(b)&15]);
40 static char listline
[LIST_MAX_LEN
];
43 static char listdata
[2 * LIST_INDENT
]; /* we need less than that actually */
44 static int32_t listoffset
;
46 static int32_t listlineno
;
50 static int suppress
; /* for INCBIN & TIMES special cases */
52 static int listlevel
, listlevel_e
;
56 static void list_emit(void)
58 if (!listlinep
&& !listdata
[0])
61 fprintf(listfp
, "%6"PRId32
" ", ++listlineno
);
64 fprintf(listfp
, "%08"PRIX32
" %-*s", listoffset
, LIST_HEXBIT
+ 1,
67 fprintf(listfp
, "%*s", LIST_HEXBIT
+ 10, "");
70 fprintf(listfp
, "%s<%d>", (listlevel
< 10 ? " " : ""),
76 fprintf(listfp
, " %s", listline
);
83 static void list_init(char *fname
, efunc error
)
85 listfp
= fopen(fname
, "w");
87 error(ERR_NONFATAL
, "unable to open listing file `%s'", fname
);
96 mistack
= nasm_malloc(sizeof(MacroInhibit
));
99 mistack
->inhibiting
= true;
102 static void list_cleanup(void)
108 MacroInhibit
*temp
= mistack
;
109 mistack
= temp
->next
;
117 static void list_out(int32_t offset
, char *str
)
119 if (strlen(listdata
) + strlen(str
) > LIST_HEXBIT
) {
120 strcat(listdata
, "-");
125 strcat(listdata
, str
);
128 static void list_output(int32_t offset
, const void *data
,
129 enum out_type type
, uint64_t size
)
131 if (!listp
|| suppress
|| user_nolist
) /* fbk - 9/2/00 */
137 uint8_t const *p
= data
;
139 if (size
== 0 && !listdata
[0])
144 list_out(offset
++, q
);
151 uint64_t d
= *(int64_t *)data
;
153 uint8_t p
[8], *r
= p
;
164 } else if (size
== 8) {
191 uint32_t d
= *(int32_t *)data
;
193 uint8_t p
[4], *r
= p
;
205 uint32_t d
= *(int32_t *)data
;
207 uint8_t p
[4], *r
= p
;
221 uint64_t d
= *(int64_t *)data
;
223 uint8_t p
[4], *r
= p
;
242 snprintf(q
, sizeof(q
), "<res %08"PRIX64
">", size
);
249 static void list_line(int type
, char *line
)
253 if (user_nolist
) { /* fbk - 9/2/00 */
258 if (mistack
&& mistack
->inhibiting
) {
259 if (type
== LIST_MACRO
)
261 else { /* pop the m i stack */
262 MacroInhibit
*temp
= mistack
;
263 mistack
= temp
->next
;
269 strncpy(listline
, line
, LIST_MAX_LEN
- 1);
270 listline
[LIST_MAX_LEN
- 1] = '\0';
271 listlevel_e
= listlevel
;
274 static void list_uplevel(int type
)
278 if (type
== LIST_INCBIN
|| type
== LIST_TIMES
) {
279 suppress
|= (type
== LIST_INCBIN
? 1 : 2);
280 list_out(listoffset
, type
== LIST_INCBIN
? "<incbin>" : "<rept>");
286 if (mistack
&& mistack
->inhibiting
&& type
== LIST_INCLUDE
) {
287 MacroInhibit
*temp
= nasm_malloc(sizeof(MacroInhibit
));
288 temp
->next
= mistack
;
289 temp
->level
= listlevel
;
290 temp
->inhibiting
= false;
292 } else if (type
== LIST_MACRO_NOLIST
) {
293 MacroInhibit
*temp
= nasm_malloc(sizeof(MacroInhibit
));
294 temp
->next
= mistack
;
295 temp
->level
= listlevel
;
296 temp
->inhibiting
= true;
301 static void list_downlevel(int type
)
306 if (type
== LIST_INCBIN
|| type
== LIST_TIMES
) {
307 suppress
&= ~(type
== LIST_INCBIN
? 1 : 2);
312 while (mistack
&& mistack
->level
> listlevel
) {
313 MacroInhibit
*temp
= mistack
;
314 mistack
= temp
->next
;