#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/*comment the next line to get it working on a non-Intel platform using MSB byte-order*/
#define using_LSB 1


int GetW32AppVers(char *fn,int*a,int*b,int*c,int*d)
{
	#define gw3av_BlockSize2 200000
	unsigned char gw3av_buf[gw3av_BlockSize2+10];
	
	unsigned char searched[]={0x56,0,0x53,0,0x5F,0,0x56,0,0x45,0,0x52,0,0x53,0,0x49,0,0x4f,0,0x4e,0,0x5f,0,0x49,0,0x4e,0,0x46,0,0x4f,0,0,0};
	int sl=32;

	FILE *f;
	int bp2;
	unsigned char * bufread;
	int iRead;
	
	f=fopen(fn,"rb");
	if(!f)return 1;/*unable to open for read
ing*/
	
	memset(gw3av_buf,0,gw3av_BlockSize2);

	bp2=gw3av_BlockSize2/2;

	bufread=gw3av_buf+bp2;

	while(!feof(f))
	{
		int iRead=fread(bufread,1,bp2,f);
		if(ferror(f))return 3;/*read error
*/
		if(!iRead)break;
		{
			unsigned char *sbuf=gw3av_buf;/*search from begin
*/
			while(sbuf<=bufread+iRead-48)
			{
				if(!memcmp(sbuf,searched,sl)) /*found
*/
				{
					*a=0;
					*b=0;
					*c=0;
					*d=0;
					sbuf+=50;
#ifdef using_LSB
					memcpy(b,sbuf  ,2);
					memcpy(a,sbuf+2,2);
					memcpy(d,sbuf+4,2);
					memcpy(c,sbuf+6,2);
#else
					swab(sbuf  ,2+(void*)b,2);
					swab(sbuf+2,2+(void*)a,2);
					swab(sbuf+4,2+(void*)d,2);
					swab(sbuf+6,2+(void*)c,2);
#endif
					fclose(f);
					return 0;
				}
				sbuf++;
			}
		}
		memmove(gw3av_buf,bufread,bp2);
	}

	fclose(f);
	return 2; /*not found
*/
}


char *pn,*fn;
void usage()
{
	printf("usage: %s file\n",pn);
	exit(2);
}
char* errs[]={"","can't open file for read","not versioned","read error"}
;
void main(int argc, char* argv[])
{
	int a,b,c,d;
	int err;
	pn=argv[0];
	if(argc!=2)usage();
	fn=argv[1];

	err=GetW32AppVers(fn,&a,&b,&c,&d);
	
	if(!err)
	{
		printf("%s: %d.%d.%d.%d\n",fn,a,b,c,d);
	}
	else
	{
		printf("err: %d(%s)\n",err,errs[err]);
	}
}
