Make extension-replacement a utility function in file.c (as it will need to

be performed for the list file, etc, as well as the object file).

svn path=/trunk/yasm/; revision=381
0.3
Peter Johnson 24 years ago
parent c42294ab0a
commit 6bbcad2e6c
  1. 15
      frontends/yasm/yasm.c
  2. 43
      libyasm/file.c
  3. 7
      libyasm/file.h
  4. 43
      src/file.c
  5. 7
      src/file.h
  6. 15
      src/main.c

@ -27,6 +27,7 @@
#endif
#include "bitvect.h"
#include "file.h"
#include "globals.h"
#include "options.h"
@ -139,20 +140,12 @@ main(int argc, char *argv[])
/* open the object file if not specified */
if (!obj) {
/* build the object filename */
char *exttail;
if (obj_filename)
xfree(obj_filename);
assert(in_filename != NULL);
/* allocate enough space for full existing name + extension */
obj_filename = xmalloc(strlen(in_filename)+
strlen(cur_objfmt->extension)+2);
strcpy(obj_filename, in_filename);
exttail = strrchr(obj_filename, '.');
if (!exttail)
exttail = strrchr(obj_filename, '\0');
/*@-nullpass@*/
sprintf(exttail, ".%s", cur_objfmt->extension);
/*@=nullpass@*/
/* replace (or add) extension */
obj_filename = replace_extension(in_filename, cur_objfmt->extension,
"yasm.out");
/* open the built filename */
obj = fopen(obj_filename, "wb");

@ -24,6 +24,49 @@
#include "file.h"
#include "errwarn.h"
char *
replace_extension(const char *orig, const char *ext, const char *def)
{
char *out, *outext;
/* allocate enough space for full existing name + extension */
out = xmalloc(strlen(orig)+strlen(ext)+2);
strcpy(out, orig);
outext = strrchr(out, '.');
if (outext) {
/* Existing extension: make sure it's not the same as the replacement
* (as we don't want to overwrite the source file).
*/
outext++; /* advance past '.' */
if (strcmp(outext, ext)) {
outext = NULL; /* indicate default should be used */
WarningNow(_("file name already ends in `.%s': output will be in `%s'"),
ext, def);
}
} else {
/* No extension: make sure the output extension is not empty
* (again, we don't want to overwrite the source file).
*/
if (*ext == '\0')
WarningNow(_("file name already has no extension: output will be in `%s'"),
def);
else {
outext = strrchr(out, '\0'); /* point to end of the string */
*outext++ = '.'; /* append '.' */
}
}
/* replace extension or use default name */
if (outext)
strcpy(outext, ext);
else
strcpy(out, def);
return out;
}
size_t
fwrite_short(unsigned short val, FILE *f)

@ -22,6 +22,13 @@
#ifndef YASM_FILE_H
#define YASM_FILE_H
/* Replace extension on a filename (or append one if none is present).
* If output filename would be identical to input (same extension out as in),
* returns (copy of) def.
*/
/*@only@*/ char *replace_extension(const char *orig, const char *ext,
const char *def);
/* These functions only work properly if p is an (unsigned char *) */
#define WRITE_BYTE(ptr, val) \

@ -24,6 +24,49 @@
#include "file.h"
#include "errwarn.h"
char *
replace_extension(const char *orig, const char *ext, const char *def)
{
char *out, *outext;
/* allocate enough space for full existing name + extension */
out = xmalloc(strlen(orig)+strlen(ext)+2);
strcpy(out, orig);
outext = strrchr(out, '.');
if (outext) {
/* Existing extension: make sure it's not the same as the replacement
* (as we don't want to overwrite the source file).
*/
outext++; /* advance past '.' */
if (strcmp(outext, ext)) {
outext = NULL; /* indicate default should be used */
WarningNow(_("file name already ends in `.%s': output will be in `%s'"),
ext, def);
}
} else {
/* No extension: make sure the output extension is not empty
* (again, we don't want to overwrite the source file).
*/
if (*ext == '\0')
WarningNow(_("file name already has no extension: output will be in `%s'"),
def);
else {
outext = strrchr(out, '\0'); /* point to end of the string */
*outext++ = '.'; /* append '.' */
}
}
/* replace extension or use default name */
if (outext)
strcpy(outext, ext);
else
strcpy(out, def);
return out;
}
size_t
fwrite_short(unsigned short val, FILE *f)

@ -22,6 +22,13 @@
#ifndef YASM_FILE_H
#define YASM_FILE_H
/* Replace extension on a filename (or append one if none is present).
* If output filename would be identical to input (same extension out as in),
* returns (copy of) def.
*/
/*@only@*/ char *replace_extension(const char *orig, const char *ext,
const char *def);
/* These functions only work properly if p is an (unsigned char *) */
#define WRITE_BYTE(ptr, val) \

@ -27,6 +27,7 @@
#endif
#include "bitvect.h"
#include "file.h"
#include "globals.h"
#include "options.h"
@ -139,20 +140,12 @@ main(int argc, char *argv[])
/* open the object file if not specified */
if (!obj) {
/* build the object filename */
char *exttail;
if (obj_filename)
xfree(obj_filename);
assert(in_filename != NULL);
/* allocate enough space for full existing name + extension */
obj_filename = xmalloc(strlen(in_filename)+
strlen(cur_objfmt->extension)+2);
strcpy(obj_filename, in_filename);
exttail = strrchr(obj_filename, '.');
if (!exttail)
exttail = strrchr(obj_filename, '\0');
/*@-nullpass@*/
sprintf(exttail, ".%s", cur_objfmt->extension);
/*@=nullpass@*/
/* replace (or add) extension */
obj_filename = replace_extension(in_filename, cur_objfmt->extension,
"yasm.out");
/* open the built filename */
obj = fopen(obj_filename, "wb");

Loading…
Cancel
Save