[ros-diffs] [fireball] 31352: - Implement bin-files creation (as opposed to inlining resource data, which is incompatible with MSVC). Result matches 1:1 with mc.exe output on the same input file. - This patch was submitted to Wine, but it needs to be reworked.

fireball at svn.reactos.org fireball at svn.reactos.org
Thu Dec 20 14:11:31 CET 2007


Author: fireball
Date: Thu Dec 20 16:11:30 2007
New Revision: 31352

URL: http://svn.reactos.org/svn/reactos?rev=31352&view=rev
Log:
- Implement bin-files creation (as opposed to inlining resource data, which is incompatible with MSVC). Result matches 1:1 with mc.exe output on the same input file.
- This patch was submitted to Wine, but it needs to be reworked.

Modified:
    trunk/reactos/tools/wmc/utils.c
    trunk/reactos/tools/wmc/utils.h
    trunk/reactos/tools/wmc/wmc.c
    trunk/reactos/tools/wmc/write.c
    trunk/reactos/tools/wmc/write.h

Modified: trunk/reactos/tools/wmc/utils.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/wmc/utils.c?rev=31352&r1=31351&r2=31352&view=diff
==============================================================================
--- trunk/reactos/tools/wmc/utils.c (original)
+++ trunk/reactos/tools/wmc/utils.c Thu Dec 20 16:11:30 2007
@@ -131,6 +131,20 @@
 		base[namelen - extlen] = '\0';
 	}
 	return base;
+}
+
+void get_rcbasedir(char *basedir, const char *name)
+{
+	char *slash;
+	slash = strrchr(name, '/');
+
+	if (!slash)
+		slash = strrchr(name, '\\');
+
+	basedir[0] = 0;
+
+	strncpy(basedir, name, slash - name + 1);
+	basedir[slash-name + 1] = '\0';
 }
 
 void *xmalloc(size_t size)

Modified: trunk/reactos/tools/wmc/utils.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/wmc/utils.h?rev=31352&r1=31351&r2=31352&view=diff
==============================================================================
--- trunk/reactos/tools/wmc/utils.h (original)
+++ trunk/reactos/tools/wmc/utils.h Thu Dec 20 16:11:30 2007
@@ -41,6 +41,7 @@
 void warning(const char *s, ...) __attribute__((format (printf, 1, 2)));
 
 char *dup_basename(const char *name, const char *ext);
+void get_rcbasedir(char *basedir, const char *name);
 
 WCHAR *xunistrdup(const WCHAR * str);
 WCHAR *unistrcpy(WCHAR *dst, const WCHAR *src);

Modified: trunk/reactos/tools/wmc/wmc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/wmc/wmc.c?rev=31352&r1=31351&r2=31352&view=diff
==============================================================================
--- trunk/reactos/tools/wmc/wmc.c (original)
+++ trunk/reactos/tools/wmc/wmc.c Thu Dec 20 16:11:30 2007
@@ -138,6 +138,7 @@
 	int ret;
 	int i;
 	int cmdlen;
+	char rcbasedir[MAX_PATH];
 
 	atexit( cleanup_files );
 	signal(SIGSEGV, segvhandler);
@@ -265,6 +266,8 @@
 		strcat(header_name, ".h");
 	}
 
+	get_rcbasedir(rcbasedir, output_name);
+
 	if(input_name)
 	{
 		if(!(yyin = fopen(input_name, "rb")))
@@ -287,7 +290,7 @@
 	write_h_file(header_name);
 	write_rc_file(output_name);
 	if(!rcinline)
-		write_bin_files();
+		write_bin_files(rcbasedir);
 	output_name = NULL;
 	header_name = NULL;
 	return 0;

Modified: trunk/reactos/tools/wmc/write.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/wmc/write.c?rev=31352&r1=31351&r2=31352&view=diff
==============================================================================
--- trunk/reactos/tools/wmc/write.c (original)
+++ trunk/reactos/tools/wmc/write.c Thu Dec 20 16:11:30 2007
@@ -509,7 +509,110 @@
 	fclose(fp);
 }
 
-void write_bin_files(void)
-{
-	assert(rcinline == 0);
-}
+static void write_bin_file(const char *fname, lan_blk_t *lbp)
+{
+	FILE *fp;
+	unsigned int offs;
+	unsigned short buf;
+	int i, j, k;
+
+	fp = fopen(fname, "wb");
+
+	fwrite(&lbp->nblk, sizeof(int), 1, fp);
+
+	offs = 4 * (lbp->nblk * 3 + 1);
+	for(i = 0; i < lbp->nblk; i++)
+	{
+		fwrite(&lbp->blks[i].idlo, sizeof(unsigned), 2, fp);
+		fwrite(&offs, sizeof(int), 1, fp);
+
+		offs += lbp->blks[i].size;
+	}
+
+	for(i = 0; i < lbp->nblk; i++)
+	{
+		block_t *blk = &lbp->blks[i];
+		for(j = 0; j < blk->nmsg; j++)
+		{
+			char *cptr;
+			int len = blk->msgs[j]->len;
+			short aligned_size = (unicodeout ? (len*2+3)&~3 : (len+3)&~3) + 4;
+
+			fwrite(&aligned_size, sizeof(short), 1, fp);
+
+			buf = unicodeout ? 1 : 0;
+			fwrite(&buf, sizeof(buf), 1, fp);
+
+			// no need to count these 4 bytes when calculating alignment
+			aligned_size -= 4;
+
+			if (unicodeout)
+			{
+				fwrite(blk->msgs[j]->msg, sizeof(WCHAR), len, fp);
+
+				// fill with nulls so it matches aligned_len
+				for (k=0; k<(aligned_size-(len*sizeof(WCHAR))); k++)
+					fputc(0, fp);
+			}
+			else
+			{
+				WCHAR *uc;
+				char *tmp;
+				int mlen, len;
+				const union cptable *cpdef = find_codepage(blk->msgs[j]->cp);
+				uc = blk->msgs[j]->msg;
+
+				assert(cpdef != NULL);
+				mlen = wine_cp_wcstombs(cpdef, 0, uc, unistrlen(uc)+1, NULL, 0, NULL, NULL);
+				tmp = xmalloc(mlen);
+				if((i = wine_cp_wcstombs(cpdef, 0, uc, unistrlen(uc)+1, tmp, mlen, NULL, NULL)) < 0)
+					internal_error(__FILE__, __LINE__, "Buffer overflow? code %d\n", i);
+
+				len = strlen(tmp);
+				fwrite(tmp, sizeof(char), len, fp);
+
+				// fill with nulls so it matches aligned_len
+				for (k=0; k<(aligned_size-len); k++)
+					fputc(0, fp);
+
+				free(tmp);
+			}
+
+			free(cptr);
+		}
+	}
+
+	fclose(fp);
+}
+
+void write_bin_files(const char *basedir)
+{
+	lan_blk_t *lbp;
+	token_t *ttab;
+	char fname[MAX_PATH];
+	int ntab;
+	int i;
+
+	get_tokentable(&ttab, &ntab);
+
+	for(lbp = lanblockhead; lbp; lbp = lbp->next)
+	{
+		char *cptr = NULL;
+		for(i = 0; i < ntab; i++)
+		{
+			if(ttab[i].type == tok_language && ttab[i].token == lbp->lan)
+			{
+				if(ttab[i].alias)
+					cptr = dup_u2c(WMC_DEFAULT_CODEPAGE, ttab[i].alias);
+				break;
+			}
+		}
+		if(!cptr)
+			internal_error(__FILE__, __LINE__, "Filename vanished for language 0x%0x\n", lbp->lan);
+
+		sprintf(fname, "%s%s.bin", basedir, cptr);
+		write_bin_file(fname, lbp);
+
+		free(cptr);
+	}
+}

Modified: trunk/reactos/tools/wmc/write.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/wmc/write.h?rev=31352&r1=31351&r2=31352&view=diff
==============================================================================
--- trunk/reactos/tools/wmc/write.h (original)
+++ trunk/reactos/tools/wmc/write.h Thu Dec 20 16:11:30 2007
@@ -22,6 +22,6 @@
 
 void write_h_file(const char *fname);
 void write_rc_file(const char *fname);
-void write_bin_files(void);
+void write_bin_files(const char *basedir);
 
 #endif




More information about the Ros-diffs mailing list