/* | |
--------------------------------------------------------------------------- | |
Copyright (c) 1998-2007, Brian Gladman, Worcester, UK. All rights reserved. | |
LICENSE TERMS | |
The free distribution and use of this software is allowed (with or without | |
changes) provided that: | |
1. source code distributions include the above copyright notice, this | |
list of conditions and the following disclaimer; | |
2. binary distributions include the above copyright notice, this list | |
of conditions and the following disclaimer in their documentation; | |
3. the name of the copyright holder is not used to endorse products | |
built using this software without specific written permission. | |
DISCLAIMER | |
This software is provided 'as is' with no explicit or implied warranties | |
in respect of its properties, including, but not limited to, correctness | |
and/or fitness for purpose. | |
--------------------------------------------------------------------------- | |
This program converts Visual Studio 2008 C/C++ version 9 build projects | |
into build projects for Visual Studio 2005 C/C++ version 8. It will | |
also convert files that have been converted in this way back into their | |
original form. It does this conversion by looking for *.vcproj files | |
in the current working directory and its sub-directories and changing | |
the following line in each of them: | |
Version="9.00" | |
to: | |
Version="8.00" | |
or vice versa. | |
It is used by compiling it, placing it in a root build directory and | |
running it from there. It acts recursively on all sub-directories of | |
this directory it is important not to run it at a directory level in | |
which not all projects are to be converted. | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <io.h> | |
void process_file(char *fn) | |
{ FILE *f; | |
fpos_t pos; | |
char iobuf[1024], *p; | |
if((f = fopen(fn, "r+")) == 0) /* open for read and write */ | |
{ | |
printf("File open error on: %s\n", fn); return; | |
} | |
for( ; ; ) | |
{ | |
if(feof(f)) /* version line not found */ | |
break; | |
if(fgetpos(f, &pos)) /* save position of line */ | |
{ | |
printf("File getpos error on: %s\n", fn); break; | |
} | |
if(!fgets(iobuf, 1024, f)) /* read the line in */ | |
{ | |
printf("File read error on: %s\n", fn); break; | |
} | |
if(p = strchr(iobuf, 'V')) /* look for 'version' line */ | |
{ | |
if(!strncmp(p, "Version=\"8.00\"", 14) | |
|| !strncmp(p, "Version=\"9.00\"", 14)) | |
{ | |
*(p + 9) ^= 1; /* switch versions */ | |
/* reset back to start of line in the file and */ | |
/* write the changed line to the file */ | |
if(fsetpos(f, &pos)) | |
printf("File setpos error on: %s\n", fn); | |
else if(fputs(iobuf, f) == EOF) | |
printf("File write error on: %s\n", fn); | |
break; /* this file is now fixed */ | |
} | |
} | |
} | |
fclose(f); | |
} | |
void find_vcproj_files(char *dir) | |
{ struct _finddata_t cfile; | |
intptr_t hfile; | |
char nbuf[_MAX_PATH], *p; | |
strcpy(nbuf, dir); /* find directories and files */ | |
strcat(nbuf, "\\*.*"); | |
if((hfile = _findfirst( nbuf, &cfile )) == -1L ) | |
return; /* if directory is empty */ | |
do | |
{ | |
strcpy(nbuf, dir); /* compile path to the current */ | |
strcat(nbuf, "\\"); /* file or directory */ | |
strcat(nbuf, cfile.name); | |
if((cfile.attrib & _A_SUBDIR) == _A_SUBDIR) | |
{ /* if it is a sub-direcory */ | |
if(strcmp(cfile.name, ".") && strcmp(cfile.name, "..")) | |
find_vcproj_files(nbuf); /* recursive search */ | |
} | |
else if((cfile.attrib & 0x1f) == _A_NORMAL && (p = strrchr(cfile.name, '.')) | |
&& !strcmp(p, ".vcproj")) | |
process_file(nbuf); /* if it is a *.vcproj file */ | |
} | |
while | |
( _findnext( hfile, &cfile ) == 0 ); | |
_findclose( hfile ); | |
} | |
int main(void) | |
{ char *dir; | |
if(!(dir = _getcwd( NULL, 0 ))) | |
printf("Cannot obtain current working directory\n"); | |
else | |
find_vcproj_files(dir); | |
} |