comparison 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
comparison
equal deleted inserted replaced
87:2e819b84d7c0 88:af4ed765c1ac
1 #include "common.h" 1 #include "common.h"
2 2
3 #include <string.h> 3 #include <string.h>
4 #include <stdlib.h>
4 5
5 /* hardcoded magic values; stored at 0x18... */ 6 /* hardcoded magic values; stored at 0x18... */
6 static const uint8_t magic_veg[16] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A}; 7 static const uint8_t magic_veg[16] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A};
7 static const uint8_t magic_vf[16] = {0xF6, 0x1B, 0x3C, 0x53, 0x35, 0xD6, 0xF3, 0x43, 0x8A, 0x90, 0x64, 0xB8, 0x87, 0x23, 0x1F, 0x7F}; 8 static const uint8_t magic_vf[16] = {0xF6, 0x1B, 0x3C, 0x53, 0x35, 0xD6, 0xF3, 0x43, 0x8A, 0x90, 0x64, 0xB8, 0x87, 0x23, 0x1F, 0x7F};
8 9
9 int set_file_information(FILE* target, uint8_t version, enum types type) { 10 int set_file_information(FILE *target, uint8_t version, enum types type)
11 {
10 const uint8_t* magic = (type == TYPES_VF) ? magic_vf : magic_veg; 12 const uint8_t* magic = (type == TYPES_VF) ? magic_vf : magic_veg;
11 13
12 if (fseek(target, 0x46, SEEK_SET)) 14 if (fseek(target, 0x46, SEEK_SET))
13 return -1; 15 return -1;
14 16
22 return -1; 24 return -1;
23 25
24 return 0; 26 return 0;
25 } 27 }
26 28
27 int get_file_information(FILE* input, uint8_t* version, enum types* type) { 29 int get_file_information(FILE *input, uint8_t *version, enum types *type)
30 {
28 uint8_t magic[16] = {0}; 31 uint8_t magic[16] = {0};
29 32
30 if (fseek(input, 0x46, SEEK_SET)) 33 if (fseek(input, 0x46, SEEK_SET))
31 return -1; 34 return -1;
32 35
34 37
35 if (fseek(input, 0x18, SEEK_SET)) 38 if (fseek(input, 0x18, SEEK_SET))
36 return -1; 39 return -1;
37 40
38 /* read the WHOLE magic, then memcmp */ 41 /* read the WHOLE magic, then memcmp */
39 if (fread(magic, sizeof(*magic), ARRAYSIZE(magic), input) < ARRAYSIZE(magic)) 42 if (fread(magic, sizeof(*magic), ARRAY_SIZE(magic), input) < ARRAY_SIZE(magic))
40 return -1; 43 return -1;
41 44
42 if (!memcmp(magic, magic_veg, ARRAYSIZE(magic))) { 45 if (!memcmp(magic, magic_veg, ARRAY_SIZE(magic))) {
43 *type = TYPES_VEG; 46 *type = TYPES_VEG;
44 } else if (!memcmp(magic, magic_vf, ARRAYSIZE(magic))) { 47 } else if (!memcmp(magic, magic_vf, ARRAY_SIZE(magic))) {
45 *type = TYPES_VF; 48 *type = TYPES_VF;
46 } else { 49 } else {
47 *type = TYPES_UNKNOWN; 50 *type = TYPES_UNKNOWN;
48 } 51 }
49 52
50 return 0; 53 return 0;
51 } 54 }
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 }