Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
78d096c1
Commit
78d096c1
authored
Feb 03, 2005
by
Eric Pouech
Committed by
Alexandre Julliard
Feb 03, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Moved 16 bit atom support to dlls/kernel/atom16.c.
parent
6dba0a77
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
359 additions
and
283 deletions
+359
-283
Makefile.in
dlls/kernel/Makefile.in
+1
-0
atom.c
dlls/kernel/atom.c
+1
-283
atom16.c
dlls/kernel/atom16.c
+357
-0
No files found.
dlls/kernel/Makefile.in
View file @
78d096c1
...
...
@@ -75,6 +75,7 @@ C_SRCS = \
wowthunk.c
C_SRCS16
=
\
atom16.c
\
error16.c
\
registry16.c
...
...
dlls/kernel/atom.c
View file @
78d096c1
...
...
@@ -40,79 +40,13 @@
#include "wine/server.h"
#include "wine/unicode.h"
#include "wine/winbase16.h"
#include "kernel_private.h"
#include "stackframe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
atom
);
#define DEFAULT_ATOMTABLE_SIZE 37
#define MAX_ATOM_LEN 255
#define ATOMTOHANDLE(atom) ((HANDLE16)(atom) << 2)
#define HANDLETOATOM(handle) ((ATOM)(0xc000 | ((handle) >> 2)))
typedef
struct
{
HANDLE16
next
;
WORD
refCount
;
BYTE
length
;
BYTE
str
[
1
];
}
ATOMENTRY
;
typedef
struct
{
WORD
size
;
HANDLE16
entries
[
1
];
}
ATOMTABLE
;
/***********************************************************************
* ATOM_GetTable
*
* Return a pointer to the atom table of a given segment, creating
* it if necessary.
*
* RETURNS
* Pointer to table: Success
* NULL: Failure
*/
static
ATOMTABLE
*
ATOM_GetTable
(
BOOL
create
/* [in] Create */
)
{
INSTANCEDATA
*
ptr
=
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
0
)
);
if
(
ptr
->
atomtable
)
{
ATOMTABLE
*
table
=
(
ATOMTABLE
*
)((
char
*
)
ptr
+
ptr
->
atomtable
);
if
(
table
->
size
)
return
table
;
}
if
(
!
create
)
return
NULL
;
if
(
!
InitAtomTable16
(
0
))
return
NULL
;
/* Reload ptr in case it moved in linear memory */
ptr
=
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
0
)
);
return
(
ATOMTABLE
*
)((
char
*
)
ptr
+
ptr
->
atomtable
);
}
/***********************************************************************
* ATOM_Hash
* RETURNS
* The hash value for the input string
*/
static
WORD
ATOM_Hash
(
WORD
entries
,
/* [in] Total number of entries */
LPCSTR
str
,
/* [in] Pointer to string to hash */
WORD
len
/* [in] Length of string */
)
{
WORD
i
,
hash
=
0
;
TRACE
(
"%x, %s, %x
\n
"
,
entries
,
str
,
len
);
for
(
i
=
0
;
i
<
len
;
i
++
)
hash
^=
toupper
(
str
[
i
])
+
i
;
return
hash
%
entries
;
}
#define MAX_ATOM_LEN 255
/***********************************************************************
* ATOM_IsIntAtomA
...
...
@@ -169,222 +103,6 @@ static BOOL ATOM_IsIntAtomW(LPCWSTR atomstr,WORD *atomid)
/***********************************************************************
* ATOM_MakePtr
*
* Make an ATOMENTRY pointer from a handle (obtained from GetAtomHandle()).
*/
static
inline
ATOMENTRY
*
ATOM_MakePtr
(
HANDLE16
handle
/* [in] Handle */
)
{
return
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
handle
)
);
}
/***********************************************************************
* InitAtomTable (KERNEL.68)
*/
WORD
WINAPI
InitAtomTable16
(
WORD
entries
)
{
int
i
;
HANDLE16
handle
;
ATOMTABLE
*
table
;
/* Allocate the table */
if
(
!
entries
)
entries
=
DEFAULT_ATOMTABLE_SIZE
;
/* sanity check */
handle
=
LocalAlloc16
(
LMEM_FIXED
,
sizeof
(
ATOMTABLE
)
+
(
entries
-
1
)
*
sizeof
(
HANDLE16
)
);
if
(
!
handle
)
return
0
;
table
=
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
handle
)
);
table
->
size
=
entries
;
for
(
i
=
0
;
i
<
entries
;
i
++
)
table
->
entries
[
i
]
=
0
;
/* Store a pointer to the table in the instance data */
((
INSTANCEDATA
*
)
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
0
)))
->
atomtable
=
handle
;
return
handle
;
}
/***********************************************************************
* GetAtomHandle (KERNEL.73)
*/
HANDLE16
WINAPI
GetAtomHandle16
(
ATOM
atom
)
{
if
(
atom
<
MAXINTATOM
)
return
0
;
return
ATOMTOHANDLE
(
atom
);
}
/***********************************************************************
* AddAtom (KERNEL.70)
*
* Windows DWORD aligns the atom entry size.
* The remaining unused string space created by the alignment
* gets padded with '\0's in a certain way to ensure
* that at least one trailing '\0' remains.
*
* RETURNS
* Atom: Success
* 0: Failure
*/
ATOM
WINAPI
AddAtom16
(
LPCSTR
str
)
{
char
buffer
[
MAX_ATOM_LEN
+
1
];
WORD
hash
;
HANDLE16
entry
;
ATOMENTRY
*
entryPtr
;
ATOMTABLE
*
table
;
int
len
,
ae_len
;
WORD
iatom
;
if
(
ATOM_IsIntAtomA
(
str
,
&
iatom
))
return
iatom
;
TRACE
(
"%s
\n
"
,
debugstr_a
(
buffer
));
/* Make a copy of the string to be sure it doesn't move in linear memory. */
lstrcpynA
(
buffer
,
str
,
sizeof
(
buffer
)
);
len
=
strlen
(
buffer
);
if
(
!
(
table
=
ATOM_GetTable
(
TRUE
)))
return
0
;
hash
=
ATOM_Hash
(
table
->
size
,
buffer
,
len
);
entry
=
table
->
entries
[
hash
];
while
(
entry
)
{
entryPtr
=
ATOM_MakePtr
(
entry
);
if
((
entryPtr
->
length
==
len
)
&&
(
!
strncasecmp
(
entryPtr
->
str
,
buffer
,
len
)))
{
entryPtr
->
refCount
++
;
TRACE
(
"-- existing 0x%x
\n
"
,
entry
);
return
HANDLETOATOM
(
entry
);
}
entry
=
entryPtr
->
next
;
}
ae_len
=
(
sizeof
(
ATOMENTRY
)
+
len
+
3
)
&
~
3
;
entry
=
LocalAlloc16
(
LMEM_FIXED
,
ae_len
);
if
(
!
entry
)
return
0
;
/* Reload the table ptr in case it moved in linear memory */
table
=
ATOM_GetTable
(
FALSE
);
entryPtr
=
ATOM_MakePtr
(
entry
);
entryPtr
->
next
=
table
->
entries
[
hash
];
entryPtr
->
refCount
=
1
;
entryPtr
->
length
=
len
;
/* Some applications _need_ the '\0' padding provided by this strncpy */
strncpy
(
entryPtr
->
str
,
buffer
,
ae_len
-
sizeof
(
ATOMENTRY
)
+
1
);
entryPtr
->
str
[
ae_len
-
sizeof
(
ATOMENTRY
)]
=
'\0'
;
table
->
entries
[
hash
]
=
entry
;
TRACE
(
"-- new 0x%x
\n
"
,
entry
);
return
HANDLETOATOM
(
entry
);
}
/***********************************************************************
* DeleteAtom (KERNEL.71)
*/
ATOM
WINAPI
DeleteAtom16
(
ATOM
atom
)
{
ATOMENTRY
*
entryPtr
;
ATOMTABLE
*
table
;
HANDLE16
entry
,
*
prevEntry
;
WORD
hash
;
if
(
atom
<
MAXINTATOM
)
return
0
;
/* Integer atom */
TRACE
(
"0x%x
\n
"
,
atom
);
if
(
!
(
table
=
ATOM_GetTable
(
FALSE
)))
return
0
;
entry
=
ATOMTOHANDLE
(
atom
);
entryPtr
=
ATOM_MakePtr
(
entry
);
/* Find previous atom */
hash
=
ATOM_Hash
(
table
->
size
,
entryPtr
->
str
,
entryPtr
->
length
);
prevEntry
=
&
table
->
entries
[
hash
];
while
(
*
prevEntry
&&
*
prevEntry
!=
entry
)
{
ATOMENTRY
*
prevEntryPtr
=
ATOM_MakePtr
(
*
prevEntry
);
prevEntry
=
&
prevEntryPtr
->
next
;
}
if
(
!*
prevEntry
)
return
atom
;
/* Delete atom */
if
(
--
entryPtr
->
refCount
==
0
)
{
*
prevEntry
=
entryPtr
->
next
;
LocalFree16
(
entry
);
}
return
0
;
}
/***********************************************************************
* FindAtom (KERNEL.69)
*/
ATOM
WINAPI
FindAtom16
(
LPCSTR
str
)
{
ATOMTABLE
*
table
;
WORD
hash
,
iatom
;
HANDLE16
entry
;
int
len
;
TRACE
(
"%s
\n
"
,
debugstr_a
(
str
));
if
(
ATOM_IsIntAtomA
(
str
,
&
iatom
))
return
iatom
;
if
((
len
=
strlen
(
str
))
>
255
)
len
=
255
;
if
(
!
(
table
=
ATOM_GetTable
(
FALSE
)))
return
0
;
hash
=
ATOM_Hash
(
table
->
size
,
str
,
len
);
entry
=
table
->
entries
[
hash
];
while
(
entry
)
{
ATOMENTRY
*
entryPtr
=
ATOM_MakePtr
(
entry
);
if
((
entryPtr
->
length
==
len
)
&&
(
!
strncasecmp
(
entryPtr
->
str
,
str
,
len
)))
{
TRACE
(
"-- found %x
\n
"
,
entry
);
return
HANDLETOATOM
(
entry
);
}
entry
=
entryPtr
->
next
;
}
TRACE
(
"-- not found
\n
"
);
return
0
;
}
/***********************************************************************
* GetAtomName (KERNEL.72)
*/
UINT16
WINAPI
GetAtomName16
(
ATOM
atom
,
LPSTR
buffer
,
INT16
count
)
{
ATOMTABLE
*
table
;
ATOMENTRY
*
entryPtr
;
HANDLE16
entry
;
char
*
strPtr
;
INT
len
;
char
text
[
8
];
TRACE
(
"%x
\n
"
,
atom
);
if
(
!
count
)
return
0
;
if
(
atom
<
MAXINTATOM
)
{
sprintf
(
text
,
"#%d"
,
atom
);
len
=
strlen
(
text
);
strPtr
=
text
;
}
else
{
if
(
!
(
table
=
ATOM_GetTable
(
FALSE
)))
return
0
;
entry
=
ATOMTOHANDLE
(
atom
);
entryPtr
=
ATOM_MakePtr
(
entry
);
len
=
entryPtr
->
length
;
strPtr
=
entryPtr
->
str
;
}
if
(
len
>=
count
)
len
=
count
-
1
;
memcpy
(
buffer
,
strPtr
,
len
);
buffer
[
len
]
=
'\0'
;
return
len
;
}
/***********************************************************************
* InitAtomTable (KERNEL32.@)
*
* Initialise the global atom table.
...
...
dlls/kernel/atom16.c
0 → 100644
View file @
78d096c1
/*
* Atom table functions - 16 bit variant
*
* Copyright 1993, 1994, 1995 Alexandre Julliard
*
* 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
*/
/*
* Warning: The code assumes that LocalAlloc() returns a block aligned
* on a 4-bytes boundary (because of the shifting done in
* HANDLETOATOM). If this is not the case, the allocation code will
* have to be changed.
*/
#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 "winerror.h"
#include "wine/server.h"
#include "wine/unicode.h"
#include "wine/winbase16.h"
#include "kernel_private.h"
#include "stackframe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
atom
);
#define DEFAULT_ATOMTABLE_SIZE 37
#define MAX_ATOM_LEN 255
#define ATOMTOHANDLE(atom) ((HANDLE16)(atom) << 2)
#define HANDLETOATOM(handle) ((ATOM)(0xc000 | ((handle) >> 2)))
typedef
struct
{
HANDLE16
next
;
WORD
refCount
;
BYTE
length
;
BYTE
str
[
1
];
}
ATOMENTRY
;
typedef
struct
{
WORD
size
;
HANDLE16
entries
[
1
];
}
ATOMTABLE
;
/***********************************************************************
* ATOM_GetTable
*
* Return a pointer to the atom table of a given segment, creating
* it if necessary.
*
* RETURNS
* Pointer to table: Success
* NULL: Failure
*/
static
ATOMTABLE
*
ATOM_GetTable
(
BOOL
create
/* [in] Create */
)
{
INSTANCEDATA
*
ptr
=
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
0
)
);
if
(
ptr
->
atomtable
)
{
ATOMTABLE
*
table
=
(
ATOMTABLE
*
)((
char
*
)
ptr
+
ptr
->
atomtable
);
if
(
table
->
size
)
return
table
;
}
if
(
!
create
)
return
NULL
;
if
(
!
InitAtomTable16
(
0
))
return
NULL
;
/* Reload ptr in case it moved in linear memory */
ptr
=
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
0
)
);
return
(
ATOMTABLE
*
)((
char
*
)
ptr
+
ptr
->
atomtable
);
}
/***********************************************************************
* ATOM_Hash
* RETURNS
* The hash value for the input string
*/
static
WORD
ATOM_Hash
(
WORD
entries
,
/* [in] Total number of entries */
LPCSTR
str
,
/* [in] Pointer to string to hash */
WORD
len
/* [in] Length of string */
)
{
WORD
i
,
hash
=
0
;
TRACE
(
"%x, %s, %x
\n
"
,
entries
,
str
,
len
);
for
(
i
=
0
;
i
<
len
;
i
++
)
hash
^=
toupper
(
str
[
i
])
+
i
;
return
hash
%
entries
;
}
/***********************************************************************
* ATOM_IsIntAtomA
*/
static
BOOL
ATOM_IsIntAtomA
(
LPCSTR
atomstr
,
WORD
*
atomid
)
{
UINT
atom
=
0
;
if
(
!
HIWORD
(
atomstr
))
atom
=
LOWORD
(
atomstr
);
else
{
if
(
*
atomstr
++
!=
'#'
)
return
FALSE
;
while
(
*
atomstr
>=
'0'
&&
*
atomstr
<=
'9'
)
{
atom
=
atom
*
10
+
*
atomstr
-
'0'
;
atomstr
++
;
}
if
(
*
atomstr
)
return
FALSE
;
}
if
(
atom
>=
MAXINTATOM
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
atom
=
0
;
}
*
atomid
=
atom
;
return
TRUE
;
}
/***********************************************************************
* ATOM_MakePtr
*
* Make an ATOMENTRY pointer from a handle (obtained from GetAtomHandle()).
*/
static
inline
ATOMENTRY
*
ATOM_MakePtr
(
HANDLE16
handle
/* [in] Handle */
)
{
return
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
handle
)
);
}
/***********************************************************************
* InitAtomTable (KERNEL.68)
*/
WORD
WINAPI
InitAtomTable16
(
WORD
entries
)
{
int
i
;
HANDLE16
handle
;
ATOMTABLE
*
table
;
/* Allocate the table */
if
(
!
entries
)
entries
=
DEFAULT_ATOMTABLE_SIZE
;
/* sanity check */
handle
=
LocalAlloc16
(
LMEM_FIXED
,
sizeof
(
ATOMTABLE
)
+
(
entries
-
1
)
*
sizeof
(
HANDLE16
)
);
if
(
!
handle
)
return
0
;
table
=
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
handle
)
);
table
->
size
=
entries
;
for
(
i
=
0
;
i
<
entries
;
i
++
)
table
->
entries
[
i
]
=
0
;
/* Store a pointer to the table in the instance data */
((
INSTANCEDATA
*
)
MapSL
(
MAKESEGPTR
(
CURRENT_DS
,
0
)))
->
atomtable
=
handle
;
return
handle
;
}
/***********************************************************************
* GetAtomHandle (KERNEL.73)
*/
HANDLE16
WINAPI
GetAtomHandle16
(
ATOM
atom
)
{
if
(
atom
<
MAXINTATOM
)
return
0
;
return
ATOMTOHANDLE
(
atom
);
}
/***********************************************************************
* AddAtom (KERNEL.70)
*
* Windows DWORD aligns the atom entry size.
* The remaining unused string space created by the alignment
* gets padded with '\0's in a certain way to ensure
* that at least one trailing '\0' remains.
*
* RETURNS
* Atom: Success
* 0: Failure
*/
ATOM
WINAPI
AddAtom16
(
LPCSTR
str
)
{
char
buffer
[
MAX_ATOM_LEN
+
1
];
WORD
hash
;
HANDLE16
entry
;
ATOMENTRY
*
entryPtr
;
ATOMTABLE
*
table
;
int
len
,
ae_len
;
WORD
iatom
;
if
(
ATOM_IsIntAtomA
(
str
,
&
iatom
))
return
iatom
;
TRACE
(
"%s
\n
"
,
debugstr_a
(
buffer
));
/* Make a copy of the string to be sure it doesn't move in linear memory. */
lstrcpynA
(
buffer
,
str
,
sizeof
(
buffer
)
);
len
=
strlen
(
buffer
);
if
(
!
(
table
=
ATOM_GetTable
(
TRUE
)))
return
0
;
hash
=
ATOM_Hash
(
table
->
size
,
buffer
,
len
);
entry
=
table
->
entries
[
hash
];
while
(
entry
)
{
entryPtr
=
ATOM_MakePtr
(
entry
);
if
((
entryPtr
->
length
==
len
)
&&
(
!
strncasecmp
(
entryPtr
->
str
,
buffer
,
len
)))
{
entryPtr
->
refCount
++
;
TRACE
(
"-- existing 0x%x
\n
"
,
entry
);
return
HANDLETOATOM
(
entry
);
}
entry
=
entryPtr
->
next
;
}
ae_len
=
(
sizeof
(
ATOMENTRY
)
+
len
+
3
)
&
~
3
;
entry
=
LocalAlloc16
(
LMEM_FIXED
,
ae_len
);
if
(
!
entry
)
return
0
;
/* Reload the table ptr in case it moved in linear memory */
table
=
ATOM_GetTable
(
FALSE
);
entryPtr
=
ATOM_MakePtr
(
entry
);
entryPtr
->
next
=
table
->
entries
[
hash
];
entryPtr
->
refCount
=
1
;
entryPtr
->
length
=
len
;
/* Some applications _need_ the '\0' padding provided by this strncpy */
strncpy
(
entryPtr
->
str
,
buffer
,
ae_len
-
sizeof
(
ATOMENTRY
)
+
1
);
entryPtr
->
str
[
ae_len
-
sizeof
(
ATOMENTRY
)]
=
'\0'
;
table
->
entries
[
hash
]
=
entry
;
TRACE
(
"-- new 0x%x
\n
"
,
entry
);
return
HANDLETOATOM
(
entry
);
}
/***********************************************************************
* DeleteAtom (KERNEL.71)
*/
ATOM
WINAPI
DeleteAtom16
(
ATOM
atom
)
{
ATOMENTRY
*
entryPtr
;
ATOMTABLE
*
table
;
HANDLE16
entry
,
*
prevEntry
;
WORD
hash
;
if
(
atom
<
MAXINTATOM
)
return
0
;
/* Integer atom */
TRACE
(
"0x%x
\n
"
,
atom
);
if
(
!
(
table
=
ATOM_GetTable
(
FALSE
)))
return
0
;
entry
=
ATOMTOHANDLE
(
atom
);
entryPtr
=
ATOM_MakePtr
(
entry
);
/* Find previous atom */
hash
=
ATOM_Hash
(
table
->
size
,
entryPtr
->
str
,
entryPtr
->
length
);
prevEntry
=
&
table
->
entries
[
hash
];
while
(
*
prevEntry
&&
*
prevEntry
!=
entry
)
{
ATOMENTRY
*
prevEntryPtr
=
ATOM_MakePtr
(
*
prevEntry
);
prevEntry
=
&
prevEntryPtr
->
next
;
}
if
(
!*
prevEntry
)
return
atom
;
/* Delete atom */
if
(
--
entryPtr
->
refCount
==
0
)
{
*
prevEntry
=
entryPtr
->
next
;
LocalFree16
(
entry
);
}
return
0
;
}
/***********************************************************************
* FindAtom (KERNEL.69)
*/
ATOM
WINAPI
FindAtom16
(
LPCSTR
str
)
{
ATOMTABLE
*
table
;
WORD
hash
,
iatom
;
HANDLE16
entry
;
int
len
;
TRACE
(
"%s
\n
"
,
debugstr_a
(
str
));
if
(
ATOM_IsIntAtomA
(
str
,
&
iatom
))
return
iatom
;
if
((
len
=
strlen
(
str
))
>
255
)
len
=
255
;
if
(
!
(
table
=
ATOM_GetTable
(
FALSE
)))
return
0
;
hash
=
ATOM_Hash
(
table
->
size
,
str
,
len
);
entry
=
table
->
entries
[
hash
];
while
(
entry
)
{
ATOMENTRY
*
entryPtr
=
ATOM_MakePtr
(
entry
);
if
((
entryPtr
->
length
==
len
)
&&
(
!
strncasecmp
(
entryPtr
->
str
,
str
,
len
)))
{
TRACE
(
"-- found %x
\n
"
,
entry
);
return
HANDLETOATOM
(
entry
);
}
entry
=
entryPtr
->
next
;
}
TRACE
(
"-- not found
\n
"
);
return
0
;
}
/***********************************************************************
* GetAtomName (KERNEL.72)
*/
UINT16
WINAPI
GetAtomName16
(
ATOM
atom
,
LPSTR
buffer
,
INT16
count
)
{
ATOMENTRY
*
entryPtr
;
HANDLE16
entry
;
char
*
strPtr
;
INT
len
;
char
text
[
8
];
TRACE
(
"%x
\n
"
,
atom
);
if
(
!
count
)
return
0
;
if
(
atom
<
MAXINTATOM
)
{
sprintf
(
text
,
"#%d"
,
atom
);
len
=
strlen
(
text
);
strPtr
=
text
;
}
else
{
if
(
!
ATOM_GetTable
(
FALSE
))
return
0
;
entry
=
ATOMTOHANDLE
(
atom
);
entryPtr
=
ATOM_MakePtr
(
entry
);
len
=
entryPtr
->
length
;
strPtr
=
entryPtr
->
str
;
}
if
(
len
>=
count
)
len
=
count
-
1
;
memcpy
(
buffer
,
strPtr
,
len
);
buffer
[
len
]
=
'\0'
;
return
len
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment