Added -dll option for winelib programs. (Note: will not print warnings

on failure currently).
This commit is contained in:
Marcus Meissner 1999-03-22 14:54:05 +00:00 committed by Alexandre Julliard
parent e49700acf9
commit 461ded42ac
5 changed files with 78 additions and 24 deletions

View File

@ -351,15 +351,20 @@ void BUILTIN_DefaultIntHandler( CONTEXT *context )
*
* Set runtime DLL usage flags
*/
BOOL BUILTIN_ParseDLLOptions( const char *str )
BOOL BUILTIN_ParseDLLOptions( char *str )
{
BUILTIN16_DLL *dll;
const char *p;
char *p,*last;
last = str;
while (*str)
{
while (*str && isspace(*str)) str++;
if (!*str) return TRUE;
while (*str && (*str==',' || isspace(*str))) str++;
if (!*str) {
*last = '\0'; /* cut off garbage at end at */
return TRUE;
}
if ((*str != '+') && (*str != '-')) return FALSE;
str++;
if (!(p = strchr( str, ',' ))) p = str + strlen(str);
@ -380,11 +385,22 @@ BOOL BUILTIN_ParseDLLOptions( const char *str )
break;
}
}
if (!dll->descr)
if (!BUILTIN32_EnableDLL( str, (int)(p - str), (str[-1] == '+') ))
return FALSE;
if (!dll->descr) {
/* not found, but could get handled by BUILTIN32_, so move last */
last = p;
str = p;
while (*str && (isspace(*str) || (*str == ','))) str++;
} else {
/* handled. cut out the "[+-]DLL," string, so it isn't handled
* by BUILTIN32
*/
if (*p) {
memcpy(last,p,strlen(p)+1);
str = last;
} else {
*last = '\0';
break;
}
}
}
return TRUE;
}

View File

@ -199,11 +199,12 @@ HGLOBAL16 NE_LoadPEResource( NE_MODULE *pModule, WORD type, LPVOID bits, DWORD s
extern BOOL BUILTIN_Init(void);
extern HMODULE16 BUILTIN_LoadModule( LPCSTR name, BOOL force );
extern LPCSTR BUILTIN_GetEntryPoint16( WORD cs, WORD ip, WORD *pOrd );
extern BOOL BUILTIN_ParseDLLOptions( const char *str );
extern BOOL BUILTIN_ParseDLLOptions( char *str );
extern void BUILTIN_PrintDLLs(void);
/* relay32/builtin.c */
extern HMODULE BUILTIN32_LoadImage( LPCSTR name, OFSTRUCT *ofs, BOOL force );
extern BOOL BUILTIN32_ParseDLLOptions( char *str );
/* if1632/builtin.c */
extern HMODULE16 (*fnBUILTIN_LoadModule)(LPCSTR name, BOOL force);

View File

@ -34,6 +34,7 @@
#include "debug.h"
#include "debugdefs.h"
#include "xmalloc.h"
#include "module.h"
#include "version.h"
#include "winnls.h"
#include "console.h"
@ -816,6 +817,10 @@ BOOL MAIN_WineInit( int *argc, char *argv[] )
#endif /* !defined(X_DISPLAY_MISSING) */
MONITOR_Initialize(&MONITOR_PrimaryMonitor);
if (Options.dllFlags)
BUILTIN32_ParseDLLOptions( Options.dllFlags );
/* if (__winelib && errors ) print_error_message_like_misc_main(); */
atexit(called_at_exit);
return TRUE;
}

View File

@ -140,8 +140,8 @@ int main( int argc, char *argv[] )
/* Handle -dll option (hack) */
if (Options.dllFlags)
{
if (!BUILTIN_ParseDLLOptions( Options.dllFlags ))
{
/* If there are options left, or if the parser had errors, report it */
if (!BUILTIN_ParseDLLOptions( Options.dllFlags )||Options.dllFlags[0]) {
MSG("%s: Syntax: -dll +xxx,... or -dll -xxx,...\n",
argv[0] );
BUILTIN_PrintDLLs();

View File

@ -435,27 +435,59 @@ void BUILTIN32_Unimplemented( const BUILTIN32_DESCRIPTOR *descr, int ordinal )
ExitProcess(1);
}
/***********************************************************************
* BUILTIN32_EnableDLL
* BUILTIN32_ParseDLLOptions
*
* Enable or disable a built-in DLL.
* Set runtime DLL usage flags
*/
int BUILTIN32_EnableDLL( const char *name, int len, int enable )
BOOL BUILTIN32_ParseDLLOptions( char *str )
{
int i;
BUILTIN32_DLL *dll;
char *p,*last;
for (i = 0, dll = BuiltinDLLs; dll->descr; dll++)
last = str;
while (*str)
{
if (!lstrncmpiA( name, dll->descr->name, len ))
{
dll->used = enable;
while (*str && (*str==',' || isspace(*str))) str++;
if (!*str) {
*last = '\0'; /* cut off garbage at end at */
return TRUE;
}
if ((*str != '+') && (*str != '-')) return FALSE;
str++;
if (!(p = strchr( str, ',' ))) p = str + strlen(str);
while ((p > str) && isspace(p[-1])) p--;
if (p == str) return FALSE;
for (dll = BuiltinDLLs; dll->descr; dll++)
{
if (!lstrncmpiA( dll->descr->name, str, (int)(p-str) ))
{
if (dll->descr->name[p-str]) /* partial match - skip */
continue;
dll->used = (str[-1]!='-');
break;
}
return FALSE;
}
if (!dll->descr) {
/* not found, but could get handled by BUILTIN_, so move last */
last = p;
str = p;
} else {
/* handled. cut out the "[+-]DLL," string, so it isn't handled
* by BUILTIN
*/
if (*p) {
memcpy(last,p,strlen(p)+1);
str = last;
} else {
*last = '\0';
break;
}
}
}
return TRUE;
}
/***********************************************************************