This is winerc, the resource compiler for the Wine project. It takes the
same input as rc.exe, but generates C files as output. These C files can
be linked together with the application, which can access the resource
data directly instead of using FindResource/LoadResource/LockResource.
The generated C code contains arrays, which represent the resource as if
it was obtained from LoadResource. A table to map resource names to
pointers is also available.
Primary applications are the resources of sysres.dll and a future
commdlg.dll, but the use in the library version is possible as well.
The expected advantage of using winerc over sysres.dll is a speed
improvement, however, actual data to support that claim are not
available. The use of winerc might also simplify the source code. For
example, the system menu is managed in the function CopySysMenu
(controls/menu.c). A winerc-based implementation would just call
	return LoadMenuIndirect(_Sysres_SYSMENU);
As the resources are already in the Wine image, they are loaded on
demand as any other part of a Unix executable image. 

Current State
This is the first release of winerc. It is alpha software, as the rest
of Wine is. If you use it for replacing sysres.dll, or if you write
other parts of Wine which require resource (like commdlg), you will
probably notice a loss in stability. This is especially true for cursor
and icon resources, as they are unlikely to work at all. See the TODO
file for details.

Copying
The license for Wine applies for winerc as well. Read the files LICENSE
and WARRANTY in the current or any future distribution for details. You
can change any source files, and you can add your own copyright notice,
as long as you leave the existing copyrights intact.

Bug Reports and Fixes
If you find a bug in winerc, you can report it to me,
martin@cs.csufresno.edu (Martin von Loewis) or to
comp.emulators.ms-windows.wine. If you can fix the bug, send the diffs
and ChangeLog entry to julliard@lrc.epfl.ch (Alexandre Julliard).
