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



Reply via email to