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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
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
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
10 int set_file_information(FILE *target, uint8_t version, enum types type)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
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
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
29 int get_file_information(FILE *input, uint8_t *version, enum types *type)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
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
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
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
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
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
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
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
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
55
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
56 /* source needs read permissions, target needs write permissions, both must be in binary mode */
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
57 int copy_file(FILE *source, FILE *target)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
58 {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
59 char ch[4096];
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
60
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
61 while (!feof(source)) {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
62 size_t b = fread(ch, 1, sizeof(ch), source);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
63 if (b && (fwrite(ch, 1, b, target) < b))
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
64 return -1;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
65 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
66
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
67 return 0;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
68 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
69
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
70 /* ------------------------------------------------------------------------ */
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
71
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
72 char *str_ndup(const char *str, size_t sz)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
73 {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
74 char *x;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
75
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
76 x = malloc(sz + 1);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
77 if (!x)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
78 return NULL;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
79
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
80 memcpy(x, str, sz);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
81 x[sz] = 0;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
82
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
83 return x;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
84 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
85
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
86 char *str_dup(const char *str)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
87 {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
88 return str_ndup(str, strlen(str));
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
89 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
90
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
91 /* ------------------------------------------------------------------------ */
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
92
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
93 const char *type_names[] = {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
94 [TYPES_VF] = "Movie Studio",
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
95 [TYPES_VEG] = "Vegas Pro",
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
96 [TYPES_UNKNOWN] = "Unknown",
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
97 };
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
98
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
99 /* ------------------------------------------------------------------------ */
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
100
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
101 char *msvpvf_vasprintf(const char *format, va_list ap)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
102 {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
103 va_list ap2;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
104 int needed_size;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
105 char *output = NULL;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
106
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
107 va_copy(ap2, ap);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
108
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
109 needed_size = vsnprintf(NULL, 0, format, ap);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
110 if (needed_size < 0) {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
111 va_end(ap2);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
112 return NULL;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
113 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
114
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
115 output = malloc((needed_size + 1) * sizeof(char));
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
116 if (!output) {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
117 va_end(ap2);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
118 return NULL;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
119 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
120
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
121 needed_size = vsnprintf(output, needed_size + 1, format, ap2);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
122 if (needed_size < 0) {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
123 free(output);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
124 va_end(ap2);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
125 return NULL;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
126 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
127
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
128 va_end(ap2);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
129
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
130 return output;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
131 }
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
132
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
133 char *msvpvf_asprintf(const char *format, ...)
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
134 {
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
135 char *x;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
136 va_list ap;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
137
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
138 va_start(ap, format);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
139 x = msvpvf_vasprintf(format, ap);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
140 va_end(ap);
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
141
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
142 return x;
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 79
diff changeset
143 }