Angus Leeming wrote:
> Lars Gullik Bjønnes wrote:
>> (and I am not saying that -dir should be removed, I am saying that
>> fdesign should output to pwd (unless -dir is specified of course.))
>
> Ok, understood. You want me to mess around with malloc just before
> we try and get XForms 1.1 out of the door. Bad man!
>
> I'll have a look.
This is the current code.
static char const *
filename_only(char const * filename)
{
char const * ptr = strrchr(filename, '/');
if (ptr)
return ptr+1;
return filename;
}
/* Given 'filename' (no extension) and 'ext', generate 'fname' */
static void
build_fname(char * fname, char const * filename, char const * ext)
{
if (fdopt.output_dir) {
strcpy(fname, fdopt.output_dir);
if (fname[strlen(fdopt.output_dir) - 1] != '/')
strcat(fname, "/");
strcat(fname, filename_only(filename));
} else
strcpy(fname, filename);
strcat(fname, ext);
}
I believe that we achieve what you're looking for with
- } else
- strcpy(fname, filename);
+ } else {
+ size_t const buffer_size = 512;
+ char buffer[buffer_size];
+ char * cwd = getcwd(buffer, buffer_size);
+ if (cwd) {
+ strcpy(fname, cwd);
+ strcat(fname, "/");
+ strcat(fname, filename_only(filename));
+ } else
+ strcpy(fname, filename);
+ }
Test code attached. I'm pretty sure that this is safe, but would value
second opinions...
--
Angus
#include <stdio.h>
#include <string.h>
#include <unistd.h>
typedef struct {
char * output_dir;
} FD_Opt;
FD_Opt fdopt;
static char const *
filename_only(char const * filename)
{
char const * ptr = strrchr(filename, '/');
if (ptr)
return ptr+1;
return filename;
}
/* Given 'filename' (no extension) and 'ext', generate 'fname' */
static void
build_fname(char * fname, char const * filename, char const * ext)
{
if (fdopt.output_dir) {
strcpy(fname, fdopt.output_dir);
if (fname[strlen(fdopt.output_dir) - 1] != '/')
strcat(fname, "/");
strcat(fname, filename_only(filename));
} else {
size_t const buffer_size = 512;
char buffer[buffer_size];
char * cwd = getcwd(buffer, buffer_size);
if (cwd) {
strcpy(fname, cwd);
strcat(fname, "/");
strcat(fname, filename_only(filename));
} else
strcpy(fname, filename);
}
strcat(fname, ext);
}
int main(int argc, char * argv[])
{
char fname[512];
fdopt.output_dir = 0;
if (argc > 1) {
fdopt.output_dir = (char *)malloc(strlen(argv[1]) + 1);
strcpy(fdopt.output_dir, argv[1]);
}
build_fname(fname, "foo/bar/baz", ".h");
printf("Output fname is \"%s\"\n", fname);
return 0;
}