----- Original Message ----- > This is a variable argument function that joins together paths with > the > system path separator (Unix='/', Windows='\\'). > > Signed-off-by: Chad Versace <[email protected]> > --- > tests/util/piglit-util.c | 51 > ++++++++++++++++++++++++++++++++++++++++++++++++ > tests/util/piglit-util.h | 13 ++++++++++++ > 2 files changed, 64 insertions(+) > > diff --git a/tests/util/piglit-util.c b/tests/util/piglit-util.c > index f01ff5e..07b5b31 100644 > --- a/tests/util/piglit-util.c > +++ b/tests/util/piglit-util.c > @@ -347,3 +347,54 @@ piglit_source_dir(void) > } > > return s; > +} > + > +#ifdef _WIN32 > +# define PIGLIT_PATH_SEP '\\' > +#else > +# define PIGLIT_PATH_SEP '/' > +#endif > + > +size_t > +piglit_join_paths(char buf[], size_t buf_size, int n, ...) > +{ > + char *dest = buf; > + size_t size_written = 0; > + > + int i; > + va_list va; > + > + if (buf_size == 0 || n < 1) > + return 0; > + > + va_start(va, n); > + > + i = 0; > + while (true) { > + const char *p = va_arg(va, const char*); > + > + while (*p != 0) { > + if (size_written == buf_size - 1) > + break;
You should probably return immediately here, otherwise you might set buf[buf_size -1 ] = PIGLIT_PATH_SEP and then write buf[buf_size] = '\0', i.e., overflow. But provided bug_size is big enough, this should never happen in practice anyway. Otherwise looks good. Jose > + > + *dest = *p; > + ++dest; > + ++p; > + ++size_written; > + } > + > + ++i; > + if (i == n) > + break; > + > + *dest = PIGLIT_PATH_SEP; > + ++dest; > + ++size_written; > + } > + > + *dest = '\0'; > + ++size_written; > + > + va_end(va); > + return size_written; > +} > diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h > index b5e6d3a..269a590 100644 > --- a/tests/util/piglit-util.h > +++ b/tests/util/piglit-util.h > @@ -135,6 +135,19 @@ char *piglit_load_text_file(const char > *file_name, unsigned *size); > const char* > piglit_source_dir(void); > > +/** > + * \brief Join paths together with the system path separator. > + * > + * On Unix, the path separator is '/'. On Windows, '\\'. > + * > + * The variable argument consists of \a n null-terminated strings. > The > + * resultant path is written to \a buf. No more than \a buf_size > bytes are > + * written to \a buf. The last byte written is always the null > character. > + * Returned is the number of bytes written, including the > terminating null. > + */ > +size_t > +piglit_join_paths(char buf[], size_t buf_size, int n, ...); > + > #ifdef __cplusplus > } /* end extern "C" */ > #endif > -- > 1.7.11.1 > > _______________________________________________ > Piglit mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/piglit > _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
