fixing OutputFile in *.vcproj files
[reactos.git] / reactos / tools / rbuild / filesupportcode.cpp
1 /*
2 * Copyright (C) 2005 Casper S. Hornstrup
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18 #include "pch.h"
19 #include <assert.h>
20
21 #include "rbuild.h"
22
23 using std::string;
24
25 /* static */ void
26 FileSupportCode::WriteIfChanged ( char* outbuf,
27 string filename )
28 {
29 FILE* out;
30 unsigned int end;
31 char* cmpbuf;
32 unsigned int stat;
33
34 out = fopen ( filename.c_str (), "rb" );
35 if ( out == NULL )
36 {
37 out = fopen ( filename.c_str (), "wb" );
38 if ( out == NULL )
39 throw AccessDeniedException ( filename );
40 fputs ( outbuf, out );
41 fclose ( out );
42 return;
43 }
44
45 fseek ( out, 0, SEEK_END );
46 end = ftell ( out );
47 cmpbuf = (char*) malloc ( end );
48 if ( cmpbuf == NULL )
49 {
50 fclose ( out );
51 throw OutOfMemoryException ();
52 }
53
54 fseek ( out, 0, SEEK_SET );
55 stat = fread ( cmpbuf, 1, end, out );
56 if ( stat != end )
57 {
58 free ( cmpbuf );
59 fclose ( out );
60 throw AccessDeniedException ( filename );
61 }
62 if ( end == strlen ( outbuf ) && memcmp ( cmpbuf, outbuf, end ) == 0 )
63 {
64 free ( cmpbuf );
65 fclose ( out );
66 return;
67 }
68
69 free ( cmpbuf );
70 fclose ( out );
71 out = fopen ( filename.c_str (), "wb" );
72 if ( out == NULL )
73 {
74 throw AccessDeniedException ( filename );
75 }
76
77 stat = fwrite ( outbuf, 1, strlen ( outbuf ), out);
78 if ( strlen ( outbuf ) != stat )
79 {
80 fclose ( out );
81 throw AccessDeniedException ( filename );
82 }
83
84 fclose ( out );
85 }