/*
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 *  SCR_RdL0.h
 *  Scripts, Beaudet Christophe
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 *
 */
 
#ifndef __SCR_RdL0_h__Types
#define __SCR_RdL0_h__Types
 
#ifndef __Only_Types__
#define __SCR_RdL0_h__Undef
#define __Only_Types__
#endif /* !__Only_Types__ */
 
/*
 *=================================================================================================
 *  Includes.
 *=================================================================================================
 */
 
#include "SCR_Anl.h"
#include "SCR_Cxt.h"
#include "SCR_Vars.h"
 
#ifdef __SCR_RdL0_h__Undef
#undef __Only_Types__
#undef __SCR_RdL0_h__Undef
#endif /* __SCR_RdL0_h__Undef */
 
/*
 *=================================================================================================
 *  Constants.
 *=================================================================================================
 */
 
/*
 *  To export code.
 */
#undef CPA_EXPORT
#if defined(CPA_WANTS_IMPORT)
#define CPA_EXPORT __declspec(dllimport)
#elif defined(CPA_WANTS_EXPORT)
#define CPA_EXPORT __declspec(dllexport)
#else /* CPA_WANTS_IMPORT */
#define CPA_EXPORT
#endif /* CPA_WANTS_IMPORT */
 
/*
 *  For SCR_fn_v_RdL0_RegisterCallback
 */
#define SCR_CRC_c_RdL0_ForFile       0x00    /* To register a file callback */
#define SCR_CRC_c_RdL0_ForSection    0x01    /* To register a real section callback */
#define SCR_CRC_c_RdL0_ForBinFile       0x02    /* To register a BINARY file callback */
#define SCR_CRC_c_RdL0_ForBinSection    0x03    /* To register a real BINARY section callback */
 
/*
 *  For SCR_fn_v_RdL0_DeleteRegister????
 */
#define SCR_CDR_c_RdL0_Match         0x00    /* Name must exactly match */
#define SCR_CDR_c_RdL0_Contains      0x01    /* Name must contain the parameter */
#define SCR_CDR_c_RdL0_NotContains   0x02    /* Name must not contain the parameter */
 
#endif /* !__SCR_RdL0_h__Types */
 
/*
 *=================================================================================================
 *  Macros.
 *=================================================================================================
 */
 
#if !defined(__SCR_RdL0_h__Macros) && !defined(__Only_Types__)
#define __SCR_RdL0_h__Macros
 
/*
 *  To get some infos about a relative context.
 *  Caution cause this is not really protected !
 *************************************************
 */
#define SCR_M_RdL0_GetActionSectionNameR(_Offset)\
    (fnp_st_Cxt_Compute(_Offset)->stBuffersCopy.a_szBufferName)
 
#define SCR_M_RdL0_GetIdSectionNameR(_Offset)\
    (fnp_st_Cxt_Compute(_Offset)->stBuffersCopy.a_szBufferNameExt)
 
#define SCR_M_RdL0_GetCompleteSectionNameR(_Offset)\
    (fnp_st_Cxt_Compute(_Offset)->stBuffersCopy.a_szBufferCompleteName)
 
#define SCR_M_RdL0_GetFileNameR(_Offset)\
    (fnp_st_Cxt_Compute(_Offset)->p_stOpenFile->stFile.a_szFileName)
 
#define SCR_M_RdL0_GetOpenFileNameR(_Offset)\
    (fnp_st_Cxt_Compute(_Offset)->p_stOpenFile->stFile.a_szOpenFileName)
 
#define SCR_M_RdL0_ComputeOpenSectionNameR(_Offset, _Dest)\
{\
	char	*_p_szSectionName_;\
	_p_szSectionName_ = strchr(SCR_M_RdL0_GetCompleteSectionNameR(_Offset), SCR_CC_c_Cfg_NameSeparator);\
	strcpy(_Dest, SCR_M_RdL0_GetOpenFileNameR(_Offset));\
	strcat(_Dest, _p_szSectionName_);\
}
 
/*
 *  With preformatted parameters...
 */
#define SCR_M_RdL0_PCHAR(_Param)    ((char *)   (_Param))
#define SCR_M_RdL0_CHAR(_Param)     ((char)     *SCR_M_RdL0_PCHAR(_Param))
#define SCR_M_RdL0_PSHORT(_Param)   ((short *)  (_Param))
#define SCR_M_RdL0_SHORT(_Param)    ((short)    *SCR_M_RdL0_PSHORT(_Param))
#define SCR_M_RdL0_PLONG(_Param)    ((long *)   (_Param))
#define SCR_M_RdL0_LONG(_Param)     ((long)     *SCR_M_RdL0_PLONG(_Param))
#define SCR_M_RdL0_PINT(_Param)     ((int *)    (_Param))
#define SCR_M_RdL0_INT(_Param)      ((int)      *SCR_M_RdL0_PINT(_Param))
#define SCR_M_RdL0_PFLOAT(_Param)   ((float *)  (_Param))
#define SCR_M_RdL0_FLOAT(_Param)    ((float)    *SCR_M_RdL0_PFLOAT(_Param))
#define SCR_M_RdL0_PDOUBLE(_Param)  ((double *) (_Param))
#define SCR_M_RdL0_DOUBLE(_Param)   ((double)   *SCR_M_RdL0_PDOUBLE(_Param))
 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
/*
 *  To set only one context value from a relative position.
 *  _Offset :   Offset of context.
 *  _Num    :   Number of the result.
 *  _Value  :   Value to set.
 */
#define SCR_M_RdL0_SetContextLong(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    _p_stContext_->stContextValues.a_ulValues[_Num] = (unsigned long) (_Value);\
}
 
/*--*/
#define SCR_M_RdL0_SetContextDouble(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    _p_stContext_->stContextValues.a_dfValues[_Num] = (double) (_Value);\
}
 
/*
 *  To get only one context value from a relative position.
 *  _Offset :   Offset of context.
 *  _Num    :   Number of the result.
 *  _Cast   :   To cast retunr value.
 *  _Value  :   To receive the value.
 */
#define SCR_M_RdL0_GetContextLong(_Offset, _Num, _Cast, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    _Value = (_Cast) _p_stContext_->stContextValues.a_ulValues[_Num];\
}
 
/*--*/
#define SCR_M_RdL0_GetContextDouble(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    _Value = _p_stContext_->stContextValues.a_dfValues[_Num];\
}
 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
/*
 *  To set only one file value from a relative position.
 *  _Offset :   Offset of context.
 *  _Num    :   Number of the result.
 *  _Value  :   Value to set.
 */
#define SCR_M_RdL0_SetFileLong(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if((_Offset) <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenFile != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stContext_->p_stOpenFile);\
        _p_stContext_->p_stOpenFile->stFileValues.a_ulValues[_Num] = (unsigned long) (_Value);\
    }\
    else\
        _p_stContext_->cFileValuesValid = 1;\
    _p_stContext_->stFileValues.a_ulValues[_Num] = (unsigned long) (_Value);\
}
 
/*--*/
#define SCR_M_RdL0_SetFileDouble(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if((_Offset) <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenFile != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stContext_->p_stOpenFile);\
        _p_stContext_->p_stOpenFile->stFileValues.a_dfValues[_Num] = (double) (_Value);\
    }\
    else\
        _p_stContext_->cFileValuesValid = 1;\
    _p_stContext_->stFileValues.a_dfValues[_Num] = (double) (_Value);\
}
 
/*
 *  To get only one file value from a relative position.
 *  _Offset :   Offset of context.
 *  _Num    :   Number of the result.
 *  _Cast   :   To cast return value.
 *  _Value  :   To receive value.
 */
#define SCR_M_RdL0_GetFileLong(_Offset, _Num, _Cast, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if((_Offset) <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenFile != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stContext_->p_stOpenFile);\
        _Value = (_Cast) _p_stContext_->p_stOpenFile->stFileValues.a_ulValues[_Num];\
    }\
    else\
        _Value = (_Cast) _p_stContext_->stFileValues.a_ulValues[_Num];\
}
 
/*--*/
#define SCR_M_RdL0_GetFileDouble(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if((_Offset) <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenFile != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_File_Open, _p_stContext_->p_stOpenFile);\
        _Value = _p_stContext_->p_stOpenFile->stFileValues.a_dfValues[_Num];\
    }\
    else\
        _Value = _p_stContext_->stFileValues.a_dfValues[_Num];\
}
 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
/*
 *  To set only one section value from a relative position.
 *  _Offset :   Offset of context.
 *  _Num    :   Number of the result.
 *  _Cast   :   To cast retunr value.
 *  _Value  :   Value to set.
 */
#define SCR_M_RdL0_SetSectionLong(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if(_Offset <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenSection != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_Sect_Open, _p_stContext_->p_stOpenSection);\
        _p_stContext_->p_stOpenSection->stSectionValues.a_ulValues[_Num] = (unsigned long) (_Value);\
    }\
    else\
        _p_stContext_->cSectionValuesValid = 1;\
    _p_stContext_->stSectionValues.a_ulValues[_Num] = (unsigned long) (_Value);\
}
 
/*--*/
#define SCR_M_RdL0_SetSectionDouble(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if((_Offset) <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenSection != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_Sect_Open, _p_stContext_->p_stOpenSection);\
        _p_stContext_->p_stOpenSection->stSectionValues.a_dfValues[_Num] = (double) (_Value);\
    }\
    else\
        _p_stContext_->cSectionValuesValid = 1;\
    _p_stContext_->stSectionValues.a_dfValues[_Num] = (double) (_Value);\
}

/*
 *  To correct un error in SND module
 *  _Offset :   Offset of context.
 */
#define SCR_M_RdL0_ClearSectionContext(_Offset)\
{\
	SCR_tdst_Cxt_Description    *_p_stContext_;\
\
	SCR_M_Dbg_Assert_D((_Offset) > 0);\
	_p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
	_p_stContext_->cSectionValuesValid = 0;\
}
 
/*
 *  To get only one section value from a relative position.
 *  _Offset :   Offset of context.
 *  _Num    :   Number of the result.
 *  _Cast   :   To cast return value.
 *  _Value  :   To receive value.
 */
#define SCR_M_RdL0_GetSectionLong(_Offset, _Num, _Cast, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if((_Offset) <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenSection != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_Sect_Open, _p_stContext_->p_stOpenSection);\
        _Value = (_Cast) _p_stContext_->p_stOpenSection->stSectionValues.a_ulValues[_Num];\
    }\
    else\
        _Value = (_Cast) _p_stContext_->stSectionValues.a_ulValues[_Num];\
}
 
/*--*/
#define SCR_M_RdL0_GetSectionDouble(_Offset, _Num, _Value)\
{\
    SCR_tdst_Cxt_Description    *_p_stContext_;\
\
    SCR_M_Dbg_Assert_D((_Num) < SCR_CV_ui_Cfg_MaxResults);\
    _p_stContext_ = fnp_st_Cxt_Compute(_Offset);\
    if((_Offset) <= 0)\
    {\
        SCR_M_Dbg_Assert_D(_p_stContext_->p_stOpenSection != NULL);\
        SCR_M_Dbg_AssertStruct_P(SCR_tdst_SectOpen, _p_stContext_->p_stOpenSection);\
        _Value = _p_stContext_->p_stOpenSection->stSectionValues.a_dfValues[_Num];\
    }\
    else\
        _Value = _p_stContext_->stSectionValues.a_dfValues[_Num];\
}
 
/*
 *  To access a value from a struct.
 *  _Struct :   Structure to access.
 *  _Num    :   Number of the value.
 */
#define SCR_M_ul_RdL0_ExtractLongValue(_Struct, _Num)\
    ((_Struct)->a_ulValues[_Num])
#define SCR_M_df_RdL0_ExtractDoubleValue(_Struct, _Num)\
    ((_Struct)->a_dfValues[_Num])
 
/*
 *  To initialise a value in a struct.
 *  _Struct :   Structure to access.
 *  _Num    :   Number of the value.
 *  _Value  :   Value to initialise.
 */
#define SCR_M_RdL0_InitialiseLongValue(_Struct, _Num, _Value)\
    {(_Struct)->a_ulValues[_Num] = (_Value);}
#define SCR_M_RdL0_InitialiseDoubleValue(_Struct, _Num, _Value)\
    {(_Struct)->a_dfValues[_Num] = (_Value);}
 
#endif /* !__SCR_RdL0_h__Macros && !__Only_Types__ */
 
/*
 *=================================================================================================
 *  Protos.
 *=================================================================================================
 */
 
#if !defined(__SCR_RdL0_h__Protos) && !defined(__Only_Types__)
#define __SCR_RdL0_h__Protos
 
/*ANNECY CB*/
CPA_EXPORT extern char	gsz_Version[100];
CPA_EXPORT extern char	gsz_Version1[100];
extern char	gc_NoAsk;
/*END ANNECY*/
 
CPA_EXPORT extern void                      SCR_fn_v_RdL0_Init(void);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_Close(void);
 
CPA_EXPORT extern void                      SCR_fn_v_RdL0_RegisterCallback(char *, SCR_tdpfn_Anl_Callback, char);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_DeleteRegisterCallback(char *, char, char);
CPA_EXPORT extern SCR_tdst_Anl_Callback     *SCR_fnp_st_RdL0_GetRegisterCallback(char *, char);
 
CPA_EXPORT extern void                      SCR_fn_v_RdL0_OpenFile(char *);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_DeleteOpenFile(char *, char);
CPA_EXPORT extern SCR_tdst_File_Open        *SCR_fnp_st_RdL0_GetOpenFile(char *);
 
CPA_EXPORT extern void						SCR_fn_v_RdL0_SetPriorityPath(char *);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_RegisterPath(char *);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_DeleteRegisterPath(char *, char);
CPA_EXPORT extern SCR_tdst_File_Path        *SCR_fnp_st_RdL0_GetRegisterPath(char *);
 
CPA_EXPORT extern void                      SCR_fn_v_RdL0_DeleteOpenSection(char *, char);
CPA_EXPORT extern SCR_tdst_Sect_Open        *SCR_fnp_st_RdL0_GetOpenSection(char *, unsigned int);
 
CPA_EXPORT extern void                      SCR_fn_v_RdL0_RegisterVariable(char *, char *);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_DeleteRegisterVariable(char *, char);
CPA_EXPORT extern SCR_tdst_Vars_Description *SCR_fnp_st_RdL0_GetRegisterVariable(char *);
 
CPA_EXPORT extern SCR_tdst_Cxt_Values       *SCR_fnp_st_RdL0_AnalyseSection(char *, unsigned short);
 
CPA_EXPORT extern void                      SCR_fn_v_RdL0_SetValues(int, SCR_tdst_Cxt_Values *, SCR_tdst_Cxt_Values *, SCR_tdst_Cxt_Values *);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_GetValues(int, SCR_tdst_Cxt_Values *, SCR_tdst_Cxt_Values *, SCR_tdst_Cxt_Values *);
 
CPA_EXPORT extern SCR_tdpfn_Err_Callback    SCR_fnp_fn_RdL0_RegisterErrorCallback(SCR_tdpfn_Err_Callback, unsigned short);
CPA_EXPORT extern SCR_tdst_Err_GlobalError  *SCR_fnp_st_RdL0_GetLastError(void);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_ClearError(void);
 
CPA_EXPORT extern char                      SCR_fn_c_RdL0_IsSectionExists(char *);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_ValidatePath(char *, char *);
CPA_EXPORT extern unsigned char             SCR_fn_uc_RdL0_GetNumberOfParameters(char *[]);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_SplitSectionName(char *, char *, char *, char *);
CPA_EXPORT extern void						SCR_fn_v_RdL0_SplitCompletePath(char *, char *, char *);
CPA_EXPORT extern void                      SCR_fn_v_RdL0_ComputeSectionName(char *, char *, char *, char *);
 
CPA_EXPORT extern unsigned char				SCR_fn_uc_RdL0_GetCurrentFilePriority(void);
CPA_EXPORT extern void						SCR_fn_v_RdL0_SetCurrentFilePriority(unsigned char);
 
#endif /* !__SCR_RdL0_h__Protos && !__Only_Types__ */
