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; }
/*--------------------------------------------------------------------------*/ 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; }
/*--------------------------------------------------------------------------*/ 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; }