kerneltest/e32utils/nistsecurerng/src/utils/openc.cpp
author hgs
Thu, 01 Jul 2010 17:57:33 +0100
changeset 189 a5496987b1da
permissions -rw-r--r--
201025_04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
     1
/*
a5496987b1da 201025_04
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
a5496987b1da 201025_04
hgs
parents:
diff changeset
     3
* All rights reserved.
a5496987b1da 201025_04
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
a5496987b1da 201025_04
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
a5496987b1da 201025_04
hgs
parents:
diff changeset
     8
*
a5496987b1da 201025_04
hgs
parents:
diff changeset
     9
* Initial Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    11
*
a5496987b1da 201025_04
hgs
parents:
diff changeset
    12
* Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    13
*
a5496987b1da 201025_04
hgs
parents:
diff changeset
    14
* Description: 
a5496987b1da 201025_04
hgs
parents:
diff changeset
    15
*/
a5496987b1da 201025_04
hgs
parents:
diff changeset
    16
a5496987b1da 201025_04
hgs
parents:
diff changeset
    17
a5496987b1da 201025_04
hgs
parents:
diff changeset
    18
//------------------------------------ System Header Files ------------------------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
    19
#include <e32cons.h>        // ConsoleBase
a5496987b1da 201025_04
hgs
parents:
diff changeset
    20
//------------------------------------ Local Header Files -------------------------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
    21
#include "openc.h"
a5496987b1da 201025_04
hgs
parents:
diff changeset
    22
a5496987b1da 201025_04
hgs
parents:
diff changeset
    23
//-------------------------------- Constants, global variables and Macro Definitions ----------------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
    24
_LIT(KConsoleName, "NIST Test Console");
a5496987b1da 201025_04
hgs
parents:
diff changeset
    25
CConsoleBase* gConsole = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    26
a5496987b1da 201025_04
hgs
parents:
diff changeset
    27
a5496987b1da 201025_04
hgs
parents:
diff changeset
    28
int PrintToScreen(const char* aString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    29
a5496987b1da 201025_04
hgs
parents:
diff changeset
    30
const TInt KIntStringLen = 10;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    31
RFs gFileSession;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    32
a5496987b1da 201025_04
hgs
parents:
diff changeset
    33
enum TDataType
a5496987b1da 201025_04
hgs
parents:
diff changeset
    34
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    35
    EInteger,
a5496987b1da 201025_04
hgs
parents:
diff changeset
    36
    EFloat,
a5496987b1da 201025_04
hgs
parents:
diff changeset
    37
    EUnknownType = 0x10000
a5496987b1da 201025_04
hgs
parents:
diff changeset
    38
    };
a5496987b1da 201025_04
hgs
parents:
diff changeset
    39
a5496987b1da 201025_04
hgs
parents:
diff changeset
    40
const TInt KMaxReadSize = 50;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    41
const TInt KMaxScreenBufferSize = 100;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    42
a5496987b1da 201025_04
hgs
parents:
diff changeset
    43
TBuf<KMaxScreenBufferSize> gScreenBuffer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    44
a5496987b1da 201025_04
hgs
parents:
diff changeset
    45
class GlobalInitilizer
a5496987b1da 201025_04
hgs
parents:
diff changeset
    46
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    47
public:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    48
    GlobalInitilizer()
a5496987b1da 201025_04
hgs
parents:
diff changeset
    49
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    50
        TInt err = gFileSession.Connect();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    51
a5496987b1da 201025_04
hgs
parents:
diff changeset
    52
        if(err != KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    53
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    54
            User::Exit(err);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    55
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
    56
a5496987b1da 201025_04
hgs
parents:
diff changeset
    57
        TRAP(err, gConsole = Console::NewL(KConsoleName, TSize(KConsFullScreen,KConsFullScreen)));
a5496987b1da 201025_04
hgs
parents:
diff changeset
    58
        if(err != KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    59
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    60
            User::Exit(err);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    61
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
    62
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
    63
    ~GlobalInitilizer()
a5496987b1da 201025_04
hgs
parents:
diff changeset
    64
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    65
        gFileSession.Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
    66
        delete gConsole;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    67
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
    68
    };
a5496987b1da 201025_04
hgs
parents:
diff changeset
    69
a5496987b1da 201025_04
hgs
parents:
diff changeset
    70
GlobalInitilizer globalObj;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    71
a5496987b1da 201025_04
hgs
parents:
diff changeset
    72
//------------------------------------ Function Definitions -----------------------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
    73
a5496987b1da 201025_04
hgs
parents:
diff changeset
    74
double log(double aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    75
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    76
    double result = 0.0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    77
    Math::Ln(result, aSource);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    78
    return result;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    79
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
    80
a5496987b1da 201025_04
hgs
parents:
diff changeset
    81
double exp(double aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    82
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    83
    double result = 0.0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    84
    Math::Exp(result, aSource);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    85
    return result;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    86
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
    87
a5496987b1da 201025_04
hgs
parents:
diff changeset
    88
double fabs(double aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    89
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    90
    return (aSource >= 0.0)? aSource: -aSource;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    91
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
    92
a5496987b1da 201025_04
hgs
parents:
diff changeset
    93
a5496987b1da 201025_04
hgs
parents:
diff changeset
    94
double floor(double aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    95
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    96
    if(aSource >= 0.0 || aSource == (TInt64)aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    97
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
    98
        return (double)(TInt64)aSource;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    99
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   100
   
a5496987b1da 201025_04
hgs
parents:
diff changeset
   101
    return (double)((TInt64)aSource - 1);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   102
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   103
a5496987b1da 201025_04
hgs
parents:
diff changeset
   104
double sqrt(double aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   105
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   106
    double result = 0.0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   107
    Math::Sqrt(result, aSource);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   108
    return result;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   109
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   110
a5496987b1da 201025_04
hgs
parents:
diff changeset
   111
double pow(double aSource, double aPower)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   112
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   113
    double result = 0.0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   114
    Math::Pow(result, aSource, aPower);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   115
    return result;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   116
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   117
a5496987b1da 201025_04
hgs
parents:
diff changeset
   118
// Math trigonometric functions
a5496987b1da 201025_04
hgs
parents:
diff changeset
   119
double sin(double aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   120
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   121
    double result = 0.0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   122
    Math::Sin(result, aSource);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   123
    return result;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   124
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   125
a5496987b1da 201025_04
hgs
parents:
diff changeset
   126
double cos(double aSource)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   127
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   128
    double result = 0.0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   129
    Math::Cos(result, aSource);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   130
    return result;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   131
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   132
a5496987b1da 201025_04
hgs
parents:
diff changeset
   133
// Stdio functions
a5496987b1da 201025_04
hgs
parents:
diff changeset
   134
int printf(const char* aFormatString, ...)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   135
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   136
    TUint length = User::StringLength((TUint8*)aFormatString) + 100;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   137
    HBufC8* buffer = HBufC8::New(length);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   138
    if(NULL == buffer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   139
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   140
        return KErrNoMemory;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   141
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   142
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   143
    TPtr8 targetPtr = buffer->Des();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   144
    TPtrC8 formatPtr((TUint8*)aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   145
a5496987b1da 201025_04
hgs
parents:
diff changeset
   146
    VA_LIST list;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   147
    VA_START(list, aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   148
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   149
    targetPtr.FormatList(formatPtr, list);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   150
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   151
    PrintToScreen((const char*)targetPtr.PtrZ());
a5496987b1da 201025_04
hgs
parents:
diff changeset
   152
a5496987b1da 201025_04
hgs
parents:
diff changeset
   153
    delete buffer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   154
a5496987b1da 201025_04
hgs
parents:
diff changeset
   155
    return targetPtr.Length();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   156
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   157
a5496987b1da 201025_04
hgs
parents:
diff changeset
   158
int puts(const char* aString)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   159
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   160
    int ret = PrintToScreen(aString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   161
    gConsole->Printf(_L("\n"));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   162
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   163
    return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   164
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   165
a5496987b1da 201025_04
hgs
parents:
diff changeset
   166
int putchar(int aChar)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   167
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   168
    gConsole->Printf(_L("%c"), aChar);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   169
    return aChar;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   170
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   171
a5496987b1da 201025_04
hgs
parents:
diff changeset
   172
char* strcpy(char* aDst, const char* aSrc)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   173
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   174
    char* cp = aDst;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   175
a5496987b1da 201025_04
hgs
parents:
diff changeset
   176
    while((*cp++ = *aSrc++) != 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   177
        ; // Copy src over dst
a5496987b1da 201025_04
hgs
parents:
diff changeset
   178
a5496987b1da 201025_04
hgs
parents:
diff changeset
   179
    return(aDst);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   180
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   181
a5496987b1da 201025_04
hgs
parents:
diff changeset
   182
int scanf(const char* aFormatString, ...)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   183
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   184
    TDataType type = EUnknownType;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   185
    TBool byteRead = EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   186
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   187
    if(Mem::Compare((const unsigned char*)aFormatString, 2, (const unsigned char*)"%d", 2) == 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   188
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   189
        type = EInteger;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   190
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   191
    else if(Mem::Compare((const unsigned char*)aFormatString, 2, (const unsigned char*)"%f", 2) == 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   192
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   193
        type = EFloat;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   194
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   195
    else if(Mem::Compare((const unsigned char*)aFormatString, 3, (const unsigned char*)"%1d", 3) == 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   196
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   197
        type = EInteger;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   198
        byteRead = ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   199
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   200
    else
a5496987b1da 201025_04
hgs
parents:
diff changeset
   201
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   202
        User::Panic(_L("NIST TestSuit Error"), KErrArgument);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   203
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   204
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   205
    if(!byteRead || (gScreenBuffer.Length() == 0))
a5496987b1da 201025_04
hgs
parents:
diff changeset
   206
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   207
        ReadStringFromConsole(gScreenBuffer);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   208
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   209
a5496987b1da 201025_04
hgs
parents:
diff changeset
   210
    TLex parser(gScreenBuffer);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   211
    parser.SkipSpace();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   212
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   213
    VA_LIST list;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   214
    VA_START(list, aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   215
a5496987b1da 201025_04
hgs
parents:
diff changeset
   216
    switch(type)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   217
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   218
        case EInteger:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   219
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   220
            TInt* ptr = VA_ARG(list, TInt*);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   221
            if(byteRead)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   222
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   223
                TChar ch(gScreenBuffer[0]);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   224
                gScreenBuffer.Delete(0, 1);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   225
                *ptr = ch.GetNumericValue();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   226
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   227
            else
a5496987b1da 201025_04
hgs
parents:
diff changeset
   228
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   229
                parser.Val(*ptr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   230
                gScreenBuffer.Zero();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   231
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   232
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   233
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   234
        case EFloat:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   235
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   236
            float* ptr = VA_ARG(list, float*);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   237
            parser.Val(*ptr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   238
            gScreenBuffer.Zero();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   239
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   240
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   241
        case EUnknownType:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   242
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   243
            User::Panic(_L("NIST TestSuit Error"), KErrArgument);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   244
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   245
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   246
a5496987b1da 201025_04
hgs
parents:
diff changeset
   247
    return 1;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   248
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   249
a5496987b1da 201025_04
hgs
parents:
diff changeset
   250
int sprintf(char *aBuffer, const char* aFormatString, ...)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   251
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   252
    TUint length = User::StringLength((TUint8*)aFormatString) + 100;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   253
    TPtr8 aTargetPtr((TUint8*)aBuffer, length);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   254
    TPtrC8 formatPtr((TUint8*)aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   255
a5496987b1da 201025_04
hgs
parents:
diff changeset
   256
    VA_LIST list;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   257
    VA_START(list, aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   258
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   259
    aTargetPtr.FormatList(formatPtr, list);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   260
    aTargetPtr.ZeroTerminate();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   261
a5496987b1da 201025_04
hgs
parents:
diff changeset
   262
    return User::StringLength((TUint8*)aBuffer);;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   263
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   264
a5496987b1da 201025_04
hgs
parents:
diff changeset
   265
int GetFileMode(const char* aModeStr, TFileMode& aFileMode, TBool& aIsAppend)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   266
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   267
    aIsAppend = EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   268
    switch (*aModeStr)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   269
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   270
        case 'r':
a5496987b1da 201025_04
hgs
parents:
diff changeset
   271
            aFileMode = EFileRead;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   272
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   273
            
a5496987b1da 201025_04
hgs
parents:
diff changeset
   274
        case 'w':
a5496987b1da 201025_04
hgs
parents:
diff changeset
   275
            aFileMode = EFileWrite;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   276
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   277
            
a5496987b1da 201025_04
hgs
parents:
diff changeset
   278
        case 'a':
a5496987b1da 201025_04
hgs
parents:
diff changeset
   279
            aFileMode = EFileWrite;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   280
            aIsAppend = ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   281
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   282
            
a5496987b1da 201025_04
hgs
parents:
diff changeset
   283
        default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   284
            return KErrArgument;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   285
        } 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   286
      
a5496987b1da 201025_04
hgs
parents:
diff changeset
   287
    return KErrNone;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   288
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   289
a5496987b1da 201025_04
hgs
parents:
diff changeset
   290
FILE *fopen(const char *aFileName, const char *aMode)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   291
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   292
    TPtrC8 fileNamePtr(reinterpret_cast<const unsigned char*>(aFileName));
a5496987b1da 201025_04
hgs
parents:
diff changeset
   293
    TFileName fileName;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   294
    fileName.Copy(fileNamePtr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   295
    RFile* file = new RFile;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   296
    if(NULL == file)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   297
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   298
        return NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   299
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   300
a5496987b1da 201025_04
hgs
parents:
diff changeset
   301
    TFileMode mode = EFileRead;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   302
    TBool isAppend = EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   303
    GetFileMode(aMode, mode, isAppend);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   304
    int err = KErrArgument;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   305
    switch(mode)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   306
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   307
        case EFileRead:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   308
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   309
            err = file->Open(gFileSession, fileName, mode);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   310
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   311
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   312
        case EFileWrite:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   313
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   314
            if(isAppend)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   315
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   316
                err = file->Open(gFileSession, fileName, mode);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   317
                if(err == KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   318
                    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   319
                    TInt offset = 0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   320
                    err = file->Seek(ESeekEnd, offset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   321
                    break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   322
                    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   323
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   324
            
a5496987b1da 201025_04
hgs
parents:
diff changeset
   325
            err = file->Replace(gFileSession, fileName, mode);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   326
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   327
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   328
        default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   329
            err = KErrArgument;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   330
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   331
a5496987b1da 201025_04
hgs
parents:
diff changeset
   332
    if(KErrNone != err)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   333
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   334
        file->Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   335
        delete file;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   336
        file = NULL;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   337
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   338
    return file;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   339
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   340
a5496987b1da 201025_04
hgs
parents:
diff changeset
   341
a5496987b1da 201025_04
hgs
parents:
diff changeset
   342
a5496987b1da 201025_04
hgs
parents:
diff changeset
   343
int fclose(FILE *aFp)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   344
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   345
    if(NULL != aFp)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   346
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   347
        aFp->Close();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   348
        delete aFp;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   349
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   350
    return KErrNone;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   351
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   352
a5496987b1da 201025_04
hgs
parents:
diff changeset
   353
int fprintf(FILE* aFile, const char* aFormatString, ...)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   354
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   355
    TUint length = User::StringLength((TUint8*)aFormatString) + 100;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   356
    HBufC8* buffer = HBufC8::New(length);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   357
    if(NULL == buffer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   358
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   359
        return KErrNoMemory;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   360
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   361
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   362
    TPtr8 targetPtr = buffer->Des();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   363
    TPtrC8 formatPtr((TUint8*)aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   364
a5496987b1da 201025_04
hgs
parents:
diff changeset
   365
    VA_LIST list;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   366
    VA_START(list, aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   367
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   368
    targetPtr.FormatList(formatPtr, list);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   369
    targetPtr.ZeroTerminate();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   370
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   371
    aFile->Write(targetPtr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   372
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   373
    delete buffer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   374
a5496987b1da 201025_04
hgs
parents:
diff changeset
   375
    return targetPtr.Length();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   376
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   377
a5496987b1da 201025_04
hgs
parents:
diff changeset
   378
int fscanf(FILE* aFp, const char * aFormatString, ...)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   379
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   380
    TDataType type = EUnknownType;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   381
    TBool byteRead = EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   382
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   383
    if(Mem::Compare((const unsigned char*)aFormatString, 2, (const unsigned char*)"%d", 2) == 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   384
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   385
        type = EInteger;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   386
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   387
    else if(Mem::Compare((const unsigned char*)aFormatString, 2, (const unsigned char*)"%f", 2) == 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   388
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   389
        type = EFloat;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   390
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   391
    else if(Mem::Compare((const unsigned char*)aFormatString, 3, (const unsigned char*)"%1d", 3) == 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   392
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   393
        type = EInteger;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   394
        byteRead = ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   395
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   396
    else
a5496987b1da 201025_04
hgs
parents:
diff changeset
   397
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   398
        User::Panic(_L("NIST TestSuit Error"), KErrArgument);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   399
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   400
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   401
    TInt initialOffset = 0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   402
    aFp->Seek(ESeekCurrent, initialOffset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   403
    TBuf8<KMaxReadSize + 1> readBuffer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   404
    aFp->Read(readBuffer, KMaxReadSize);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   405
    readBuffer.ZeroTerminate();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   406
    TLex8 parser(readBuffer);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   407
    parser.SkipSpace();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   408
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   409
    VA_LIST list;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   410
    VA_START(list, aFormatString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   411
a5496987b1da 201025_04
hgs
parents:
diff changeset
   412
    switch(type)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   413
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   414
        case EInteger:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   415
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   416
            TInt* ptr = VA_ARG(list, TInt*);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   417
            TChar ch = parser.Peek();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   418
            
a5496987b1da 201025_04
hgs
parents:
diff changeset
   419
            if(!ch.IsDigit())
a5496987b1da 201025_04
hgs
parents:
diff changeset
   420
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   421
                break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   422
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   423
            
a5496987b1da 201025_04
hgs
parents:
diff changeset
   424
            if(byteRead)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   425
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   426
                ch = parser.Get();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   427
                *ptr = ch.GetNumericValue();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   428
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   429
            else
a5496987b1da 201025_04
hgs
parents:
diff changeset
   430
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   431
                parser.Val(*ptr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   432
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   433
a5496987b1da 201025_04
hgs
parents:
diff changeset
   434
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   435
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   436
        case EFloat:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   437
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   438
            float* ptr = VA_ARG(list, float*);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   439
            parser.Val(*ptr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   440
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   441
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   442
        case EUnknownType:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   443
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   444
            User::Panic(_L("NIST TestSuit Error"), KErrArgument);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   445
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   446
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   447
a5496987b1da 201025_04
hgs
parents:
diff changeset
   448
    TInt len = initialOffset + parser.Offset();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   449
    aFp->Seek(ESeekStart, len);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   450
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   451
    return 1;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   452
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   453
a5496987b1da 201025_04
hgs
parents:
diff changeset
   454
TUint32 fread(void* aPtr, TUint32 aSize, TUint32 aCount, FILE* aFile)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   455
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   456
    TUint32 size = aSize * aCount;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   457
    TPtr8 dataPtr((TUint8*)aPtr, size);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   458
    TInt err = aFile->Read(dataPtr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   459
    if(KErrNone != err)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   460
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   461
        size = (TUint32)dataPtr.Length();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   462
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   463
    return size;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   464
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   465
a5496987b1da 201025_04
hgs
parents:
diff changeset
   466
int fseek(FILE* aFile, long aOffset, int aWhence)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   467
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   468
    int ret = KErrNone;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   469
    int fileOffset = aOffset;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   470
    switch(aWhence)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   471
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   472
        case SEEK_SET:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   473
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   474
            ret = aFile->Seek(ESeekStart, fileOffset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   475
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   476
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   477
        case SEEK_CUR:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   478
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   479
            ret = aFile->Seek(ESeekCurrent, fileOffset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   480
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   481
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   482
        case SEEK_END:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   483
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   484
            ret = aFile->Seek(ESeekEnd, fileOffset);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   485
            break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   486
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   487
        default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   488
            User::Panic(_L("NIST TestSuit Error"), KErrArgument);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   489
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   490
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   491
    return ret;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   492
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   493
a5496987b1da 201025_04
hgs
parents:
diff changeset
   494
a5496987b1da 201025_04
hgs
parents:
diff changeset
   495
a5496987b1da 201025_04
hgs
parents:
diff changeset
   496
int fflush(FILE *aFile)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   497
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   498
    TInt err = aFile->Flush();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   499
    if(err != KErrNone)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   500
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   501
        err = EOF;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   502
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   503
    return err;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   504
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   505
a5496987b1da 201025_04
hgs
parents:
diff changeset
   506
a5496987b1da 201025_04
hgs
parents:
diff changeset
   507
// Conio functions
a5496987b1da 201025_04
hgs
parents:
diff changeset
   508
void* calloc(TUint32 aElementCount, TUint32 aSize)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   509
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   510
    aSize *= aElementCount;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   511
    return User::AllocZ(aSize);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   512
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   513
a5496987b1da 201025_04
hgs
parents:
diff changeset
   514
void free(void *aMemory)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   515
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   516
    User::Free(aMemory);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   517
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   518
a5496987b1da 201025_04
hgs
parents:
diff changeset
   519
TBool IsCharacterKey(TKeyCode aKey)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   520
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   521
    if(aKey > EKeyEscape && aKey < EKeyDelete)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   522
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   523
        return ETrue;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   524
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   525
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   526
    return EFalse;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   527
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   528
a5496987b1da 201025_04
hgs
parents:
diff changeset
   529
_LIT(KLineBreaker, "\r\n");
a5496987b1da 201025_04
hgs
parents:
diff changeset
   530
a5496987b1da 201025_04
hgs
parents:
diff changeset
   531
void ReadStringFromConsole(TDes& aString)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   532
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   533
    // This infinte loop terminates when user hits an "enter" key
a5496987b1da 201025_04
hgs
parents:
diff changeset
   534
    FOREVER
a5496987b1da 201025_04
hgs
parents:
diff changeset
   535
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   536
        // Get a key(character) from the console
a5496987b1da 201025_04
hgs
parents:
diff changeset
   537
        TKeyCode ch = gConsole->Getch();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   538
        
a5496987b1da 201025_04
hgs
parents:
diff changeset
   539
        switch(ch)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   540
            {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   541
            case EKeyEnter:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   542
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   543
                if(aString.Length() == 0)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   544
                    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   545
                    break;// At least one character should be read.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   546
                    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   547
                gConsole->Printf(KLineBreaker);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   548
                return;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   549
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   550
            case EKeyBackspace:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   551
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   552
                if(0 != aString.Length())
a5496987b1da 201025_04
hgs
parents:
diff changeset
   553
                    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   554
                    // Back-space only takes the cursor one position back
a5496987b1da 201025_04
hgs
parents:
diff changeset
   555
                    // So to delete a character blank-space is inserted at
a5496987b1da 201025_04
hgs
parents:
diff changeset
   556
                    // that position and later cursor is again adjusted.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   557
                    gConsole->Printf(_L("%c%c%c"), EKeyBackspace, 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   558
                                                   EKeySpace, 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   559
                                                   EKeyBackspace);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   560
                    // Delete the character from the target string also. 
a5496987b1da 201025_04
hgs
parents:
diff changeset
   561
                    aString.Delete(aString.Length() - 1, 1);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   562
                    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   563
                break;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   564
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   565
            default:
a5496987b1da 201025_04
hgs
parents:
diff changeset
   566
                {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   567
                TInt maxBufferLength = aString.MaxLength();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   568
                // IsCharacterKey will return true if ch is a displayable
a5496987b1da 201025_04
hgs
parents:
diff changeset
   569
                // character else it will return false.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   570
                if(IsCharacterKey(ch) && aString.Length() != maxBufferLength)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   571
                    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   572
                    gConsole->Printf(_L("%c"), ch);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   573
                    aString.Append(ch);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   574
                    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   575
                }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   576
            }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   577
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   578
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   579
  
a5496987b1da 201025_04
hgs
parents:
diff changeset
   580
TInt ReadIntL(TInt& aValue)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   581
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   582
    TBuf<KIntStringLen> string;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   583
    ReadStringFromConsole(string);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   584
    TLex lexObj(string);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   585
    return lexObj.Val(aValue);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   586
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   587
a5496987b1da 201025_04
hgs
parents:
diff changeset
   588
int PrintToScreen(const char* aString)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   589
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   590
    TUint length = User::StringLength((TUint8*)aString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   591
    HBufC* buffer = HBufC::New(length);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   592
    if(NULL == buffer)
a5496987b1da 201025_04
hgs
parents:
diff changeset
   593
        {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   594
        return EOF;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   595
        }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   596
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   597
    TPtr targetPtr = buffer->Des();
a5496987b1da 201025_04
hgs
parents:
diff changeset
   598
a5496987b1da 201025_04
hgs
parents:
diff changeset
   599
    TPtrC8 stringPtr((TUint8*)aString);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   600
a5496987b1da 201025_04
hgs
parents:
diff changeset
   601
    targetPtr.Copy(stringPtr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   602
    gConsole->Printf(targetPtr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   603
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   604
    delete buffer;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   605
    
a5496987b1da 201025_04
hgs
parents:
diff changeset
   606
    return KErrNone;
a5496987b1da 201025_04
hgs
parents:
diff changeset
   607
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   608
a5496987b1da 201025_04
hgs
parents:
diff changeset
   609
void exit ( int status )
a5496987b1da 201025_04
hgs
parents:
diff changeset
   610
    {
a5496987b1da 201025_04
hgs
parents:
diff changeset
   611
    User::Exit(status);
a5496987b1da 201025_04
hgs
parents:
diff changeset
   612
    for(;;){} // So that GCC compiler don't complain about noreturn function returns.
a5496987b1da 201025_04
hgs
parents:
diff changeset
   613
    }
a5496987b1da 201025_04
hgs
parents:
diff changeset
   614
a5496987b1da 201025_04
hgs
parents:
diff changeset
   615
//------------------------------------------  E  O  F -----------------------------------------------------
a5496987b1da 201025_04
hgs
parents:
diff changeset
   616