00001
00004 #include "dt_value.h"
00005
00006 #include "dt_node.h"
00007 #include <stdio.h>
00008 #include <string.h>
00009 #include <stdlib.h>
00010 #include <ctype.h>
00011
00012
00013 dt_node* dt_make_bool( int i )
00014 {
00015 return dt_make_str( i ? "YES" : "NO" );
00016 }
00017
00018 dt_node* dt_make_int ( long i )
00019 {
00020 char buf[32];
00021 sprintf(buf, "%li", i );
00022 return dt_make_str( buf );
00023 }
00024
00025 dt_node* dt_make_uint( unsigned long u )
00026 {
00027 char buf[32];
00028 sprintf(buf, "%lu", u );
00029 return dt_make_str( buf );
00030 }
00031
00032 dt_node* dt_make_str ( const char* s )
00033 {
00034 return dt_make_leaf( (dt_byte*)s, strlen(s) );
00035 }
00036
00037 dt_node* dt_make_float( double f )
00038 {
00039 char buf[64];
00040 sprintf(buf, "%g", f );
00041 return dt_make_str( buf );
00042 }
00043
00044
00045
00046 dt_bool dt_read_bool ( dt_node const* node, int* b )
00047 {
00048 dt_byte* buf;
00049 size_t len;
00050 if( dt_leaf_get_data(node,&buf,&len) )
00051 {
00052 if( 3 == len
00053 && tolower((int)buf[0])=='y'
00054 && tolower((int)buf[1])=='e'
00055 && tolower((int)buf[2])=='s'
00056 ) { *b = 1; return 1; }
00057 if( 2 == len
00058 && tolower((int)buf[0])=='n'
00059 && tolower((int)buf[1])=='o'
00060 ) { *b = 0; return 1; }
00061 }
00062 return 0;
00063 }
00064
00065 dt_bool dt_read_int ( dt_node const* node, long* i )
00066 {
00067 char buf[32];
00068 char* end;
00069 long v;
00070 if( ! dt_read_strn( node, buf, sizeof(buf) ) ) return 0;
00071 v = strtol( buf, &end, 10 );
00072 if( *end != '\0' ) return 0;
00073 *i = v;
00074 return 1;
00075 }
00076
00077 dt_bool dt_read_uint ( dt_node const* node, unsigned long* u )
00078 {
00079 char buf[32];
00080 char* end;
00081 unsigned long v;
00082 if( ! dt_read_strn( node, buf, sizeof(buf) ) ) return 0;
00083 v = strtoul( buf, &end, 10 );
00084 if( *end != '\0' ) return 0;
00085 *u = v;
00086 return 1;
00087 }
00088
00089 dt_bool dt_read_float( dt_node const* node, double* f )
00090 {
00091 char buf[64];
00092 char* end;
00093 double v;
00094 if( ! dt_read_strn( node, buf, sizeof(buf) ) ) return 0;
00095 v = strtod( buf, &end );
00096 if( *end != '\0' ) return 0;
00097 *f = v;
00098 return 1;
00099 }
00100
00101
00102 dt_bool dt_read_strn ( dt_node const* node, char* buf, size_t bufSize )
00103 {
00104 char* strbuf;
00105 int i;
00106 dt_byte* binbuf;
00107 size_t len;
00108 if( ! dt_leaf_get_data(node,&binbuf,&len)
00109 || len >= bufSize
00110 ) return 0;
00111 strbuf = (char*)binbuf;
00112 for( i = 0 ; i!=len ; ++i )
00113 if(strbuf[i]=='\0') return 0;
00114 memcpy( buf, binbuf, len );
00115 buf[len] = '\0';
00116 return 1;
00117 }
00118
00119 dt_bool dt_read_str_dyn( dt_node const* node, char** s )
00120 {
00121 char *strbuf, *dst;
00122 int i;
00123 dt_byte* binbuf;
00124 size_t len;
00125 if( ! dt_leaf_get_data(node,&binbuf,&len) ) return 0;
00126 strbuf = (char*)binbuf;
00127 for( i = 0 ; i!=len ; ++i )
00128 if(strbuf[i]=='\0') return 0;
00129 dst = (char*)realloc( *s, len+1 );
00130 if( dst == 0 ) return 0;
00131 *s = dst;
00132 memcpy( dst, binbuf, len );
00133 dst[len] = '\0';
00134 return 1;
00135 }
00136
00137
00138
00139