Changeset 393 for cpp/frams/param


Ignore:
Timestamp:
06/03/15 17:57:46 (9 years ago)
Author:
sz
Message:

f0 parsing corrections and enhancements:

  • f0 genotype becomes invalid if any of its numeric fields can't be parsed
  • ParamInterface::set and ParamInterface::load2 return the error flag if a numeric parsing error occured
  • fixed a bug in load2 (was failing on quoted fields containing a comma)
Location:
cpp/frams/param
Files:
2 edited

Legend:

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

    r375 r393  
    529529                paInt mn, mx, def;
    530530                if (getMinMax(i, mn, mx, def) >= 3)
    531                         return setInt(i, def);
     531                        return setInt(i, def) | PSET_PARSEFAILED;
    532532                else
    533                         return setInt(i, (paInt)0);
     533                        return setInt(i, (paInt)0) | PSET_PARSEFAILED;
    534534        }
    535535        else
     
    544544                double mn, mx, def;
    545545                if (getMinMax(i, mn, mx, def) >= 3)
    546                         return setDouble(i, def);
     546                        return setDouble(i, def) | PSET_PARSEFAILED;
    547547                else
    548                         return setDouble(i, (double)0);
     548                        return setDouble(i, (double)0) | PSET_PARSEFAILED;
    549549        }
    550550        else
     
    10131013        const char *value, *valstop;
    10141014        SString tmpvalue;
     1015        bool parse_failed=false;
    10151016        if (poz >= s.len()) return fields_loaded;
    10161017        t = s.c_str() + poz;
     
    10381039                        {
    10391040                                field_end = strchrlimit(quote2 + 1, ',', end);
    1040                                 if (!field_end) next_field = field_end = end;
     1041                                if (!field_end) field_end = end;
     1042                                next_field = field_end;
    10411043                        }
    10421044                        equals_sign = strchrlimit(t, '=', quote);
     
    10941096                                logPrintf("Param", "load2", LOG_WARN, "Adjusted '%s' in '%s' (was too %s)",
    10951097                                id(i), getName(), (ret&PSET_HITMAX) ? "big" : "small");
     1098                        if (ret&PSET_PARSEFAILED)
     1099                                parse_failed=true;
    10961100                        *(char*)valstop = remember;
    10971101                }
     
    11041108#endif
    11051109        }
    1106         return fields_loaded;
     1110        return fields_loaded | (parse_failed ? LOAD2_PARSE_FAILED : 0);
    11071111}
    11081112
  • cpp/frams/param/param.h

    r382 r393  
    5050#define PSET_HITMAX     8
    5151
     52#define PSET_NOPROPERTY 16
     53
     54#define PSET_PARSEFAILED        32
     55
    5256// useful combination: need to get and display the value so that a user knows that the value they tried to set has been rejected or changed
    53 #define PSET_WARN (PSET_RONLY | PSET_HITMIN | PSET_HITMAX)
    54 
    55 #define PSET_NOPROPERTY 16
     57#define PSET_WARN (PSET_RONLY | PSET_HITMIN | PSET_HITMAX | PSET_PARSEFAILED)
     58
    5659
    5760struct ParamEntry;
     
    162165        int saveprop(VirtFILE*, int i, const char* p, bool force = 0);
    163166        int load(VirtFILE*, bool warn_unknown_fields = true, bool *abortable = NULL, int *linenum = NULL);///< @return the number of fields loaded
    164         int load2(const SString &, int &);///< @return the number of fields loaded
     167        int load2(const SString &, int &);///< @return the number of fields loaded (or'ed with LOAD2_PARSE_FAILED if a parsing error was detected)
    165168
    166169        static const char* SERIALIZATION_PREFIX;
     170        static const int LOAD2_PARSE_FAILED=(1<<30); ///< this bit is set in return value from load2 if a parse error was detected while loading. usage: if (load2(...) & LOAD2_PARSE_FAILED) ...
     171        static const int LOAD2_IGNORE_PARSE_FAILED=(~LOAD2_PARSE_FAILED); ///< bitmask to be used if the parsing error is to be ignored. usage: int number_of_loaded_fields=load2(...) & LOAD2_IGNORE_PARSE_FAILED;
    167172
    168173#ifdef DEBUG
Note: See TracChangeset for help on using the changeset viewer.