Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

dt_value.c

Go to the documentation of this file.
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 ) // reject if has null chars --> not a valid C string
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 ) // reject if has null chars --> not a valid C string
00128       if(strbuf[i]=='\0') return 0;
00129    dst = (char*)realloc( *s, len+1 );
00130    if( dst == 0 ) return 0; // failed to allocate memory
00131    *s = dst;
00132    memcpy( dst, binbuf, len );
00133    dst[len] = '\0';
00134    return 1;
00135 }
00136 
00137 
00138 
00139 

Generated on Sun Jun 1 16:35:38 2003 for datatree by doxygen 1.3.1