/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    util.c

Abstract:

    Utility functions for dbghelp.

Author:

    Pat Styles (patst) 6-Dec-2001

Environment:

    User Mode

--*/

#include "private.h"
#include "symbols.h"
#include "globals.h"
#include <dbhpriv.h>

int
ReverseCmp(
    char *one,
    char *two
    )
{
    char *p1;
    char *p2;
    int   i;

    p1 = one + strlen(one) - 1;
    p2 = two + strlen(two) - 1;

    for (i = 0; p1 >= one && p2 >= two;  i++, p1--, p2--) {
        if (*p1 != *p2)
            return i;
    }

    return i;
}


BOOL
UpdateBestSrc(
    char *cmp,
    char *trg,
    char *src
    )
{
    assert(cmp && *cmp && trg && src);

    if (!*trg || (ReverseCmp(cmp, src) > ReverseCmp(cmp, trg))) {
        strcpy(trg, src);
        return true;
    }

    return false;
}


BOOL
ShortNodeName(
    char  *in,
    char  *out,
    size_t osize
    )
{
    char *p;

    assert(in);

    if (osize < 1 || !out)
        return false;

    CopyString(out, in, osize);

    for (p = out + strlen(out) -1; p >= out; p--) {
        if (*p == '~') {
            *(++p) = 'X';
            *(++p) = 0;
            return true;
        }
        if (*p < '0' || *p > '9') 
            return false;
    }

    return false;
}


BOOL
ShortFileName(
    char  *in,
    char  *out,
    size_t osize)
{
    char drive[_MAX_DRIVE + 1];
    char dir[_MAX_DIR + 1];
    char fname[_MAX_FNAME + 1];
    char ext[_MAX_EXT + 1];
    char nfname[_MAX_FNAME + 1];
    BOOL rc;

    _splitpath(in, drive, dir, fname, ext);

    rc = ShortNodeName(fname, nfname, DIMA(nfname));

    CopyString(out, drive, osize);
    CatString(out, dir, osize);
    CatString(out, nfname, osize);
    CatString(out, ext, osize);

    return rc;
}

BOOL
ToggleFailCriticalErrors(
    BOOL reset
    )
{
    static UINT oldmode = 0;

    if (!option(SYMOPT_FAIL_CRITICAL_ERRORS))
        return false;

    if (reset)
        SetErrorMode(oldmode);
    else
        oldmode = SetErrorMode(SEM_FAILCRITICALERRORS);

    return true;
}


DWORD
fnGetFileAttributes(
    char *lpFileName
    )
{
    DWORD rc;

    SetCriticalErrorMode();
    rc = GetFileAttributes(lpFileName);
    ResetCriticalErrorMode();

    return rc;
}


void
rtrim(
    LPSTR sz
    )
{
    LPSTR p;

    assert(sz);

    for (p = sz + strlen(sz) - 1; p >= sz; p--) {
        if (!isspace(*p))
            break;
        *p = 0;
    }
}


void
ltrim(
    LPSTR sz
    )
{
    LPSTR p;
   
    assert(sz);

    for (p = sz; *p; p++) {
        if (!isspace(*p))
            break;
    }

    if (p == sz)
        return;

    for (; *p; p++, sz++) 
        *sz = *p;
    *sz = 0;
}


void
trim(
    LPSTR sz
    )
{
    rtrim(sz);
    ltrim(sz);
}


char *errortext(DWORD err)
{
    char *sz;

    switch (err)
    {
    case ERROR_FILE_NOT_FOUND:
        return "file not found";
    case ERROR_PATH_NOT_FOUND:
        return "path not found";
    case ERROR_NOT_READY:
        return "drive not ready";
    case ERROR_ACCESS_DENIED:
        return "access is denied";
    default:
        sz = FormatStatus(err);
        return (sz) ? sz : "";
    }
}


VOID
RemoveTrailingBackslash(
    LPSTR sz
    )
{
    int i;

    assert(sz);

    i = lstrlen(sz);
    if (!i)
        return;

    if (sz[i - 1] == '\\')
        sz[i - 1] = 0;
}