Beispiel #1
0
double stringToDouble(const char *pSTR, BOOL bConvertByNAN, stringToDoubleError *ierr)
{
    double dValue = 0.0;
    *ierr = STRINGTODOUBLE_ERROR;
    if (pSTR)
    {
        if ((stricmp(pSTR, NanString) == 0) || (stricmp(pSTR, NegNanString) == 0) ||
                (stricmp(pSTR, PosNanString) == 0) || (stricmp(pSTR, ScilabPosNanString) == 0) ||
                (stricmp(pSTR, ScilabNanString) == 0) || (stricmp(pSTR, ScilabNegNanString) == 0))
        {
            dValue = returnNAN();
        }
        else if ((stricmp(pSTR, InfString) == 0) || (stricmp(pSTR, PosInfString) == 0) ||
                 (stricmp(pSTR, ScilabInfString) == 0) || (stricmp(pSTR, ScilabPosInfString) == 0))
        {
            dValue = returnINF(TRUE);
        }
        else if ((stricmp(pSTR, NegInfString) == 0) || (stricmp(pSTR, ScilabNegInfString) == 0))
        {
            dValue = returnINF(FALSE);
        }
        else if ((stricmp(pSTR, ScilabPiString) == 0) || (stricmp(pSTR, ScilabPosPiString) == 0))
        {
            dValue = M_PI;
        }
        else if (stricmp(pSTR, ScilabNegPiString) == 0)
        {
            dValue = -M_PI;
        }
        else
        {
            char* pstReplaced = replace_D_By_E(pSTR);
            char *pEnd = NULL;
            double v = strtod(pstReplaced, &pEnd);
            if ((v == 0) && (pEnd == pstReplaced))
            {
                if (bConvertByNAN)
                {
                    dValue = returnNAN();
                }
                else
                {
                    *ierr = STRINGTODOUBLE_NOT_A_NUMBER;
                    FREE(pstReplaced);
                    return (dValue = 0.0);
                }
            }
            else
            {
                if (strcmp(pEnd, "") == 0)
                {
                    dValue = v;
                }
                else
                {
                    if (bConvertByNAN)
                    {
                        dValue = returnNAN();
                    }
                    else
                    {
                        *ierr = STRINGTODOUBLE_NOT_A_NUMBER;
                        FREE(pstReplaced);
                        return (dValue = 0.0);
                    }
                }
            }

            FREE(pstReplaced);
        }
        *ierr = STRINGTODOUBLE_NO_ERROR;
    }
    else
    {
        *ierr = STRINGTODOUBLE_MEMORY_ALLOCATION;
    }
    return dValue;
}
Beispiel #2
0
/*--------------------------------------------------------------------------*/
static double *getDoubleValuesInLine(char *line,
                                     char *format, char *separator,
                                     int nbColumnsMax)
{
    double *dValues = NULL;

    if (line && format && separator)
    {
        int nbTokens = 0;
        char **splittedStr = splitLine(line, separator, &nbTokens, 0);
        if (splittedStr)
        {
            int i = 0;
            dValues = (double*)MALLOC(sizeof(double) * nbColumnsMax);
            for (i = 0; i < nbColumnsMax; i++)
            {
                int ierr = 0;
                double dValue = 0.;
                char *cleanedFormat = getCleanedFormat(format);
                int iLen = strlen(cleanedFormat);
                switch (cleanedFormat[iLen - 1])
                {
                    case 'e' :
                    case 'g' :
                    case 'f' :
                    {
                        if (cleanedFormat[iLen - 2] == 'l')
                        {
                            double tmp = 0.;
                            ierr = sscanf(splittedStr[i], cleanedFormat, &tmp);
                            dValue = tmp;
                        }
                        else
                        {
                            float tmp = 0.;
                            ierr = sscanf(splittedStr[i], cleanedFormat, &tmp);
                            dValue = tmp;
                        }
                        break;
                    }
                    case 'd' :
                    case 'i' :
                    {
                        int tmp = 0;
                        ierr = sscanf(splittedStr[i], cleanedFormat, &tmp);
                        dValue = tmp;
                        break;
                    }
                }

                FREE(cleanedFormat);

                if ((ierr != 0) && (ierr != EOF))
                {
                    dValues[i] = dValue;
                }
                else
                {
                    char *str = os_strdup(line);
                    strcpy(str, "");
                    ierr = sscanf(splittedStr[i], "%4s", str);
                    if ((ierr != 0) && (ierr != EOF))
                    {
                        if ( (strcmp(str, NanString) == 0) ||
                                (strcmp(str, NegInfString) == 0) ||
                                (strcmp(str, InfString) == 0) )
                        {
                            if (strcmp(str, NanString) == 0)
                            {
                                dValues[i] = returnNAN();
                            }

                            if (strcmp(str, NegInfString) == 0)
                            {
                                dValues[i] = returnINF(FALSE);
                            }

                            if (strcmp(str, InfString) == 0)
                            {
                                dValues[i] = returnINF(TRUE);
                            }
                        }
                        else
                        {
                            freeArrayOfString(splittedStr, nbTokens);
                            FREE(dValues);
                            dValues = NULL;
                            FREE(str);
                            str = NULL;
                            return NULL;
                        }
                    }
                    else
                    {
                        freeArrayOfString(splittedStr, nbTokens);
                        FREE(dValues);
                        dValues = NULL;
                        FREE(str);
                        str = NULL;
                        return NULL;
                    }
                    FREE(str);
                    str = NULL;
                }
            }
            freeArrayOfString(splittedStr, nbTokens);
        }
    }

    return dValues;
}
Beispiel #3
0
/*--------------------------------------------------------------------------*/
static double *getDoubleValuesInLine(char *line,
                                     char *format, char *separator,
                                     int nbColumnsMax)
{
    double *dValues = NULL;

    if (line && format && separator)
    {
        int nbTokens = 0;
        char **splittedStr = splitLine(line, separator, &nbTokens, 0);
        if (splittedStr)
        {
            int i = 0;
            dValues = (double*)MALLOC(sizeof(double) * nbColumnsMax);
            for (i = 0; i < nbColumnsMax; i++)
            {
                double dValue = 0.;
                int ierr = sscanf(splittedStr[i], format, &dValue);
                if ((ierr != 0) && (ierr != EOF))
                {
                    dValues[i] = dValue;
                }
                else
                {
                    char *str = strdup(line);
                    strcpy(str, "");
                    ierr = sscanf(splittedStr[i], "%4s", str);
                    if ((ierr != 0) && (ierr != EOF))
                    {
                        if ( (strcmp(str, NanString) == 0) ||
                                (strcmp(str, NegInfString) == 0) ||
                                (strcmp(str, InfString) == 0) )
                        {
                            if (strcmp(str, NanString) == 0)
                            {
                                dValues[i] = returnNAN();
                            }

                            if (strcmp(str, NegInfString) == 0)
                            {
                                dValues[i] = returnINF(FALSE);
                            }

                            if (strcmp(str, InfString) == 0)
                            {
                                dValues[i] = returnINF(TRUE);
                            }
                        }
                        else
                        {
                            freeArrayOfString(splittedStr, nbTokens);
                            FREE(dValues);
                            dValues = NULL;
                            FREE(str);
                            str = NULL;
                            return NULL;
                        }
                    }
                    else
                    {
                        freeArrayOfString(splittedStr, nbTokens);
                        FREE(dValues);
                        dValues = NULL;
                        FREE(str);
                        str = NULL;
                        return NULL;
                    }
                    FREE(str);
                    str = NULL;
                }
            }
            freeArrayOfString(splittedStr, nbTokens);
        }
    }

    return dValues;
}