Changeset 144 for cpp/frams/param


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

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

Location:
cpp/frams/param
Files:
2 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;
Note: See TracChangeset for help on using the changeset viewer.