1 /* $NetBSD: emit.c,v 1.4 2004/06/20 22:20:16 jmc Exp $ */
4 * Copyright (c) 1994, 1995 Jochen Pohl
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Jochen Pohl for
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #if HAVE_NBTOOL_CONFIG_H
35 #include "nbtool_config.h"
38 #include <sys/cdefs.h>
39 #if defined(__RCSID) && !defined(lint)
40 __RCSID("$NetBSD: emit.c,v 1.4 2004/06/20 22:20:16 jmc Exp $");
49 /* name and handle of output file */
50 static const char *loname
;
53 /* output buffer data */
56 static void outxbuf(void);
63 outopen(const char *name
)
68 /* Open output file */
69 if ((lout
= fopen(name
, "w")) == NULL
)
70 err(1, "cannot open '%s'", name
);
72 /* Create output buffer */
74 ob
.o_end
= (ob
.o_buf
= ob
.o_nxt
= xmalloc(ob
.o_len
)) + ob
.o_len
;
78 * flush output buffer and close file
85 if (fclose(lout
) == EOF
)
86 err(1, "cannot close '%s'", loname
);
90 * resize output buffer
97 coffs
= ob
.o_nxt
- ob
.o_buf
;
99 ob
.o_end
= (ob
.o_buf
= xrealloc(ob
.o_buf
, ob
.o_len
)) + ob
.o_len
;
100 ob
.o_nxt
= ob
.o_buf
+ coffs
;
104 * reset output buffer
105 * if it is not empty, it is flushed
112 if (ob
.o_buf
!= ob
.o_nxt
) {
114 sz
= ob
.o_nxt
- ob
.o_buf
;
116 errx(1, "internal error: outclr() 1");
117 if (fwrite(ob
.o_buf
, sz
, 1, lout
) != 1)
118 err(1, "cannot write to %s", loname
);
124 * write a character to the output buffer
130 if (ob
.o_nxt
== ob
.o_end
)
132 *ob
.o_nxt
++ = (char)c
;
136 * write a character to the output buffer, qouted if necessary
142 if (isprint(c
) && c
!= '\\' && c
!= '"' && c
!= '\'') {
178 outchar((((u_int
)c
>> 6) & 07) + '0');
179 outchar((((u_int
)c
>> 3) & 07) + '0');
180 outchar((c
& 07) + '0');
187 * write a strint to the output buffer
188 * the string must not contain any characters which
192 outstrg(const char *s
)
196 if (ob
.o_nxt
== ob
.o_end
)
203 * write an integer value to toe output buffer
209 if ((size_t)(ob
.o_end
- ob
.o_nxt
) < 3 * sizeof (int))
211 ob
.o_nxt
+= sprintf(ob
.o_nxt
, "%d", i
);
215 * write the name of a symbol to the output buffer
216 * the name is preceded by its length
219 outname(const char *name
)
223 errx(1, "internal error: outname() 1");
224 outint((int)strlen(name
));
229 * write the name of the .c source
232 outsrc(const char *name
)