Angus Leeming wrote:
>> String manipulation in C is so nice ;-)
>
> Isn't it just. Thanks for this, Georg.
Actually, once you've got your head around the fact that nobody is
there to hold your hand, it isn't too bad. The attached trial program
has been tested and is always safe. I'm going to commit this to
XForms cvs.
--
Angus
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.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;
}
static void
build_fname(char * fname, size_t fname_capacity,
char const * filename, char const * ext)
{
char const * const only_filename = filename_only(filename);
size_t fname_size;
fname[fname_capacity] = '\0';
if (fdopt.output_dir) {
strncpy(fname, fdopt.output_dir, fname_capacity);
fname_size = strlen(fname);
if (fname_size != fname_capacity && fname[fname_size - 1] != '/') {
strcat(fname, "/");
fname_size += 1;
}
strncat(fname, only_filename, fname_capacity-fname_size);
} else
strncpy(fname, only_filename, fname_capacity);
fname_size = strlen(fname);
strncat(fname, ext, fname_capacity-fname_size);
}
int main(int argc, char * argv[])
{
size_t const fname_capacity = 10;
char fname[fname_capacity + 1];
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, fname_capacity, "foo/bar/bazabcde", ".h");
printf("Output fname is \"%s\"\n", fname);
return 0;
}