/*
 * PROJECT:         ReactOS DiskPart
 * LICENSE:         GPL - See COPYING in the top level directory
 * FILE:            base/system/diskpart/misc.c
 * PURPOSE:         Manages all the partitions of the OS in an interactive way.
 * PROGRAMMERS:     Eric Kohl
 */

#include "diskpart.h"

/* FUNCTIONS ******************************************************************/

BOOL
IsDecString(
    _In_ PWSTR pszDecString)
{
    PWSTR ptr;

    if ((pszDecString == NULL) || (*pszDecString == UNICODE_NULL))
        return FALSE;

    ptr = pszDecString;
    while (*ptr != UNICODE_NULL)
    {
        if (!iswdigit(*ptr))
            return FALSE;

        ptr++;
    }

    return TRUE;
}


BOOL
IsHexString(
    _In_ PWSTR pszHexString)
{
    PWSTR ptr;

    if ((pszHexString == NULL) || (*pszHexString == UNICODE_NULL))
        return FALSE;

    ptr = pszHexString;
    while (*ptr != UNICODE_NULL)
    {
        if (!iswxdigit(*ptr))
            return FALSE;

        ptr++;
    }

    return TRUE;
}


BOOL
HasPrefix(
    _In_ PWSTR pszString,
    _In_ PWSTR pszPrefix,
    _Out_opt_ PWSTR *ppszSuffix)
{
    INT nPrefixLength, ret;

    nPrefixLength = wcslen(pszPrefix);
    ret = _wcsnicmp(pszString, pszPrefix, nPrefixLength);
    if ((ret == 0) && (ppszSuffix != NULL))
        *ppszSuffix = &pszString[nPrefixLength];

    return (ret == 0);
}


ULONGLONG
RoundingDivide(
    _In_ ULONGLONG Dividend,
    _In_ ULONGLONG Divisor)
{
    return (Dividend + Divisor / 2) / Divisor;
}


PWSTR
DuplicateQuotedString(
    _In_ PWSTR pszInString)
{
    PWSTR pszOutString = NULL;
    PWSTR pStart, pEnd;
    INT nLength;

    if ((pszInString == NULL) || (pszInString[0] == UNICODE_NULL))
        return NULL;

    if (pszInString[0] == L'"')
    {
        if (pszInString[1] == UNICODE_NULL)
            return NULL;

        pStart = &pszInString[1];
        pEnd = wcschr(pStart, '"');
        if (pEnd == NULL)
        {
            nLength = wcslen(pStart);
        }
        else
        {
            nLength = (pEnd - pStart);
        }
    }
    else
    {
        pStart = pszInString;
        nLength = wcslen(pStart);
    }

    pszOutString = RtlAllocateHeap(RtlGetProcessHeap(),
                                   HEAP_ZERO_MEMORY,
                                   (nLength + 1) * sizeof(WCHAR));
    if (pszOutString == NULL)
        return NULL;

    wcsncpy(pszOutString, pStart, nLength);

    return pszOutString;
}


PWSTR
DuplicateString(
    _In_ PWSTR pszInString)
{
    PWSTR pszOutString = NULL;
    INT nLength;

    if ((pszInString == NULL) || (pszInString[0] == UNICODE_NULL))
        return NULL;

    nLength = wcslen(pszInString);
    pszOutString = RtlAllocateHeap(RtlGetProcessHeap(),
                                   HEAP_ZERO_MEMORY,
                                   (nLength + 1) * sizeof(WCHAR));
    if (pszOutString == NULL)
        return NULL;

    wcscpy(pszOutString, pszInString);

    return pszOutString;
}