* eina: Add eina_atofp.
authorCedric BAIL <cedric.bail@free.fr>
Fri, 25 Sep 2009 10:03:19 +0000 (10:03 +0000)
committerCedric BAIL <cedric.bail@free.fr>
Fri, 25 Sep 2009 10:03:19 +0000 (10:03 +0000)
SVN revision: 42694

legacy/eina/src/include/eina_convert.h
legacy/eina/src/lib/eina_convert.c
legacy/eina/src/tests/eina_test_convert.c

index e82dda5..e563ce4 100644 (file)
@@ -54,9 +54,12 @@ EAPI extern Eina_Error EINA_ERROR_CONVERT_OUTRUN_STRING_LENGTH;
 
 EAPI int eina_convert_itoa(int n, char *s)  EINA_ARG_NONNULL(2);
 EAPI int eina_convert_xtoa(unsigned int n, char *s) EINA_ARG_NONNULL(2);
+
 EAPI int eina_convert_dtoa(double d, char *des) EINA_ARG_NONNULL(2);
 EAPI Eina_Bool eina_convert_atod(const char *src, int length, long long *m, long *e)  EINA_ARG_NONNULL(1,3,4);
+
 EAPI int eina_convert_fptoa(Eina_F32p32 fp, char *des) EINA_ARG_NONNULL(2);
+EAPI Eina_Bool eina_convert_atofp(const char *src, int length, Eina_F32p32 *fp)  EINA_ARG_NONNULL(1,3);
 
 /**
  * @}
index 2676aeb..7f5562c 100644 (file)
@@ -72,28 +72,6 @@ static inline void reverse(char s[], int length)
      }
 }
 
-static inline Eina_F32p32 eina_f32p32_mul2(Eina_F32p32 fp)
-{
-   int64_t low;
-   int64_t high;
-
-   low = (fp & 0x00000000ffffffffLL) << 1;
-   high = (fp >> 32) << 33;
-
-   return low + high;
-}
-
-static inline Eina_F32p32 eina_f32p32_mul16(Eina_F32p32 fp)
-{
-   int64_t low;
-   int64_t high;
-
-   low = (fp & 0x00000000ffffffffLL) << 4;
-   high = (fp >> 32) << 36;
-
-   return low + high;
-}
-
 /**
  * @endcond
  */
@@ -707,6 +685,26 @@ eina_convert_fptoa(Eina_F32p32 fp, char *des)
    return length + eina_convert_itoa(p, des);
 }
 
+EAPI Eina_Bool
+eina_convert_atofp(const char *src, int length, Eina_F32p32 *fp)
+{
+   long long m;
+   long e;
+
+   if (!eina_convert_atod(src, length, &m, &e))
+     return EINA_FALSE;
+
+   if (fp)
+     {
+       e += 32;
+
+       if (e > 0) *fp = m << e;
+       else *fp = m >> e;
+     }
+
+   return EINA_TRUE;
+}
+
 /**
  * @}
  */
index fb07611..cb13f19 100644 (file)
@@ -105,15 +105,27 @@ _eina_convert_fp_check(double d, Eina_F32p32 fp, int length)
 {
    char tmp1[128];
    char tmp2[128];
+   Eina_F32p32 fpc;
+   double fpd;
    int l1;
    int l2;
 
    l1 = eina_convert_dtoa(d, tmp1);
    l2 = eina_convert_fptoa(fp, tmp2);
+/*    fprintf(stderr, "[%s](%i) vs [%s](%i)\n", tmp1, l1, tmp2, l2); */
    fail_if(l1 != l2);
    fail_if(length != l1);
    fail_if(strcmp(tmp1, tmp2) != 0);
 
+   fail_if(!eina_convert_atofp(tmp2, l2, &fpc));
+/*    fprintf(stderr, "%016x vs %016x\n", fpc, fp); */
+   fail_if(fpc != fp);
+
+   fail_if(!eina_convert_atofp(tmp1, l1, &fpc));
+   fpd = eina_f32p32_double_to(fpc);
+/*    fprintf(stderr, "%0.16f vs %0.16f\n", fpd, d); */
+   fail_if(fabs(fpd - d) > DBL_MIN);
+
    d = -d;
    fp = -fp;
 
@@ -122,6 +134,15 @@ _eina_convert_fp_check(double d, Eina_F32p32 fp, int length)
    fail_if(l1 != l2);
    fail_if(length + 1 != l1);
    fail_if(strcmp(tmp1, tmp2) != 0);
+
+   fail_if(!eina_convert_atofp(tmp2, l2, &fpc));
+/*    fprintf(stderr, "%016x vs %016x\n", fpc, fp); */
+   fail_if(fpc != fp);
+
+   fail_if(!eina_convert_atofp(tmp1, l1, &fpc));
+   fpd = eina_f32p32_double_to(fpc);
+/*    fprintf(stderr, "%0.16f vs %0.16f\n", fpd, d); */
+   fail_if(fabs(fpd - d) > DBL_MIN);
 }
 
 START_TEST(eina_convert_fp)