Changeset 144


Ignore:
Timestamp:
02/26/14 20:04:49 (6 years ago)
Author:
sz
Message:

Param and ExtValue? improvements (better control on conversions, "load" returns the number of loaded fields)

Location:
cpp/frams
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/param/param.cpp

    r124 r144  
    331331}
    332332
    333 void ParamInterface::load(VirtFILE* f)
     333int ParamInterface::load(VirtFILE* f)
    334334{
    335335SString buf;
     
    338338int p_len;
    339339bool loaded;
     340int fields_loaded=0;
    340341while(loadSStringLine(f,buf))
    341342        {
     
    361362                        set(i,p0+p_len+1);
    362363                        }
     364                fields_loaded++;
    363365                loaded=true;
    364366                }
     
    370372                }
    371373        }
     374return fields_loaded;
    372375}
    373376
     
    444447        }
    445448else
    446         return setInt(i,atol(str));
     449        return setInt(i,ExtValue::getInt(str));
    447450}
    448451
     
    458461        }
    459462else
    460         return setDouble(i,atof(str));
     463        return setDouble(i,ExtValue::getDouble(str));
    461464}
    462465
     
    465468switch(type(i)[0])
    466469        {
    467         case 'd': if (v.type!=TObj) return setInt(i,v.getInt()); else return setInt(i,(const char*)v.getString());
    468         case 'f': if (v.type!=TObj) return setDouble(i,v.getDouble()); else return setDouble(i,(const char*)v.getString());
     470        case 'd':
     471                if ((v.type==TInt)||(v.type==TDouble)) return setInt(i,v.getInt());
     472                else
     473                        {
     474                        if (v.type==TObj)
     475                                FMprintf("ParamInterface","set",FMLV_WARN,"Getting integer value from object reference (%s)",(const char*)v.getString());
     476                        return setInt(i,(const char*)v.getString());
     477                        }
     478        case 'f':
     479                if ((v.type==TInt)||(v.type==TDouble)) return setDouble(i,v.getDouble());
     480                else
     481                        {
     482                        if (v.type==TObj)
     483                                FMprintf("ParamInterface","set",FMLV_WARN,"Getting floating point value from object reference (%s)",(const char*)v.getString());
     484                        return setDouble(i,(const char*)v.getString());
     485                        }
    469486        case 's': { SString t=v.getString(); return setString(i,t); }
    470487        case 'o': return setObject(i,v.getObject());
    471488        case 'x': return setExtValue(i,v);
    472         default: FMprintf("ParamInterface","get",FMLV_ERROR,"'%s.%s' is not a field",getName(),id(i));
     489        default: FMprintf("ParamInterface","set",FMLV_ERROR,"'%s.%s' is not a field",getName(),id(i));
    473490        }
    474491return 0;
     
    826843}
    827844
    828 void ParamInterface::load2(const SString &s,int &poz)
     845int ParamInterface::load2(const SString &s,int &poz)
    829846{
    830847int i; // numer akt. parametru
     
    832849int len;
    833850int ret;
     851int fields_loaded=0;
    834852const char *t,*lin,*end;
    835853const char *rownasie,*przecinek;
     
    838856const char *value,*valstop;
    839857SString tmpvalue;
    840 if (poz>=s.len()) return;
     858if (poz>=s.len()) return fields_loaded;
    841859t=(const char*)s+poz;
    842860
    843861// na razie wszystko musi byc w jednej linii...
    844862lin=getline(s,poz,len);
    845 if (!len) return; // pusta linia = koniec
     863if (!len) return fields_loaded; // pusta linia = koniec
    846864i=0;
    847865end=lin+len;
     
    849867{
    850868// przetwarzanie jednego par
    851 while (strchr(" \n\r\t",*t)) if (t<end) t++; else return;
     869while (strchr(" \n\r\t",*t)) if (t<end) t++; else return fields_loaded;
    852870
    853871przecinek=strchrlimit(t,',',end); if (!przecinek) przecinek=end;
     
    908926        *(char*)valstop=0;
    909927        ret=set(i,value);
     928        fields_loaded++;
    910929        if (ret&(PSET_HITMAX|PSET_HITMIN))
    911930                FMprintf("Param","load2",FMLV_WARN,"Adjusted '%s' in '%s' (was too %s)",
     
    916935if (i>=0) i++;
    917936#ifdef __CODEGUARD__
    918 if (przecinek<end-1) t=przecinek+1; else return;
     937if (przecinek<end-1) t=przecinek+1; else return fields_loaded;
    919938#else
    920939t=przecinek+1;
    921940#endif
    922941}
    923 return;
     942return fields_loaded;
    924943}
    925944
  • cpp/frams/param/param.h

    r124 r144  
    154154int save(VirtFILE*,const char* altname=NULL,bool force=0);
    155155int saveprop(VirtFILE*,int i,const char* p,bool force=0);
    156 void load(VirtFILE*);
    157 void load2(const SString &,int &);
     156int load(VirtFILE*);///< @return number of fields loaded
     157int load2(const SString &,int &);///< @return number of fields loaded
    158158
    159159static const char* SERIALIZATION_PREFIX;
  • cpp/frams/util/extvalue.cpp

    r121 r144  
    250250}
    251251
     252static long compareNull(const ExtValue& v)
     253{
     254switch(v.type)
     255        {
     256        case TDouble: return v.getDouble()!=0.0;
     257        case TInt: return v.getInt()?1:0;
     258        case TString: return 1;
     259        default: return !v.isNull();
     260        }
     261}
     262
    252263long ExtValue::compare(const ExtValue& src) const
    253264{
    254265if (type==TUnknown)
    255         {
    256         if (src.type==TDouble)
    257                 return (src.getDouble()!=0.0);
    258         if (src.type==TString)
    259                 return 1;
    260         return src.getInt()?1:0;
    261         }
     266        return compareNull(src);
    262267else if (src.type==TUnknown)
    263         {
    264         if (type==TDouble)
    265                 return (getDouble()!=0.0);
    266         if (type==TString)
    267                 return 1;
    268         return getInt()?1:0;
    269         }
     268        return compareNull(*this);
    270269switch(type)
    271270        {
     
    545544}
    546545
     546long ExtValue::getInt(const char* s)
     547{
     548if ((s[0]=='0')&&(s[1]=='x'))
     549        {
     550        long val;
     551        sscanf(s+2,"%lx",&val);
     552        return val;
     553        }
     554else
     555        {
     556        if (strchr(s,'e')||(strchr(s,'E')))
     557                return (long)atof(s);
     558        else
     559                return atol(s);
     560        }
     561}
     562
     563double ExtValue::getDouble(const char* s)
     564{
     565if ((s[0]=='0')&&(s[1]=='x'))
     566        {
     567        long val;
     568        sscanf(s+2,"%lx",&val);
     569        return val;
     570        }
     571else
     572        return atof(s);
     573}
     574
    547575long ExtValue::getInt() const
    548576{
     
    551579        case TInt: return idata();
    552580        case TDouble: return (int)ddata();
    553         case TString:
    554         {
    555         const char* s=(const char*)sdata();
    556         if ((s[0]=='0')&&(s[1]=='x'))
    557                 {
    558                 long val;
    559                 sscanf(s+2,"%lx",&val);
    560                 return val;
    561                 }
    562         else
    563                 {
    564                 if (strchr(s,'e')||(strchr(s,'E')))
    565                         return (long)atof(s);
    566                 else
    567                         return atol(s);
    568                 }
    569         }
    570         case TObj: return (long)odata().param;
     581        case TString: return getInt((const char*)sdata());
     582        case TObj:
     583                FMprintf("ExtValue","getInt",FMLV_WARN,"Getting integer value from object reference (%s)",(const char*)getString());
     584                return (long)odata().param;
    571585        default:;
    572586        }
    573587return 0;
    574588}
     589
    575590double ExtValue::getDouble() const
    576591{
     
    579594        case TDouble: return ddata();
    580595        case TInt: return (double)idata();
    581         case TString:
    582         {
    583         const char* s=(const char*)sdata();
    584         if ((s[0]=='0')&&(s[1]=='x'))
    585                 {
    586                 long val;
    587                 sscanf(s+2,"%lx",&val);
    588                 return val;
    589                 }
    590         else
    591                 return atof(s);
    592         }
    593         case TObj: return (double)(long)odata().param;
     596        case TString: return getDouble((const char*)sdata());
     597        case TObj:
     598                FMprintf("ExtValue","getDouble",FMLV_WARN,"Getting floating point value from object reference (%s)",(const char*)getString());
     599                return (double)(long)odata().param;
    594600        default:;
    595601        }
  • cpp/frams/util/extvalue.h

    r121 r144  
    147147void setString(const SString &v) {if (type!=TString) setrs(v); else sdata()=v;}
    148148void setObject(const ExtObject &src) {if (type!=TObj) setro(src); else odata()=src;}
     149static long getInt(const char* s);
     150static double getDouble(const char* s);
    149151long getInt() const;
    150152double getDouble() const;
     
    153155SString serialize() const;
    154156ExtObject getObject() const;
     157bool isNull() const {return (type==TUnknown)||((type==TObj)&&odata().isEmpty());}
    155158const char* parseNumber(const char* in);
    156159const char* deserialize(const char* in);//< @return first character after the succesfully parsed string or NULL if failed
Note: See TracChangeset for help on using the changeset viewer.