Mercurial > msvpvf
diff src/common.c @ 88:af4ed765c1ac
*: add IUP GUI
a lot simpler than win32, but I assume there's more going on in
the background that I don't know about :)
author | Paper <paper@tflc.us> |
---|---|
date | Mon, 14 Jul 2025 02:39:24 -0400 |
parents | 8f90d5addda9 |
children |
line wrap: on
line diff
--- a/src/common.c Mon Jul 15 01:35:03 2024 -0400 +++ b/src/common.c Mon Jul 14 02:39:24 2025 -0400 @@ -1,12 +1,14 @@ #include "common.h" #include <string.h> +#include <stdlib.h> /* hardcoded magic values; stored at 0x18... */ static const uint8_t magic_veg[16] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A}; static const uint8_t magic_vf[16] = {0xF6, 0x1B, 0x3C, 0x53, 0x35, 0xD6, 0xF3, 0x43, 0x8A, 0x90, 0x64, 0xB8, 0x87, 0x23, 0x1F, 0x7F}; -int set_file_information(FILE* target, uint8_t version, enum types type) { +int set_file_information(FILE *target, uint8_t version, enum types type) +{ const uint8_t* magic = (type == TYPES_VF) ? magic_vf : magic_veg; if (fseek(target, 0x46, SEEK_SET)) @@ -24,7 +26,8 @@ return 0; } -int get_file_information(FILE* input, uint8_t* version, enum types* type) { +int get_file_information(FILE *input, uint8_t *version, enum types *type) +{ uint8_t magic[16] = {0}; if (fseek(input, 0x46, SEEK_SET)) @@ -36,12 +39,12 @@ return -1; /* read the WHOLE magic, then memcmp */ - if (fread(magic, sizeof(*magic), ARRAYSIZE(magic), input) < ARRAYSIZE(magic)) + if (fread(magic, sizeof(*magic), ARRAY_SIZE(magic), input) < ARRAY_SIZE(magic)) return -1; - if (!memcmp(magic, magic_veg, ARRAYSIZE(magic))) { + if (!memcmp(magic, magic_veg, ARRAY_SIZE(magic))) { *type = TYPES_VEG; - } else if (!memcmp(magic, magic_vf, ARRAYSIZE(magic))) { + } else if (!memcmp(magic, magic_vf, ARRAY_SIZE(magic))) { *type = TYPES_VF; } else { *type = TYPES_UNKNOWN; @@ -49,3 +52,92 @@ return 0; } + +/* source needs read permissions, target needs write permissions, both must be in binary mode */ +int copy_file(FILE *source, FILE *target) +{ + char ch[4096]; + + while (!feof(source)) { + size_t b = fread(ch, 1, sizeof(ch), source); + if (b && (fwrite(ch, 1, b, target) < b)) + return -1; + } + + return 0; +} + +/* ------------------------------------------------------------------------ */ + +char *str_ndup(const char *str, size_t sz) +{ + char *x; + + x = malloc(sz + 1); + if (!x) + return NULL; + + memcpy(x, str, sz); + x[sz] = 0; + + return x; +} + +char *str_dup(const char *str) +{ + return str_ndup(str, strlen(str)); +} + +/* ------------------------------------------------------------------------ */ + +const char *type_names[] = { + [TYPES_VF] = "Movie Studio", + [TYPES_VEG] = "Vegas Pro", + [TYPES_UNKNOWN] = "Unknown", +}; + +/* ------------------------------------------------------------------------ */ + +char *msvpvf_vasprintf(const char *format, va_list ap) +{ + va_list ap2; + int needed_size; + char *output = NULL; + + va_copy(ap2, ap); + + needed_size = vsnprintf(NULL, 0, format, ap); + if (needed_size < 0) { + va_end(ap2); + return NULL; + } + + output = malloc((needed_size + 1) * sizeof(char)); + if (!output) { + va_end(ap2); + return NULL; + } + + needed_size = vsnprintf(output, needed_size + 1, format, ap2); + if (needed_size < 0) { + free(output); + va_end(ap2); + return NULL; + } + + va_end(ap2); + + return output; +} + +char *msvpvf_asprintf(const char *format, ...) +{ + char *x; + va_list ap; + + va_start(ap, format); + x = msvpvf_vasprintf(format, ap); + va_end(ap); + + return x; +}