Mercurial > msvpvf
comparison src/main.c @ 47:7cb4ca7cf257
Use a common.c file to hold concurrent functions
Also I fixed that 1.4 KB bug I think
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sat, 21 May 2022 18:41:54 -0400 |
parents | 7cb9fad3f5ee |
children | 652343b56a60 |
comparison
equal
deleted
inserted
replaced
46:7cb9fad3f5ee | 47:7cb4ca7cf257 |
---|---|
4 #include <stdlib.h> | 4 #include <stdlib.h> |
5 #include <string.h> | 5 #include <string.h> |
6 #include <unistd.h> | 6 #include <unistd.h> |
7 #include <getopt.h> | 7 #include <getopt.h> |
8 #include <libgen.h> | 8 #include <libgen.h> |
9 #include "../include/common.h" | |
9 #ifdef _MSC_VER | 10 #ifdef _MSC_VER |
10 #define strdup(p) _strdup(p) | 11 #define strdup(p) _strdup(p) |
11 #endif | 12 #endif |
12 | 13 |
13 static struct option options_long[] = { | 14 static struct option options_long[] = { |
27 } | 28 } |
28 } | 29 } |
29 return str; | 30 return str; |
30 } | 31 } |
31 | 32 |
32 void set_data(unsigned char magic[], uint16_t version, FILE* target) { | |
33 int i; | |
34 fseek(target, 0x46, SEEK_SET); | |
35 fputc(version, target); | |
36 for (i=0; i<=sizeof(*magic); ++i) { | |
37 fseek(target, 0x18+i, SEEK_SET); | |
38 fputc(magic[i], target); | |
39 } | |
40 } | |
41 | |
42 int copy_file(char* source_file, char* target_file) { | |
43 char ch; | |
44 FILE *source, *target; | |
45 | |
46 source = fopen(source_file, "rb"); | |
47 | |
48 if (source == NULL) | |
49 return 1; | |
50 | |
51 target = fopen(target_file, "wb"); | |
52 | |
53 if (target == NULL) { | |
54 fclose(source); | |
55 return 1; | |
56 } | |
57 | |
58 while( ( ch = fgetc(source) ) != EOF ) | |
59 fputc(ch, target); | |
60 | |
61 fclose(target); | |
62 fclose(source); | |
63 return 0; | |
64 } | |
65 | |
66 int main(int argc, char *argv[]) { | 33 int main(int argc, char *argv[]) { |
67 int c, option_index = 0; | 34 int c, option_index = 0; |
68 unsigned char magic[16]; | 35 unsigned char magic[16]; |
69 FILE* outfile; | 36 FILE* outfile; |
70 struct arguments { | 37 struct arguments { |
71 char input[256]; | 38 char input[256]; |
72 char output[256]; | 39 char output[256]; |
73 int version; | 40 int version; |
74 char type[256]; | 41 char type[4]; |
75 } args; | 42 } args; |
76 strcpy(args.input, " "); | 43 strcpy(args.input, " "); |
77 strcpy(args.output, " "); | 44 strcpy(args.output, " "); |
78 args.version = -1; | 45 args.version = -1; |
79 strcpy(args.type, " "); | 46 strcpy(args.type, " "); |
82 switch(c) { | 49 switch(c) { |
83 case 'i': | 50 case 'i': |
84 strncpy(args.input, optarg, sizeof(args.input)-1); /* subtract 1 to make sure it's "null-safe" */ | 51 strncpy(args.input, optarg, sizeof(args.input)-1); /* subtract 1 to make sure it's "null-safe" */ |
85 break; | 52 break; |
86 case 'o': | 53 case 'o': |
87 strncpy(args.output, optarg, sizeof(args.input)-1); | 54 strncpy(args.output, optarg, sizeof(args.output)-1); |
88 break; | 55 break; |
89 case 'v': | 56 case 'v': |
90 args.version = abs(atoi(strdup(optarg))); /* abs() for possible negative inputs */ | 57 args.version = abs(atoi(strdup(optarg))); /* abs() for possible negative inputs */ |
91 break; | 58 break; |
92 case 't': | 59 case 't': |
93 strncpy(args.type, optarg, sizeof(args.input)-1); | 60 strncpy(args.type, optarg, sizeof(args.type)-1); |
94 break; | 61 break; |
95 case 'h': | 62 case 'h': |
96 default: | 63 default: |
97 printf("msvpvf by Paper\nusage: %s (-i/--input) infile [(-o/--output) outfile] (-v/--version) version (-t/--type) [vf, veg]\n", argv[0]); | 64 printf("msvpvf by Paper\nusage: %s (-i/--input) infile [(-o/--output) outfile] (-v/--version) version (-t/--type) [vf, veg]\n", argv[0]); |
98 return 0; | 65 return 0; |
146 } | 113 } |
147 fflush(stdout); | 114 fflush(stdout); |
148 if (strcmp(args.output, " ") == 0) { /* string manipulation hell */ | 115 if (strcmp(args.output, " ") == 0) { /* string manipulation hell */ |
149 char* temp = (char*)calloc(256, sizeof(char)); | 116 char* temp = (char*)calloc(256, sizeof(char)); |
150 temp[0] = '\0'; | 117 temp[0] = '\0'; |
151 char str_version[16]; | 118 char str_version[4]; |
152 sprintf(str_version, "V%d", args.version); | 119 sprintf(str_version, "V%d", args.version); |
153 strncat(temp, str_version, 2); | 120 strncat(temp, str_version, 4); |
154 strncat(temp, "_", 1); | 121 strncat(temp, "_", 2); |
155 strncat(temp, basename(args.input), 248); | 122 strncat(temp, basename(args.input), 248); |
156 strcpy(temp, strremove(temp, strrchr(basename(args.input), ('.')))); /* remove file extension */ | 123 strcpy(temp, strremove(temp, strrchr(basename(args.input), ('.')))); /* remove file extension */ |
157 strncat(temp, ".", 1); | 124 strncat(temp, ".", 2); |
158 strncat(temp, args.type, 3); | 125 strncat(temp, args.type, 4); |
159 strncpy(args.output, temp, 255); | 126 strncpy(args.output, temp, 255); |
160 free(temp); | 127 free(temp); |
161 } | 128 } |
162 if (strcmp(args.type, "veg") == 0) { | 129 if (strcmp(args.type, "veg") == 0) { |
163 const unsigned char T[] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A}; | 130 const unsigned char T[] = {0xEF, 0x29, 0xC4, 0x46, 0x4A, 0x90, 0xD2, 0x11, 0x87, 0x22, 0x00, 0xC0, 0x4F, 0x8E, 0xDB, 0x8A}; |