/* ========================================================================== */ static stringToComplexError ParseComplexValue(const char *tx, BOOL bConvertByNAN, double *real, double *imag) { stringToDoubleError ierrDouble = STRINGTODOUBLE_NO_ERROR; stringToComplexError ierr = STRINGTOCOMPLEX_NO_ERROR; char *rnum_string = NULL; char *inum_string = NULL; size_t lnum = 0; BOOL haveImagI = FALSE; char *modifiedTxt = NULL; *real = stringToDouble(tx, FALSE, &ierrDouble); *imag = 0; /* test on strlen(tx) > 1 to remove case 'e' */ if ((int)strlen(tx) < 2) { if (ierrDouble == STRINGTODOUBLE_NO_ERROR) { ierr = (stringToComplexError) ierrDouble; } else { if (bConvertByNAN) { ierrDouble = STRINGTODOUBLE_NOT_A_NUMBER; *real = returnNAN(); *imag = 0; } else { *real = 0; *imag = 0; ierr = (stringToComplexError) ierrDouble; } } } else if (ierrDouble != STRINGTODOUBLE_NO_ERROR) { modifiedTxt = csv_strsubst(tx, ComplexScilab, ComplexI); lnum = ParseNumber(modifiedTxt); if (lnum <= 1) { /* manages special cases nan + nani, ... */ if (strnicmp(modifiedTxt, NanString, strlen(NanString)) == 0) { lnum = strlen(NanString); } else if (strnicmp(modifiedTxt, InfString, strlen(InfString)) == 0) { lnum = strlen(InfString); } else if (strnicmp(modifiedTxt, NegInfString, strlen(NegInfString)) == 0) { lnum = strlen(NegInfString); } else if (strnicmp(modifiedTxt, PosInfString, strlen(PosInfString)) == 0) { lnum = strlen(PosInfString); } else if (strnicmp(modifiedTxt, NegNanString, strlen(NegNanString)) == 0) { lnum = strlen(NegNanString); } else if (strnicmp(modifiedTxt, PosNanString, strlen(PosNanString)) == 0) { lnum = strlen(PosNanString); } } inum_string = midstring(modifiedTxt, lnum, -1); if ((inum_string[strlen(inum_string) - 1] == 'i') || (inum_string[strlen(inum_string) - 1] == 'j')) { inum_string[strlen(inum_string) - 1] = 0; if (inum_string[strlen(inum_string) - 1] == '*') { inum_string[strlen(inum_string) - 1] = 0; } if (strcmp(inum_string, "+") == 0) { FREE(inum_string); inum_string = strdup("+1"); } if (strcmp(inum_string, "-") == 0) { FREE(inum_string); inum_string = strdup("-1"); } haveImagI = TRUE; } else { haveImagI = FALSE; } rnum_string = leftstring(modifiedTxt, lnum); if (strcmp(inum_string, "") == 0) { *imag = stringToDouble(rnum_string, bConvertByNAN, &ierrDouble); ierr = (stringToComplexError)(ierrDouble); *real = 0.; } else { double dReal = 0.; double dImag = 0.; stringToDoubleError ierrReal = STRINGTODOUBLE_NO_ERROR; stringToDoubleError ierrImag = STRINGTODOUBLE_NO_ERROR; dReal = stringToDouble(rnum_string, FALSE, &ierrReal); dImag = stringToDouble(inum_string, FALSE, &ierrImag); if ((ierrReal == STRINGTODOUBLE_NO_ERROR) && (ierrImag == STRINGTODOUBLE_NO_ERROR)) { if (!haveImagI) { if (bConvertByNAN) { ierr = STRINGTOCOMPLEX_NO_ERROR; *real = returnNAN(); *imag = 0.; } else { ierr = STRINGTOCOMPLEX_ERROR; } } else { ierr = STRINGTOCOMPLEX_NO_ERROR; *real = dReal; *imag = dImag; } } else { if (bConvertByNAN) { ierr = STRINGTOCOMPLEX_NO_ERROR; *real = returnNAN(); *imag = 0.; } else { ierr = STRINGTOCOMPLEX_ERROR; } } } if (rnum_string) { FREE(rnum_string); rnum_string = NULL; } if (inum_string) { FREE(inum_string); inum_string = NULL; } if (modifiedTxt) { FREE(modifiedTxt); modifiedTxt = NULL; } } return ierr; }
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; }