Eric Pouech wrote:
Moving atom implementation to: - dlls/kernel32/atom16.c for the 16 bit part - dlls/ntdll/ntdll.c for the 32 bit part
A+
------------------------------------------------------------------------
Name: ntkrnl_52 ChangeLog: - moved 16 bit atom support in (16bit) dlls/kernel/atom16.c - added atom support to NTDLL - made 32 bit atom support in kernel32 call ntdll's brand new one - copied the atom tests for global atom so that we can test local atoms too License: X11 GenDate: 2004/12/11 12:59:19 UTC ModifiedFiles: dlls/kernel/Makefile.in dlls/kernel/atom.c dlls/kernel/tests/atom.c dlls/ntdll/Makefile.in dlls/ntdll/ntdll.spec include/winternl.h server/protocol.def server/atom.c AddedFiles: dlls/kernel/atom16.c dlls/ntdll/atom.c
...
--- /dev/null 1970-01-01 01:00:00.000000000 +0100 +++ dlls/ntdll/atom.c 2004-12-04 15:31:03.000000000 +0100 @@ -0,0 +1,331 @@ +/* + * Atom table functions + * + * Copyright 1993, 1994, 1995 Alexandre Julliard + * Copyright 2004 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include <stdlib.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> + +#include "windef.h" +#include "winbase.h" +#include "ntstatus.h" + +#include "wine/server.h" +#include "wine/unicode.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(atom); + +#define DEFAULT_ATOMTABLE_SIZE 37 +#define MAX_ATOM_LEN 255 + +/****************************************************************** + * is_integral_atom + * Returns STATUS_SUCCESS if integral atom and 'pAtom' is filled + * STATUS_INVALID_PARAMETER if 'atomstr' is too long + * STATUS_MORE_ENTRIES otherwise + */ +static NTSTATUS is_integral_atom( LPCWSTR atomstr, ATOM* pAtom ) +{ + ATOM atom; + + if (HIWORD( atomstr )) + { + const WCHAR* ptr = atomstr; + if (*ptr++ == '#') + { + atom = 0; + while (*ptr >= '0' && *ptr <= '9') + { + atom = atom * 10 + *ptr++ - '0'; + } + if (ptr > atomstr + 1 && !*ptr) goto done; + } + if (strlenW( atomstr ) > MAX_ATOM_LEN) return STATUS_INVALID_PARAMETER; + return STATUS_MORE_ENTRIES; + } + else atom = LOWORD( atomstr ); +done: + if (atom >= MAXINTATOM) return STATUS_INVALID_PARAMETER; + *pAtom = atom; + return STATUS_SUCCESS; +} + +/****************************************************************** + * RtlDeleteAtomFromAtomTable (NTDLL.@) + */ +NTSTATUS WINAPI RtlDeleteAtomFromAtomTable( void* table, ATOM atom ) +{ + NTSTATUS status; + + TRACE( "%p %x\n", table, atom ); + SERVER_START_REQ( delete_atom ) + { + req->atom = atom; + req->table = table; + status = wine_server_call( req ); + } + SERVER_END_REQ; + return status; +}
Rtl* functions should generally avoid doing server calls. You should implement the Rtl* functions on top of the Nt* functions, not the other way around. ...
+/****************************************************************** + * NtDeleteAtom (NTDLL.@) + */ +NTSTATUS WINAPI NtDeleteAtom(ATOM atom) +{ + return RtlDeleteAtomFromAtomTable( GLOBAL_ATOM_TABLE, atom ); +}
Rob