]> de.git.xonotic.org Git - xonotic/darkplaces.git/blob - buildnum/buildnum.c
qsockets are now dynamically allocated/freed, this drops memory use by about 2mb
[xonotic/darkplaces.git] / buildnum / buildnum.c
1
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5
6 // LordHavoc: wait for a key press so the window doesn't disappear immediately
7 #if _DEBUG && WIN32
8 #define ERROR fprintf(stderr, "press any key\n");getchar();return -1;
9 #else
10 #define ERROR return -1;
11 #endif
12
13 // version template:
14 #define BUILDNUMBER 1
15
16 int main(int argc, char **argv)
17 {
18         FILE *file;
19         unsigned int insize, outsize, sizedifference, inbuildsize, outbuildsize, writtensize;
20         unsigned char *data, *in, *out, *buildstring, *endofbuildstring, outbuildstring[32];
21         int inbuildnumber, outbuildnumber, remainder;
22         if (argc != 2)
23         {
24                 fprintf(stderr, "usage: buildnum <filename.c or .h>\npurpose: increments build number in version string for darkplaces engine\n");
25                 ERROR
26         }
27
28         file = fopen(argv[1], "rb");
29         if (!file)
30         {
31                 fprintf(stderr, "buildnum: unable to open file \"%s\" for reading\n", argv[1]);
32                 ERROR
33         }
34
35         fseek(file, 0, SEEK_END);
36         insize = ftell(file);
37         data = calloc(1, insize+20);
38         fseek(file, 0, SEEK_SET);
39         if (fread(data, 1, insize, file) < insize)
40         {
41                 fprintf(stderr, "buildnum: unable to read file \"%s\"\n", argv[1]);
42                 ERROR
43         }
44         fclose(file);
45         buildstring = strstr(data, "#define BUILDNUMBER ");
46         if (!buildstring)
47         {
48                 fprintf(stderr, "buildnum: unable to find \"#define BUILDNUMBER \"\n");
49                 ERROR
50         }
51         buildstring += strlen("#define BUILDNUMBER ");
52         endofbuildstring = buildstring;
53         while (*endofbuildstring && *endofbuildstring != '\r' && *endofbuildstring != '\n')
54                 endofbuildstring++;
55         inbuildnumber = atoi(buildstring);
56         outbuildnumber = inbuildnumber + 1;
57         printf("incrementing build number %d to %d\n", inbuildnumber, outbuildnumber);
58         sprintf(outbuildstring, "%d", outbuildnumber);
59         inbuildsize = endofbuildstring - buildstring;
60         outbuildsize = strlen(outbuildstring);
61         sizedifference = outbuildsize-inbuildsize;
62         remainder = (data + insize) - buildstring;
63         outsize = insize + sizedifference;
64         memmove(buildstring + sizedifference, buildstring, remainder);
65         in = outbuildstring;
66         out = buildstring;
67         while (*in)
68                 *out++ = *in++;
69
70         file = fopen(argv[1], "wb");
71         if (!file)
72         {
73                 fprintf(stderr, "buildnum: unable to open file \"%s\" for writing\n", argv[1]);
74                 ERROR
75         }
76
77         writtensize = fwrite(data, 1, outsize, file);
78         fclose(file);
79         if (writtensize < outsize)
80         {
81                 fprintf(stderr, "buildnum: error writing file \"%s\", emergency code trying to save to buildnum.dmp\n", argv[1]);
82                 file = fopen("buildnum.dmp", "wb");
83                 if (!file)
84                 {
85                         fprintf(stderr, "buildnum: unable to open file for writing\n");
86                         ERROR
87                 }
88
89                 writtensize = fwrite(data, 1, outsize, file);
90                 fclose(file);
91                 if (writtensize < outsize)
92                 {
93                         fprintf(stderr, "buildnum: error writing emergency dump file!\n");
94                         ERROR
95                 }
96         }
97
98         return 0;
99 }
100