summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2009-07-05 14:45:12 -0700
committerH. Peter Anvin <hpa@zytor.com>2009-07-05 14:45:12 -0700
commit0cba10757976294d034ae5d8cd38784555a7ac8b (patch)
tree9c5f816527d88c2195a83ebad6f5e7b392272559
parentfe1ca5a09fb3e82535a40aad3c5caa84d72d7d3a (diff)
downloadnasm-0cba10757976294d034ae5d8cd38784555a7ac8b.tar.gz
Make it possible for outputs to be either text or binary
Allow the backend to specify that an output format is either text or binary. For future uses, define this as a flag word so we can define other flags in the future if it would make sense. Currently, the ieee and dbg formats are text; all the others are binary. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--nasm.c2
-rw-r--r--nasm.h8
-rw-r--r--output/outaout.c4
-rw-r--r--output/outas86.c2
-rw-r--r--output/outbin.c13
-rw-r--r--output/outcoff.c6
-rw-r--r--output/outdbg.c2
-rw-r--r--output/outelf32.c4
-rw-r--r--output/outelf64.c2
-rw-r--r--output/outieee.c78
-rw-r--r--output/outmacho.c2
-rw-r--r--output/outobj.c2
-rw-r--r--output/outrdf.c2
-rw-r--r--output/outrdf2.c2
14 files changed, 66 insertions, 63 deletions
diff --git a/nasm.c b/nasm.c
index 47595772..f3646472 100644
--- a/nasm.c
+++ b/nasm.c
@@ -456,7 +456,7 @@ int main(int argc, char **argv)
*/
ofmt->filename(inname, outname, report_error);
- ofile = fopen(outname, "wb");
+ ofile = fopen(outname, (ofmt->flags & OFMT_TEXT) ? "w" : "wb");
if (!ofile) {
report_error(ERR_FATAL | ERR_NOFILE,
"unable to open output file `%s'", outname);
diff --git a/nasm.h b/nasm.h
index 775d0f99..459b64ef 100644
--- a/nasm.h
+++ b/nasm.h
@@ -774,13 +774,11 @@ struct ofmt {
*/
const char *shortname;
-
/*
- * this is reserved for out module specific help.
- * It is set to NULL in all the out modules and is not implemented
- * in the main program
+ * Output format flags.
*/
- const char *helpstring;
+#define OFMT_TEXT 1 /* Text file format */
+ unsigned int flags;
/*
* this is a pointer to the first element of the debug information
diff --git a/output/outaout.c b/output/outaout.c
index a057fc6c..4d38cdfc 100644
--- a/output/outaout.c
+++ b/output/outaout.c
@@ -946,7 +946,7 @@ static int aout_set_info(enum geninfo type, char **val)
struct ofmt of_aout = {
"Linux a.out object files",
"aout",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
aout_stdmac,
@@ -968,7 +968,7 @@ struct ofmt of_aout = {
struct ofmt of_aoutb = {
"NetBSD/FreeBSD a.out object files",
"aoutb",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
aout_stdmac,
diff --git a/output/outas86.c b/output/outas86.c
index 863a2278..2fa4efca 100644
--- a/output/outas86.c
+++ b/output/outas86.c
@@ -659,7 +659,7 @@ void as86_linenumber(char *name, int32_t segment, int32_t offset, int is_main,
struct ofmt of_as86 = {
"Linux as86 (bin86 version 0.3) object files",
"as86",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
as86_stdmac,
diff --git a/output/outbin.c b/output/outbin.c
index fdfbe8eb..b3ebc2a8 100644
--- a/output/outbin.c
+++ b/output/outbin.c
@@ -594,8 +594,13 @@ static void bin_cleanup(int debuginfo)
/* Step 6: Write the section data to the output file. */
/* Write the progbits sections to the output file. */
- for (pend = origin, s = sections; s && (s->flags & TYPE_PROGBITS); s = s->next) { /* Skip zero-length sections. */
- if (s->length == 0)
+ pend = origin;
+ for (s = sections; s; s = s->next) {
+ /* Skip non-progbits sections */
+ if (!(s->flags & TYPE_PROGBITS))
+ continue;
+ /* Skip zero-length sections */
+ if (s->length == 0)
continue;
/* Pad the space between sections. */
for (h = s->start - pend; h; h--)
@@ -1401,7 +1406,7 @@ static int bin_set_info(enum geninfo type, char **val)
return 0;
}
-static void bin_init(FILE * afp, efunc errfunc, ldfunc ldef, evalfunc eval)
+static void bin_init(FILE *afp, efunc errfunc, ldfunc ldef, evalfunc eval)
{
fp = afp;
error = errfunc;
@@ -1436,7 +1441,7 @@ static void bin_init(FILE * afp, efunc errfunc, ldfunc ldef, evalfunc eval)
struct ofmt of_bin = {
"flat-form binary files (e.g. DOS .COM, .SYS)",
"bin",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
bin_stdmac,
diff --git a/output/outcoff.c b/output/outcoff.c
index ee0780d8..5a03bec5 100644
--- a/output/outcoff.c
+++ b/output/outcoff.c
@@ -1009,7 +1009,7 @@ static int coff_set_info(enum geninfo type, char **val)
struct ofmt of_coff = {
"COFF (i386) object files (e.g. DJGPP for DOS)",
"coff",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
coff_stdmac,
@@ -1031,7 +1031,7 @@ struct ofmt of_coff = {
struct ofmt of_win32 = {
"Microsoft Win32 (i386) object files",
"win32",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
coff_stdmac,
@@ -1053,7 +1053,7 @@ struct ofmt of_win32 = {
struct ofmt of_win64 = {
"Microsoft Win64 (x86-64) object files",
"win64",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
coff_stdmac,
diff --git a/output/outdbg.c b/output/outdbg.c
index 2c6921e1..84d558ea 100644
--- a/output/outdbg.c
+++ b/output/outdbg.c
@@ -258,7 +258,7 @@ static struct dfmt *debug_debug_arr[3] = {
struct ofmt of_dbg = {
"Trace of all info passed to output stage",
"dbg",
- NULL,
+ OFMT_TEXT,
debug_debug_arr,
&debug_debug_form,
NULL,
diff --git a/output/outelf32.c b/output/outelf32.c
index 28ec0a37..7159a1f1 100644
--- a/output/outelf32.c
+++ b/output/outelf32.c
@@ -1473,7 +1473,7 @@ struct dfmt *elf32_debugs_arr[3] = { &df_dwarf, &df_stabs, NULL };
struct ofmt of_elf32 = {
"ELF32 (i386) object files (e.g. Linux)",
"elf32",
- NULL,
+ 0,
elf32_debugs_arr,
&df_stabs,
elf_stdmac,
@@ -1491,7 +1491,7 @@ struct ofmt of_elf32 = {
struct ofmt of_elf = {
"ELF (short name for ELF32) ",
"elf",
- NULL,
+ 0,
elf32_debugs_arr,
&df_stabs,
elf_stdmac,
diff --git a/output/outelf64.c b/output/outelf64.c
index f31c196e..d0498947 100644
--- a/output/outelf64.c
+++ b/output/outelf64.c
@@ -1564,7 +1564,7 @@ struct dfmt *elf64_debugs_arr[3] = { &df_dwarf, &df_stabs, NULL };
struct ofmt of_elf64 = {
"ELF64 (x86_64) object files (e.g. Linux)",
"elf64",
- NULL,
+ 0,
elf64_debugs_arr,
&df_stabs,
elf_stdmac,
diff --git a/output/outieee.c b/output/outieee.c
index 56dc71e7..d587d4ce 100644
--- a/output/outieee.c
+++ b/output/outieee.c
@@ -896,24 +896,24 @@ static void ieee_write_file(int debuginfo)
/*
* Write the module header
*/
- ieee_putascii("MBFNASM,%02X%s.\r\n", strlen(ieee_infile), ieee_infile);
+ ieee_putascii("MBFNASM,%02X%s.\n", strlen(ieee_infile), ieee_infile);
/*
* Write the NASM boast comment.
*/
- ieee_putascii("CO0,%02X%s.\r\n", strlen(nasm_comment), nasm_comment);
+ ieee_putascii("CO0,%02X%s.\n", strlen(nasm_comment), nasm_comment);
/*
* write processor-specific information
*/
- ieee_putascii("AD8,4,L.\r\n");
+ ieee_putascii("AD8,4,L.\n");
/*
* date and time
*/
time(&reltime);
thetime = localtime(&reltime);
- ieee_putascii("DT%04d%02d%02d%02d%02d%02d.\r\n",
+ ieee_putascii("DT%04d%02d%02d%02d%02d%02d.\n",
1900 + thetime->tm_year, thetime->tm_mon + 1,
thetime->tm_mday, thetime->tm_hour, thetime->tm_min,
thetime->tm_sec);
@@ -921,10 +921,10 @@ static void ieee_write_file(int debuginfo)
* if debugging, dump file names
*/
for (fn = fnhead; fn && debuginfo; fn = fn->next) {
- ieee_putascii("C0105,%02X%s.\r\n", strlen(fn->name), fn->name);
+ ieee_putascii("C0105,%02X%s.\n", strlen(fn->name), fn->name);
}
- ieee_putascii("CO101,07ENDHEAD.\r\n");
+ ieee_putascii("CO101,07ENDHEAD.\n");
/*
* the standard doesn't specify when to put checksums,
* we'll just do it periodically.
@@ -954,15 +954,15 @@ static void ieee_write_file(int debuginfo)
}
ieee_unqualified_name(buf, seg->name);
if (seg->align >= SEG_ABS) {
- ieee_putascii("ST%X,A,%02X%s.\r\n", seg->ieee_index,
+ ieee_putascii("ST%X,A,%02X%s.\n", seg->ieee_index,
strlen(buf), buf);
- ieee_putascii("ASL%X,%lX.\r\n", seg->ieee_index,
+ ieee_putascii("ASL%X,%lX.\n", seg->ieee_index,
(seg->align - SEG_ABS) * 16);
} else {
- ieee_putascii("ST%X,%c,%02X%s.\r\n", seg->ieee_index, attrib,
+ ieee_putascii("ST%X,%c,%02X%s.\n", seg->ieee_index, attrib,
strlen(buf), buf);
- ieee_putascii("SA%X,%lX.\r\n", seg->ieee_index, seg->align);
- ieee_putascii("ASS%X,%X.\r\n", seg->ieee_index,
+ ieee_putascii("SA%X,%lX.\n", seg->ieee_index, seg->align);
+ ieee_putascii("ASS%X,%X.\n", seg->ieee_index,
seg->currentpos);
}
seg = seg->next;
@@ -977,7 +977,7 @@ static void ieee_write_file(int debuginfo)
if (!seg)
error(ERR_PANIC, "Start address records are incorrect");
else
- ieee_putascii("ASG,R%X,%lX,+.\r\n", seg->ieee_index,
+ ieee_putascii("ASG,R%X,%lX,+.\n", seg->ieee_index,
ieee_entry_ofs);
}
@@ -990,18 +990,18 @@ static void ieee_write_file(int debuginfo)
for (pub = seg->pubhead; pub; pub = pub->next) {
char buf[256];
ieee_unqualified_name(buf, pub->name);
- ieee_putascii("NI%X,%02X%s.\r\n", i, strlen(buf), buf);
+ ieee_putascii("NI%X,%02X%s.\n", i, strlen(buf), buf);
if (pub->segment == -1)
- ieee_putascii("ASI%X,R%X,%lX,+.\r\n", i, pub->index,
+ ieee_putascii("ASI%X,R%X,%lX,+.\n", i, pub->index,
pub->offset);
else
- ieee_putascii("ASI%X,%lX,%lX,+.\r\n", i, pub->segment * 16,
+ ieee_putascii("ASI%X,%lX,%lX,+.\n", i, pub->segment * 16,
pub->offset);
if (debuginfo) {
if (pub->type >= 0x100)
- ieee_putascii("ATI%X,T%X.\r\n", i, pub->type - 0x100);
+ ieee_putascii("ATI%X,T%X.\n", i, pub->type - 0x100);
else
- ieee_putascii("ATI%X,%X.\r\n", i, pub->type);
+ ieee_putascii("ATI%X,%X.\n", i, pub->type);
}
i++;
}
@@ -1011,18 +1011,18 @@ static void ieee_write_file(int debuginfo)
while (pub) {
char buf[256];
ieee_unqualified_name(buf, pub->name);
- ieee_putascii("NI%X,%02X%s.\r\n", i, strlen(buf), buf);
+ ieee_putascii("NI%X,%02X%s.\n", i, strlen(buf), buf);
if (pub->segment == -1)
- ieee_putascii("ASI%X,R%X,%lX,+.\r\n", i, pub->index,
+ ieee_putascii("ASI%X,R%X,%lX,+.\n", i, pub->index,
pub->offset);
else
- ieee_putascii("ASI%X,%lX,%lX,+.\r\n", i, pub->segment * 16,
+ ieee_putascii("ASI%X,%lX,%lX,+.\n", i, pub->segment * 16,
pub->offset);
if (debuginfo) {
if (pub->type >= 0x100)
- ieee_putascii("ATI%X,T%X.\r\n", i, pub->type - 0x100);
+ ieee_putascii("ATI%X,T%X.\n", i, pub->type - 0x100);
else
- ieee_putascii("ATI%X,%X.\r\n", i, pub->type);
+ ieee_putascii("ATI%X,%X.\n", i, pub->type);
}
i++;
pub = pub->next;
@@ -1035,7 +1035,7 @@ static void ieee_write_file(int debuginfo)
while (ext) {
char buf[256];
ieee_unqualified_name(buf, ext->name);
- ieee_putascii("NX%X,%02X%s.\r\n", i++, strlen(buf), buf);
+ ieee_putascii("NX%X,%02X%s.\n", i++, strlen(buf), buf);
ext = ext->next;
}
ieee_putcs(false);
@@ -1044,14 +1044,14 @@ static void ieee_write_file(int debuginfo)
* IEEE doesn't have a standard pass break record
* so use the ladsoft variant
*/
- ieee_putascii("CO100,06ENDSYM.\r\n");
+ ieee_putascii("CO100,06ENDSYM.\n");
/*
* now put types
*/
i = ARRAY_BOT;
for (arr = arrhead; arr && debuginfo; arr = arr->next) {
- ieee_putascii("TY%X,20,%X,%lX.\r\n", i++, arr->basetype,
+ ieee_putascii("TY%X,20,%X,%lX.\n", i++, arr->basetype,
arr->size);
}
/*
@@ -1062,18 +1062,18 @@ static void ieee_write_file(int debuginfo)
for (loc = seg->lochead; loc; loc = loc->next) {
char buf[256];
ieee_unqualified_name(buf, loc->name);
- ieee_putascii("NN%X,%02X%s.\r\n", i, strlen(buf), buf);
+ ieee_putascii("NN%X,%02X%s.\n", i, strlen(buf), buf);
if (loc->segment == -1)
- ieee_putascii("ASN%X,R%X,%lX,+.\r\n", i, loc->index,
+ ieee_putascii("ASN%X,R%X,%lX,+.\n", i, loc->index,
loc->offset);
else
- ieee_putascii("ASN%X,%lX,%lX,+.\r\n", i, loc->segment * 16,
+ ieee_putascii("ASN%X,%lX,%lX,+.\n", i, loc->segment * 16,
loc->offset);
if (debuginfo) {
if (loc->type >= 0x100)
- ieee_putascii("ATN%X,T%X.\r\n", i, loc->type - 0x100);
+ ieee_putascii("ATN%X,T%X.\n", i, loc->type - 0x100);
else
- ieee_putascii("ATN%X,%X.\r\n", i, loc->type);
+ ieee_putascii("ATN%X,%X.\n", i, loc->type);
}
i++;
}
@@ -1089,7 +1089,7 @@ static void ieee_write_file(int debuginfo)
if (seg->currentpos) {
int32_t size, org = 0;
data = seg->data;
- ieee_putascii("SB%X.\r\n", seg->ieee_index);
+ ieee_putascii("SB%X.\n", seg->ieee_index);
fix = seg->fptr;
while (fix) {
size = HUNKSIZE - (org % HUNKSIZE);
@@ -1120,7 +1120,7 @@ static void ieee_write_file(int debuginfo)
/*
* module end record
*/
- ieee_putascii("ME.\r\n");
+ ieee_putascii("ME.\n");
}
static void ieee_write_byte(struct ieeeSection *seg, int data)
@@ -1154,7 +1154,7 @@ static void ieee_putascii(char *format, ...)
vsnprintf(buffer, sizeof(buffer), format, ap);
l = strlen(buffer);
for (i = 0; i < l; i++)
- if ((buffer[i] & 0xff) > 31)
+ if ((uint8_t)buffer[i] > 31)
checksum += buffer[i];
va_end(ap);
fprintf(ofp, buffer);
@@ -1165,11 +1165,11 @@ static void ieee_putascii(char *format, ...)
static void ieee_putcs(int toclear)
{
if (toclear) {
- ieee_putascii("CS.\r\n");
+ ieee_putascii("CS.\n");
} else {
checksum += 'C';
checksum += 'S';
- ieee_putascii("CS%02X.\r\n", checksum & 127);
+ ieee_putascii("CS%02X.\n", checksum & 127);
}
checksum = 0;
}
@@ -1188,7 +1188,7 @@ static int32_t ieee_putld(int32_t start, int32_t end, uint8_t *buf)
ieee_putascii("%02X", buf[val++]);
start++;
}
- ieee_putascii(".\r\n");
+ ieee_putascii(".\n");
}
/* if no partial lines */
if (start == end)
@@ -1199,7 +1199,7 @@ static int32_t ieee_putld(int32_t start, int32_t end, uint8_t *buf)
ieee_putascii("%02X", buf[val++]);
start++;
}
- ieee_putascii(".\r\n");
+ ieee_putascii(".\n");
return (start);
}
static int32_t ieee_putlr(struct ieeeFixupp *p)
@@ -1264,7 +1264,7 @@ static int32_t ieee_putlr(struct ieeeFixupp *p)
sprintf(buf, "X%"PRIX32",Y%"PRIX32",+,L%"PRIX32",-", p->id2, p->id2, p->id1);
break;
}
- ieee_putascii("LR(%s,%"PRIX32").\r\n", buf, size);
+ ieee_putascii("LR(%s,%"PRIX32").\n", buf, size);
return (size);
}
@@ -1501,7 +1501,7 @@ static struct dfmt *ladsoft_debug_arr[3] = {
struct ofmt of_ieee = {
"IEEE-695 (LADsoft variant) object file format",
"ieee",
- NULL,
+ OFMT_TEXT,
ladsoft_debug_arr,
&ladsoft_debug_form,
NULL,
diff --git a/output/outmacho.c b/output/outmacho.c
index 74aecada..90b9958f 100644
--- a/output/outmacho.c
+++ b/output/outmacho.c
@@ -1334,7 +1334,7 @@ static void debug_section_relocs (struct section *s)
struct ofmt of_macho = {
"NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X object files",
"macho",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
macho_stdmac,
diff --git a/output/outobj.c b/output/outobj.c
index a3f55801..73bec3cc 100644
--- a/output/outobj.c
+++ b/output/outobj.c
@@ -2558,7 +2558,7 @@ static struct dfmt *borland_debug_arr[3] = {
struct ofmt of_obj = {
"MS-DOS 16-bit/32-bit OMF object files",
"obj",
- NULL,
+ 0,
borland_debug_arr,
&borland_debug_form,
obj_stdmac,
diff --git a/output/outrdf.c b/output/outrdf.c
index 5ba8980d..fef18fbf 100644
--- a/output/outrdf.c
+++ b/output/outrdf.c
@@ -552,7 +552,7 @@ struct ofmt of_rdf = {
#else
"rdf",
#endif
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
rdf_stdmac,
diff --git a/output/outrdf2.c b/output/outrdf2.c
index c40d74a1..578c9237 100644
--- a/output/outrdf2.c
+++ b/output/outrdf2.c
@@ -787,7 +787,7 @@ static int rdf2_set_info(enum geninfo type, char **val)
struct ofmt of_rdf2 = {
"Relocatable Dynamic Object File Format v2.0",
"rdf",
- NULL,
+ 0,
null_debug_arr,
&null_debug_form,
rdf2_stdmac,