Mercurial > msvpvf
annotate 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 |
| rev | line source |
|---|---|
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
1 #include "common.h" |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
2 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
3 #include <string.h> |
| 88 | 4 #include <stdlib.h> |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
5 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
6 /* hardcoded magic values; stored at 0x18... */ |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
7 static const uint8_t magic_veg[16] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A}; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
8 static const uint8_t magic_vf[16] = {0xF6, 0x1B, 0x3C, 0x53, 0x35, 0xD6, 0xF3, 0x43, 0x8A, 0x90, 0x64, 0xB8, 0x87, 0x23, 0x1F, 0x7F}; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
9 |
| 88 | 10 int set_file_information(FILE *target, uint8_t version, enum types type) |
| 11 { | |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
12 const uint8_t* magic = (type == TYPES_VF) ? magic_vf : magic_veg; |
|
47
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
13 |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
14 if (fseek(target, 0x46, SEEK_SET)) |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
15 return -1; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
16 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
17 if (fputc(version, target) == EOF) |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
18 return -1; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
19 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
20 if (fseek(target, 0x18, SEEK_SET)) |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
21 return -1; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
22 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
23 if (fwrite(magic, sizeof(*magic), 16, target) < 16) |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
24 return -1; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
25 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
26 return 0; |
|
47
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
27 } |
|
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
28 |
| 88 | 29 int get_file_information(FILE *input, uint8_t *version, enum types *type) |
| 30 { | |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
31 uint8_t magic[16] = {0}; |
|
47
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
32 |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
33 if (fseek(input, 0x46, SEEK_SET)) |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
34 return -1; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
35 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
36 *version = fgetc(input); |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
37 |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
38 if (fseek(input, 0x18, SEEK_SET)) |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
39 return -1; |
|
47
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
40 |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
41 /* read the WHOLE magic, then memcmp */ |
| 88 | 42 if (fread(magic, sizeof(*magic), ARRAY_SIZE(magic), input) < ARRAY_SIZE(magic)) |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
43 return -1; |
|
47
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
44 |
| 88 | 45 if (!memcmp(magic, magic_veg, ARRAY_SIZE(magic))) { |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
46 *type = TYPES_VEG; |
| 88 | 47 } else if (!memcmp(magic, magic_vf, ARRAY_SIZE(magic))) { |
|
79
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
48 *type = TYPES_VF; |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
49 } else { |
|
8f90d5addda9
*: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents:
58
diff
changeset
|
50 *type = TYPES_UNKNOWN; |
|
47
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
51 } |
|
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
52 |
|
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
53 return 0; |
|
7cb4ca7cf257
Use a common.c file to hold concurrent functions
Paper <mrpapersonic@gmail.com>
parents:
diff
changeset
|
54 } |
| 88 | 55 |
| 56 /* source needs read permissions, target needs write permissions, both must be in binary mode */ | |
| 57 int copy_file(FILE *source, FILE *target) | |
| 58 { | |
| 59 char ch[4096]; | |
| 60 | |
| 61 while (!feof(source)) { | |
| 62 size_t b = fread(ch, 1, sizeof(ch), source); | |
| 63 if (b && (fwrite(ch, 1, b, target) < b)) | |
| 64 return -1; | |
| 65 } | |
| 66 | |
| 67 return 0; | |
| 68 } | |
| 69 | |
| 70 /* ------------------------------------------------------------------------ */ | |
| 71 | |
| 72 char *str_ndup(const char *str, size_t sz) | |
| 73 { | |
| 74 char *x; | |
| 75 | |
| 76 x = malloc(sz + 1); | |
| 77 if (!x) | |
| 78 return NULL; | |
| 79 | |
| 80 memcpy(x, str, sz); | |
| 81 x[sz] = 0; | |
| 82 | |
| 83 return x; | |
| 84 } | |
| 85 | |
| 86 char *str_dup(const char *str) | |
| 87 { | |
| 88 return str_ndup(str, strlen(str)); | |
| 89 } | |
| 90 | |
| 91 /* ------------------------------------------------------------------------ */ | |
| 92 | |
| 93 const char *type_names[] = { | |
| 94 [TYPES_VF] = "Movie Studio", | |
| 95 [TYPES_VEG] = "Vegas Pro", | |
| 96 [TYPES_UNKNOWN] = "Unknown", | |
| 97 }; | |
| 98 | |
| 99 /* ------------------------------------------------------------------------ */ | |
| 100 | |
| 101 char *msvpvf_vasprintf(const char *format, va_list ap) | |
| 102 { | |
| 103 va_list ap2; | |
| 104 int needed_size; | |
| 105 char *output = NULL; | |
| 106 | |
| 107 va_copy(ap2, ap); | |
| 108 | |
| 109 needed_size = vsnprintf(NULL, 0, format, ap); | |
| 110 if (needed_size < 0) { | |
| 111 va_end(ap2); | |
| 112 return NULL; | |
| 113 } | |
| 114 | |
| 115 output = malloc((needed_size + 1) * sizeof(char)); | |
| 116 if (!output) { | |
| 117 va_end(ap2); | |
| 118 return NULL; | |
| 119 } | |
| 120 | |
| 121 needed_size = vsnprintf(output, needed_size + 1, format, ap2); | |
| 122 if (needed_size < 0) { | |
| 123 free(output); | |
| 124 va_end(ap2); | |
| 125 return NULL; | |
| 126 } | |
| 127 | |
| 128 va_end(ap2); | |
| 129 | |
| 130 return output; | |
| 131 } | |
| 132 | |
| 133 char *msvpvf_asprintf(const char *format, ...) | |
| 134 { | |
| 135 char *x; | |
| 136 va_list ap; | |
| 137 | |
| 138 va_start(ap, format); | |
| 139 x = msvpvf_vasprintf(format, ap); | |
| 140 va_end(ap); | |
| 141 | |
| 142 return x; | |
| 143 } |
