📄 ta_abstract.c
字号:
const TA_FuncDef *funcDef; if( !funcInfo || !handle ) { return TA_BAD_PARAM; } /* Validate that this is a valid funcHandle. */ funcDef = (const TA_FuncDef *)handle; if( funcDef->magicNumber != TA_FUNC_DEF_MAGIC_NB ) { return TA_INVALID_HANDLE; } *funcInfo = funcDef->funcInfo; if( !funcDef->funcInfo ) return TA_INVALID_HANDLE; return TA_SUCCESS;}TA_RetCode TA_GetInputParameterInfo( const TA_FuncHandle *handle, unsigned int paramIndex, const TA_InputParameterInfo **info ){ const TA_FuncDef *funcDef; const TA_FuncInfo *funcInfo; const TA_InputParameterInfo **inputTable; if( (handle == NULL) || (info == NULL) ) { return TA_BAD_PARAM; } *info = NULL; /* Validate that this is a valid funcHandle. */ funcDef = (const TA_FuncDef *)handle; if( funcDef->magicNumber != TA_FUNC_DEF_MAGIC_NB ) { return TA_INVALID_HANDLE; } funcInfo = funcDef->funcInfo; if( !funcInfo ) return TA_INVALID_HANDLE; if( paramIndex >= funcInfo->nbInput ) { return TA_BAD_PARAM; } inputTable = (const TA_InputParameterInfo **)funcDef->input; if( !inputTable ) return TA_INTERNAL_ERROR(2); *info = inputTable[paramIndex]; if( !(*info) ) return TA_INTERNAL_ERROR(3); return TA_SUCCESS;}TA_RetCode TA_GetOptInputParameterInfo( const TA_FuncHandle *handle, unsigned int paramIndex, const TA_OptInputParameterInfo **info ){ const TA_FuncDef *funcDef; const TA_FuncInfo *funcInfo; const TA_OptInputParameterInfo **inputTable; if( (handle == NULL) || (info == NULL) ) { return TA_BAD_PARAM; } *info = NULL; /* Validate that this is a valid funcHandle. */ funcDef = (const TA_FuncDef *)handle; if( funcDef->magicNumber != TA_FUNC_DEF_MAGIC_NB ) { return TA_INVALID_HANDLE; } funcInfo = funcDef->funcInfo; if( !funcInfo ) return TA_INVALID_HANDLE; if( paramIndex >= funcInfo->nbOptInput ) { return TA_BAD_PARAM; } inputTable = (const TA_OptInputParameterInfo **)funcDef->optInput; if( !inputTable ) return TA_INTERNAL_ERROR(3); *info = inputTable[paramIndex]; if( !(*info) ) return TA_INTERNAL_ERROR(4); return TA_SUCCESS;}TA_RetCode TA_GetOutputParameterInfo( const TA_FuncHandle *handle, unsigned int paramIndex, const TA_OutputParameterInfo **info ){ const TA_FuncDef *funcDef; const TA_FuncInfo *funcInfo; const TA_OutputParameterInfo **outputTable; if( (handle == NULL) || (info == NULL) ) { return TA_BAD_PARAM; } *info = NULL; /* Validate that this is a valid funcHandle. */ funcDef = (const TA_FuncDef *)handle; if( funcDef->magicNumber != TA_FUNC_DEF_MAGIC_NB ) { return TA_INVALID_HANDLE; } funcInfo = funcDef->funcInfo; if( !funcInfo ) { return TA_INVALID_HANDLE; } if( paramIndex >= funcInfo->nbOutput ) { return TA_BAD_PARAM; } outputTable = (const TA_OutputParameterInfo **)funcDef->output; if( !outputTable ) { return TA_INTERNAL_ERROR(4); } *info = outputTable[paramIndex]; if( !(*info) ) { return TA_INTERNAL_ERROR(5); } return TA_SUCCESS;}TA_RetCode TA_ParamHolderAlloc( const TA_FuncHandle *handle, TA_ParamHolder **allocatedParams ){ TA_FuncDef *funcDef; unsigned int allocSize, i; TA_ParamHolderInput *input; TA_ParamHolderOptInput *optInput; TA_ParamHolderOutput *output; const TA_FuncInfo *funcInfo; TA_ParamHolder *newParams; TA_ParamHolderPriv *newParamsPriv; const TA_InputParameterInfo **inputInfo; const TA_OptInputParameterInfo **optInputInfo; const TA_OutputParameterInfo **outputInfo; /* Validate the parameters. */ if( !handle || !allocatedParams) { return TA_BAD_PARAM; } /* Validate that this is a valid funcHandle. */ funcDef = (TA_FuncDef *)handle; if( funcDef->magicNumber != TA_FUNC_DEF_MAGIC_NB ) { *allocatedParams = NULL; return TA_INVALID_HANDLE; } /* Get the TA_FuncInfo. */ funcInfo = funcDef->funcInfo; if( !funcInfo ) return TA_INVALID_HANDLE; /* Allocate the TA_ParamHolder. */ newParams = (TA_ParamHolder *)TA_Malloc( sizeof(TA_ParamHolder) + sizeof(TA_ParamHolderPriv)); if( !newParams ) { *allocatedParams = NULL; return TA_ALLOC_ERR; } memset( newParams, 0, sizeof(TA_ParamHolder) + sizeof(TA_ParamHolderPriv) ); newParamsPriv = (TA_ParamHolderPriv *)(((char *)newParams)+sizeof(TA_ParamHolder)); newParamsPriv->magicNumber = TA_PARAM_HOLDER_PRIV_MAGIC_NB; newParams->hiddenData = newParamsPriv; /* From this point, TA_ParamHolderFree can be safely called. */ /* Allocate the array of structure holding the info * for each parameter. */ if( funcInfo->nbInput == 0 ) return TA_INTERNAL_ERROR(2); allocSize = (funcInfo->nbInput) * sizeof(TA_ParamHolderInput); input = (TA_ParamHolderInput *)TA_Malloc( allocSize ); if( !input ) { TA_ParamHolderFree( newParams ); *allocatedParams = NULL; return TA_ALLOC_ERR; } memset( input, 0, allocSize ); newParamsPriv->in = input; if( funcInfo->nbOptInput == 0 ) optInput = NULL; else { allocSize = (funcInfo->nbOptInput) * sizeof(TA_ParamHolderOptInput); optInput = (TA_ParamHolderOptInput *)TA_Malloc( allocSize ); if( !optInput ) { TA_ParamHolderFree( newParams ); *allocatedParams = NULL; return TA_ALLOC_ERR; } memset( optInput, 0, allocSize ); } newParamsPriv->optIn = optInput; allocSize = (funcInfo->nbOutput) * sizeof(TA_ParamHolderOutput); output = (TA_ParamHolderOutput *)TA_Malloc( allocSize ); if( !output ) { TA_ParamHolderFree( newParams ); *allocatedParams = NULL; return TA_ALLOC_ERR; } memset( output, 0, allocSize ); newParamsPriv->out = output; newParamsPriv->funcInfo = funcInfo; inputInfo = (const TA_InputParameterInfo **)funcDef->input; optInputInfo = (const TA_OptInputParameterInfo **)funcDef->optInput; outputInfo = (const TA_OutputParameterInfo **)funcDef->output; for( i=0; i < funcInfo->nbInput; i++ ) { input[i].inputInfo = inputInfo[i]; newParamsPriv->inBitmap <<= 1; newParamsPriv->inBitmap |= 1; } for( i=0; i < funcInfo->nbOptInput; i++ ) { optInput[i].optInputInfo = optInputInfo[i]; if( optInput[i].optInputInfo->type == TA_OptInput_RealRange ) optInput[i].data.optInReal = optInputInfo[i]->defaultValue; else optInput[i].data.optInInteger = (TA_Integer)optInputInfo[i]->defaultValue; } for( i=0; i < funcInfo->nbOutput; i++ ) { output[i].outputInfo = outputInfo[i]; newParamsPriv->outBitmap <<= 1; newParamsPriv->outBitmap |= 1; } /* Succcess, return the result to the caller. */ *allocatedParams = newParams; return TA_SUCCESS;}TA_RetCode TA_ParamHolderFree( TA_ParamHolder *paramsToFree ){ TA_ParamHolderPriv *paramPriv; TA_ParamHolderInput *input; TA_ParamHolderOptInput *optInput; TA_ParamHolderOutput *output; if( !paramsToFree ) { return TA_SUCCESS; } paramPriv = paramsToFree->hiddenData; if( !paramPriv ) { return TA_INVALID_PARAM_HOLDER; } if( paramPriv->magicNumber != TA_PARAM_HOLDER_PRIV_MAGIC_NB ) { return TA_INVALID_PARAM_HOLDER; } optInput = paramPriv->optIn; if( optInput ) TA_Free( optInput ); input = paramPriv->in; if( input ) TA_Free( input ); output = paramPriv->out; if( output ) TA_Free( output ); TA_Free( paramsToFree ); return TA_SUCCESS;}TA_RetCode TA_SetInputParamIntegerPtr( TA_ParamHolder *param, unsigned int paramIndex, const TA_Integer *value ){ TA_ParamHolderPriv *paramHolderPriv; const TA_InputParameterInfo *paramInfo; const TA_FuncInfo *funcInfo; if( (param == NULL) || (value == NULL) ) { return TA_BAD_PARAM; } paramHolderPriv = (TA_ParamHolderPriv *)(param->hiddenData); if( paramHolderPriv->magicNumber != TA_PARAM_HOLDER_PRIV_MAGIC_NB ) { return TA_INVALID_PARAM_HOLDER; } /* Make sure this index really exist. */ funcInfo = paramHolderPriv->funcInfo; if( !funcInfo ) return TA_INVALID_HANDLE; if( paramIndex >= funcInfo->nbInput ) { return TA_BAD_PARAM; } /* Verify the type of the parameter. */ paramInfo = paramHolderPriv->in[paramIndex].inputInfo; if( !paramInfo ) return TA_INTERNAL_ERROR(2); if( paramInfo->type != TA_Input_Integer ) { return TA_INVALID_PARAM_HOLDER_TYPE; } /* keep a copy of the provided parameter. */ paramHolderPriv->in[paramIndex].data.inInteger = value; /* This parameter is now initialized, clear the corresponding bit. */ paramHolderPriv->inBitmap &= ~(1<<paramIndex); return TA_SUCCESS;}TA_RetCode TA_SetInputParamRealPtr( TA_ParamHolder *param, unsigned int paramIndex, const TA_Real *value ){ TA_ParamHolderPriv *paramHolderPriv; const TA_InputParameterInfo *paramInfo; const TA_FuncInfo *funcInfo; if( (param == NULL) || (value == NULL) ) { return TA_BAD_PARAM; } paramHolderPriv = (TA_ParamHolderPriv *)(param->hiddenData); if( paramHolderPriv->magicNumber != TA_PARAM_HOLDER_PRIV_MAGIC_NB ) { return TA_INVALID_PARAM_HOLDER; } /* Make sure this index really exist. */ funcInfo = paramHolderPriv->funcInfo; if( !funcInfo ) return TA_INVALID_HANDLE; if( paramIndex >= funcInfo->nbInput ) { return TA_BAD_PARAM; } /* Verify the type of the parameter. */ paramInfo = paramHolderPriv->in[paramIndex].inputInfo; if( !paramInfo ) return TA_INTERNAL_ERROR(2); if( paramInfo->type != TA_Input_Real ) { return TA_INVALID_PARAM_HOLDER_TYPE; } /* keep a copy of the provided parameter. */ paramHolderPriv->in[paramIndex].data.inReal = value; /* This parameter is now initialized, clear the corresponding bit. */ paramHolderPriv->inBitmap &= ~(1<<paramIndex); return TA_SUCCESS;}TA_RetCode TA_SetInputParamPricePtr( TA_ParamHolder *param, unsigned int paramIndex, const TA_Real *open, const TA_Real *high, const TA_Real *low, const TA_Real *close, const TA_Real *volume, const TA_Real *openInterest ){ TA_ParamHolderPriv *paramHolderPriv; const TA_InputParameterInfo *paramInfo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -