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;
}	

Reply via email to