annotate src/main.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 1acd477da42f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1 #include <stdio.h>
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
2 #include <stdint.h>
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
3 #include <stdlib.h>
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
4 #include <stdarg.h>
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
5 #include <string.h>
81
c06dcab17923 *: change license to BSD, update README for Unicode
Paper <paper@paper.us.eu.org>
parents: 79
diff changeset
6
13
a4e604789e2e Multiple changes
Paper <mrpapersonic@gmail.com>
parents: 9
diff changeset
7 #include <getopt.h>
42
d873a04165f9 use basename() on cli version
Paper <37962225+mrpapersonic@users.noreply.github.com>
parents: 16
diff changeset
8 #include <libgen.h>
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
9
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
10 #include "common.h"
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
11
88
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 85
diff changeset
12 static const char *type_extensions[] = {
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
13 [TYPES_VF] = "vf",
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
14 [TYPES_VEG] = "veg",
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
15 };
79
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 static const char* help_text =
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
18 "msvpvf help text\n"
88
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 85
diff changeset
19 "author: Paper <paper@tflc.us>\n"
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
20 "usage: %s <input>... (arguments)\n"
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
21 "\n"
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
22 "arguments:\n"
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
23 " -t, --type one of [vf,veg] (required)\n"
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
24 " -v, --version version to convert to (required)\n"
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
25 " -h, --help show this screen (optional)\n";
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
26
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
27 static struct option options_long[] = {
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
28 {"version", required_argument, NULL, 'v'},
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
29 {"type", required_argument, NULL, 't'},
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
30 {"help", 0, NULL, 'h'},
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
31 };
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
32
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
33 int main(int argc, char *argv[]) {
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
34 uint8_t version = 0;
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
35 enum types type = TYPES_VEG; /* ...? */
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
36
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
37 int c;
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
38 int option_index = 0;
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
39 while ((c = getopt_long(argc, argv, "v:t:h", options_long, &option_index)) != -1) {
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
40 /* option argument */
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
41 switch (c) {
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
42 case 'v':
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
43 version = atoi(optarg);
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
44 break;
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
45 case 't':
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
46 if (!strcmp(optarg, "vf")) {
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
47 type = TYPES_VF;
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
48 } else if (!strcmp(optarg, "veg")) {
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
49 type = TYPES_VEG;
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
50 } else {
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
51 fprintf(stderr, "[ERROR]: Received an invalid type parameter!\n");
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
52 printf(help_text, argv[0]);
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
53 }
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
54
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
55 break;
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
56 case 'h':
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
57 default:
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
58 printf(help_text, argv[0]);
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
59 break;
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
60 }
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
61 }
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
62
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
63 if (argc <= optind) {
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
64 fprintf(stderr, "[ERROR]: Missing input file(s)!\n");
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
65 printf(help_text, argv[0]);
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
66 return 1;
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
67 }
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
68
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
69 if (!version || !type) {
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
70 printf(help_text, (argc > 0) ? argv[0] : "msvpvf");
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
71 return 1;
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
72 }
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
73
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
74 while (optind < argc) {
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
75 const char* input = argv[optind++];
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
76 FILE *input_file, *output_file = NULL;
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
77 uint8_t file_version = 0;
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
78 enum types file_type = TYPES_UNKNOWN;
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
79
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
80 printf("Input file name: %s\n", input);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
81
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
82 /* print information about the input file */
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
83 input_file = fopen(input, "rb");
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
84 if (!input_file) {
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
85 fprintf(stderr, "[ERROR]: Error opening input file %s!\n\n", input);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
86 continue;
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
87 }
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
88
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
89 if (fgetc(input_file) == EOF) {
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
90 fprintf(stderr, "[ERROR]: Input file \"%s\" is empty.\n", input);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
91 fclose(input_file);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
92 continue;
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
93 }
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
94
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
95 if (get_file_information(input_file, &file_version, &file_type)) {
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
96 fprintf(stderr, "[ERROR]: Failed to get file information for input file \"%s\"!\n", input);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
97 fclose(input_file);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
98 continue;
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
99 }
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
100
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
101 printf("Input file version: %u\n", file_version);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
102 printf("Input file type: %s\n\n", type_names[file_type]);
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
103
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
104 {
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
105 /* open the output file... */
88
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 85
diff changeset
106 char* basec = str_dup(input);
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
107 char* bname = basename(basec);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
108 int ext = strrchr(bname, '.') - bname;
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
109
88
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 85
diff changeset
110 char *output = msvpvf_asprintf("V%u_%.*s.%s", version, ext, bname, type_extensions[type]);
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
111 if (!output) {
88
af4ed765c1ac *: add IUP GUI
Paper <paper@tflc.us>
parents: 85
diff changeset
112 fprintf(stderr, "[ERROR]: msvpvf_asprintf failed!\n");
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
113 free(basec);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
114 free(output);
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
115 fclose(input_file);
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
116 continue;
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
117 }
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
118
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
119 output_file = fopen(output, "w+b");
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
120 if (!output_file) {
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
121 fprintf(stderr, "[ERROR]: Failed to open output file %s! Do you have write permissions?\n", output);
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
122 free(basec);
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
123 free(output);
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
124 fclose(input_file);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
125 continue;
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
126 }
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
127
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
128 free(basec);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
129 free(output);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
130 }
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
131
85
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
132 copy_file(input_file, output_file);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
133
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
134 fflush(stdout);
1acd477da42f posix: improvements
Paper <paper@paper.us.eu.org>
parents: 81
diff changeset
135 fclose(input_file);
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
136
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
137 set_file_information(output_file, version, type);
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
138 fclose(output_file);
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
139 }
79
8f90d5addda9 *: refactor... basically everything!
Paper <paper@paper.us.eu.org>
parents: 58
diff changeset
140
6
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
141 return 0;
d1e5b8390cd3 Add Windows GUI version and a multitude of other changes
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
142 }