diff options
Diffstat (limited to 'libyasm')
-rw-r--r-- | libyasm/file.c | 43 | ||||
-rw-r--r-- | libyasm/file.h | 7 |
2 files changed, 50 insertions, 0 deletions
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) \ |