/*
 * Unicode routines for use inside the server
 *
 * Copyright (C) 1999 Alexandre Julliard
 */

#ifndef __WINE_SERVER_UNICODE_H
#define __WINE_SERVER_UNICODE_H

#ifndef __WINE_SERVER__
#error This file can only be used in the Wine server
#endif

#include "config.h"

#include <ctype.h>
#ifdef HAVE_WCTYPE_H
#include <wctype.h>
#endif

#include "windef.h"
#include "object.h"

static inline size_t strlenW( const WCHAR *str )
{
    const WCHAR *s = str;
    while (*s) s++;
    return s - str;
}

static inline int strcmpW( const WCHAR *str1, const WCHAR *str2 ) 
{
    while (*str1 && (*str1 == *str2)) { str1++; str2++; }
    return *str1 - *str2;
}

#ifndef HAVE_WCTYPE_H
/* FIXME */
#define towupper(ch) (HIBYTE(ch) ? ch : (WCHAR)toupper(LOBYTE(ch)))
#endif

static inline int strcmpiW( const WCHAR *str1, const WCHAR *str2 ) 
{
    while (*str1 && (towupper(*str1) == towupper(*str2))) { str1++; str2++; }
    return towupper(*str1) - towupper(*str2);
}

static inline WCHAR *strcpyW( WCHAR *dst, const WCHAR *src ) 
{
    const WCHAR *ret = dst;
    while ((*dst++ = *src++));
    return (WCHAR *)ret;
}

static inline WCHAR *strdupW( const WCHAR *str )
{
    size_t len = (strlenW(str) + 1) * sizeof(WCHAR);
    return memdup( str, len );
}

extern int dump_strW( const WCHAR *str, size_t len, FILE *f, char escape[2] );

#endif  /* __WINE_SERVER_UNICODE_H */
