#ifndef __STRINGUTIL_H__
#define __STRINGUTIL_H__

#ifdef __cplusplus
#ifndef BEGIN_DECLS
#define BEGIN_DECLS extern "C" {
#endif
#ifndef END_DECLS
#define END_DECLS }
#endif
#else
#ifndef BEGIN_DECLS
#define BEGIN_DECLS
#endif
#ifndef END_DECLS
#define END_DECLS
#endif
#endif

BEGIN_DECLS

#if defined(_WIN32) && defined(UNICODE)
#include <wchar.h>
#endif

#ifdef _WIN32
//#include <windows.h>
#elif __linux__
#endif

#include <ctype.h>
#include <limits.h>
#include <math.h>
#include <stdint.h>
#include <time.h>
#include <stdlib.h>

#include "Common.h"
#include "SecureCodingUtil.h"
#include "Log.h"


#define STR_ERR_SUCCESS             0
#define STR_ERR_OVERFLOW            -1
#define STR_ERR_NONNUMERIC          -2
#define STR_ERR_UNKNOWN             -3
#define STR_ERR_FAIL_TYPE           -4
#define STR_ERR_TYPE_UNKNOWN        -5
#define STR_ERR_NOT_EXIST_NULL      -6
#define STR_ERR_NOT_NULL            -7
#define STR_ERR_SIZE_ZERO           -8
#define STR_ERR_NULL_PARAMETER      -9
#define STR_ERR_VARIABLE_TOO_SHORT  -10
#define STR_ERR_NO_MEM              -11

#define STR_SHORT_DATE_BASE         2000    // YY 형태의 베이스 년도 : 년도 = STR_SHORT_DATE_BASE + YY 숫자 형태 변환값

#define STR_YEAR_MIN                1900
#define STR_MONTH_MIN               1
#define STR_DAY_MIN                 1
#define STR_HOUR_MIN                0
#define STR_MINUTE_MIN              0
#define STR_SECOND_MIN              0
#define STR_MILISECOND_MIN          0


#define STR_YEAR_MAX                2200
#define STR_MONTH_MAX               12
#define STR_DAY_MAX                 31
#define STR_HOUR_MAX                23
#define STR_MINUTE_MAX              59
#define STR_SECOND_MAX              59
#define STR_MILISECOND_MAX          999


enum TYPE_METHOD
{
    TYPE_YN = 0,                      // 'Y' 또는 'N'
    TYPE_DIGIT,                       // Character로 표시된 문자형태 "0100" : 단 10진수 형태의 사용만
    TYPE_ALPHA,                       // 영문으로 표시된 문자형태(TODO : 한글 별도로 체크 해야 되는지? isalpha로 체크 되는지 확인 필요)
    TYPE_ALPHA_NUMERIC,               // TYPE_DIGIT || TYPE_ALPHA
    TYPE_HEX,                         // 16진수 문자열 확인
    TYPE_BCD,                         // BCD 바이너리를 만족하는지 확인(BCD 텍스트로 해야할지 고민중)
    TYPE_FILENAME,                    // 확장자나 특수 문자등 print 가능한 문자여부를 확인 함(isalnum에 '.', '/', '\\'만 추가로 허용해야 할지?)
    TYPE_DATE8,                       // YYYYMMDD
    TYPE_DATE6,                       // YYMMDD
    TYPE_TIME6,                       // HHMMSS
    TYPE_TIME9,                       // HHMMSSFFF
    TYPE_DTIME12,                     // YYMMDDHHMMSS
    TYPE_DTIME14,                     // YYYYMMDDHHMMSS
    TYPE_DTIME17,                     // YYYYMMDDHHMMSSFFF
//    TYPE_BINARY,
};


int Trim(char *szDesc, int nMaxLength, const char *szSrc);
int RTrim(char *szDesc, int nMaxLength, const char *szSrc);
int LTrim(char *szDesc, int nMaxLength, const char *szSrc);
int SafeStringToInt(const char * szStringNumber, int nStringLength, int *pnValue);
int SafeStringToLong(const char * szStringNumber, int nStringLength, long *pnValue);
int SafeHexStringToInt(const char * szStringNumber, int nStringLength, uint16_t *pnValue);
int SafeMemoryAlloc(void **pData, size_t nSize);
//void *SafeAlloc(void *pData, size_t nSize);
void SafeFree(void **pData);


int GetCurrTime(struct tm *pTM, int *pnMilliSec);


int GetCheckedValue(int nType, char *szStringBuffer, int nLength, const char *pData);
int GetCheckedValueEndWithSep(int nType, char *szCheckedValue, int nCheckedValueSize, const char *pData, int *pnDataSize, char cSeperator);
int CheckNULL(const char *pszData, int nDataLen);

int GetDateTimeString(int nType, char *pszDateTimeString, int nDateTimeSize);
int CalculateIntRemainder(int nValue, int nBase, int nDigitCount);


END_DECLS

#endif
