From: Peter Johnson Date: Sun, 2 Dec 2001 23:15:30 +0000 (-0000) Subject: Make extension-replacement a utility function in file.c (as it will need to X-Git-Tag: v0.1.0~149 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6bbcad2e6c5841e7bb9602e322ac7bebc2801f41;p=yasm 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 --- diff --git a/frontends/yasm/yasm.c b/frontends/yasm/yasm.c index 53445b92..e4e3d787 100644 --- a/frontends/yasm/yasm.c +++ b/frontends/yasm/yasm.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"); diff --git a/libyasm/file.c b/libyasm/file.c index 410c6825..54c5534a 100644 --- a/libyasm/file.c +++ b/libyasm/file.c @@ -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) diff --git a/libyasm/file.h b/libyasm/file.h index b1e5229f..e9a93877 100644 --- a/libyasm/file.h +++ b/libyasm/file.h @@ -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) \ diff --git a/src/file.c b/src/file.c index 410c6825..54c5534a 100644 --- a/src/file.c +++ b/src/file.c @@ -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) diff --git a/src/file.h b/src/file.h index b1e5229f..e9a93877 100644 --- a/src/file.h +++ b/src/file.h @@ -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) \ diff --git a/src/main.c b/src/main.c index 53445b92..e4e3d787 100644 --- a/src/main.c +++ b/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");