> > The problem is that if I say that the memory directory doesn't
> > "belong" to dlls/user/user.spec winapi_{check,extract,fixup} will
> > not find implementations for all functions, which will cause
> > problems.
> >
> > For example how should winapi_extract know that I should
> generate the line
> > 471 pascal16 lstrcmpi(str str) lstrcmpiA
> > when it generates the spec files?
>
> Well, it's a more general problem, namely that the spec files can
> reference functions that are not implemented directly in the dll.
>
> You also have for instance:
>
> @ cdecl strcpy(ptr str) strcpy
>
> in MSVCRT, and strcpy is clearly not implemented there since it's in
> the C library. So you cannot assume that only the functions contained
> in the dll can be used in the spec files, it is legal for the spec
> file to reference external functions.
True. I didn't even thought of that particular problem. Functions like
strcpy is currently suppressed by having it listed in
tools/winapi_check/nativeapi.dat, but that is a little kludgy.
[Thinking...]
Well you could simply have an function
documentation comment without a function implementation in
some file that belongs to MSVCRT.
Like:
/***********************************************************************
* strcpy (MSVCRT.@)
*/
#if 0 /* Suppress warnings */
extern char *strcpy(char *dest, const char *src);
#endif
Perhaps we could do the same with atom functions and lstrcmpi?
The #if 0 #endif isn't even needed for them I believe.
> > I think that we need to move the solution of this problem one step
> > up the "ladder" and discuss the more general problem:
> > How should we store the information needed to generate
> > the spec files in the source, especially concerning
> > the forwards and stubs?
>
> You'll need a file somewhere that specifies all the entries that
> cannot be determined automatically from the source. You simply cannot
> build a 100% correct spec file based only on the function comments.
Yes. I have some ideas, but no really good one. My currently
best suggestion is having a .spec.in file that approximately
looks like the .spec files but supports configure like substitutions.
foo.spec.in:
---8<---
name foo
type win32
init @init@
rsrc foo.res
import baz.dll
@debug_channels@
101 forward Bar BAZ.Bar
102 stub BarFoo
@fixed@
@ forward Foo BAZ.Foo
@ stub FooBar
@unfixed@
---8<---
And simply let winapi_extract or whatever simple substitute
@init@, @debug_channels@, @fixed@ and @unfixed@ with what can
be extracted from the source.
> And you definitely do not want to need to parse KERNEL source files
> (like the ones in memory/) to build the USER spec file.
Of course. The question was whether the memory directory belongs
to USER or not. I have now accepted that it does not.