1 
2 
3 #include <assert.h>
4 #include <string.h>
5 #include <stdlib.h>
6 #include "ttwain_conversion.h"
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
TTWAIN_Fix32ToFloat(TW_FIX32 fix)12 float TTWAIN_Fix32ToFloat(TW_FIX32 fix) {
13   TW_INT32 val;
14   val = ((TW_INT32)fix.Whole << 16) | ((TW_UINT32)fix.Frac & 0xffff);
15   return (float)(val / 65536.0);
16 }
17 /*---------------------------------------------------------------------------*/
TTWAIN_FloatToFix32(float fl)18 TW_FIX32 TTWAIN_FloatToFix32(float fl) {
19   TW_FIX32 fix;
20   TW_INT32 val;
21   assert(sizeof(TW_FIX32) == sizeof(float));
22   assert(sizeof(TW_FIX32) == sizeof(long));
23 
24   /* Note 1: This round-away-from-0 is new in TWAIN 1.7
25 Note 2: ANSI C converts float to int by truncating toward 0.*/
26   val       = (TW_INT32)(fl * 65536.0 + (fl < 0 ? -0.5 : +0.5));
27   fix.Whole = (TW_INT16)(val >> 16);     /* most significant 16 bits */
28   fix.Frac  = (TW_UINT16)(val & 0xffff); /* least */
29 
30   return fix;
31 }
32 /*---------------------------------------------------------------------------*/
TTWAIN_ConvertRevStrToRevNum(const char * rev_str,TW_UINT16 * maj_num,TW_UINT16 * min_num)33 void TTWAIN_ConvertRevStrToRevNum(const char *rev_str, TW_UINT16 *maj_num,
34                                   TW_UINT16 *min_num) {
35   char *maj_str;
36   char *min_str;
37   size_t maj_size;
38   size_t min_size;
39 
40   *maj_num = *min_num = 0;
41   maj_size            = strcspn(rev_str, ".");
42   maj_str             = (char *)calloc(sizeof(char), maj_size + 1);
43   if (!maj_str) return;
44   memcpy(maj_str, rev_str, maj_size); /*already 0term*/
45   *maj_num = (TW_UINT16)atoi(maj_str);
46 
47   min_size = strlen(rev_str) - maj_size + 1;
48   min_str  = (char *)calloc(sizeof(char), min_size + 1);
49   if (!min_str) return;
50   memcpy(min_str, &(rev_str[maj_size + 1]), min_size); /*already 0term*/
51   *min_num = (TW_UINT16)atoi(min_str);
52   if (maj_str) free(maj_str);
53   if (min_str) free(min_str);
54 }
55 /*---------------------------------------------------------------------------*/
56 
57 #ifdef __cplusplus
58 }
59 #endif
60