X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/deb0e1cf33f66de19d6621e54177faa76017786a..b61f81bc4c102d06f13fd68e4a73ab8fdfdb3cf5:/unix/uxmisc.c diff --git a/unix/uxmisc.c b/unix/uxmisc.c index 4c6a7670..7d577f96 100644 --- a/unix/uxmisc.c +++ b/unix/uxmisc.c @@ -27,27 +27,58 @@ unsigned long getticks(void) return tv.tv_sec * 1000 + tv.tv_usec / 1000 + tickcount_offset; } -Filename filename_from_str(const char *str) +Filename *filename_from_str(const char *str) { - Filename ret; - strncpy(ret.path, str, sizeof(ret.path)); - ret.path[sizeof(ret.path)-1] = '\0'; + Filename *ret = snew(Filename); + ret->path = dupstr(str); return ret; } +Filename *filename_copy(const Filename *fn) +{ + return filename_from_str(fn->path); +} + const char *filename_to_str(const Filename *fn) { return fn->path; } -int filename_equal(Filename f1, Filename f2) +int filename_equal(const Filename *f1, const Filename *f2) +{ + return !strcmp(f1->path, f2->path); +} + +int filename_is_null(const Filename *fn) { - return !strcmp(f1.path, f2.path); + return !fn->path[0]; } -int filename_is_null(Filename fn) +void filename_free(Filename *fn) +{ + sfree(fn->path); + sfree(fn); +} + +int filename_serialise(const Filename *f, void *vdata) +{ + char *data = (char *)vdata; + int len = strlen(f->path) + 1; /* include trailing NUL */ + if (data) { + strcpy(data, f->path); + } + return len; +} +Filename *filename_deserialise(void *vdata, int maxsize, int *used) { - return !*fn.path; + char *data = (char *)vdata; + char *end; + end = memchr(data, '\0', maxsize); + if (!end) + return NULL; + end++; + *used = end - data; + return filename_from_str(data); } #ifdef DEBUG @@ -135,17 +166,49 @@ int cloexec(int fd) { return fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC); } -FILE *f_open(struct Filename filename, char const *mode, int is_private) +FILE *f_open(const Filename *filename, char const *mode, int is_private) { if (!is_private) { - return fopen(filename.path, mode); + return fopen(filename->path, mode); } else { int fd; - assert(mode[0] == 'w'); /* is_private is meaningless for read */ - fd = open(filename.path, O_WRONLY | O_CREAT | O_TRUNC, - 0700); + assert(mode[0] == 'w'); /* is_private is meaningless for read, + and tricky for append */ + fd = open(filename->path, O_WRONLY | O_CREAT | O_TRUNC, 0700); if (fd < 0) return NULL; return fdopen(fd, mode); } } + +FontSpec *fontspec_new(const char *name) +{ + FontSpec *f = snew(FontSpec); + f->name = dupstr(name); + return f; +} +FontSpec *fontspec_copy(const FontSpec *f) +{ + return fontspec_new(f->name); +} +void fontspec_free(FontSpec *f) +{ + sfree(f->name); + sfree(f); +} +int fontspec_serialise(FontSpec *f, void *data) +{ + int len = strlen(f->name); + if (data) + strcpy(data, f->name); + return len + 1; /* include trailing NUL */ +} +FontSpec *fontspec_deserialise(void *vdata, int maxsize, int *used) +{ + char *data = (char *)vdata; + char *end = memchr(data, '\0', maxsize); + if (!end) + return NULL; + *used = end - data + 1; + return fontspec_new(data); +}