bool TWBaseScript::get_scriptparam_floatvec(const char* design_note, const char* param, cScrVec& vect, float defx, float defy, float defz) { bool parsed = false; char* value = get_scriptparam_string(design_note, param, NULL); if(value) { char* ystr = comma_split(value); // Getting y is safe... char* zstr = ystr ? comma_split(ystr) : NULL; // z needs to be handled more carefully std::string tmp; // This is actually throw-away, needed for parse_float vect.x = parse_float(value, defx, tmp); vect.y = parse_float( ystr, defy, tmp); // Note these are safe even if ystr and zstr are NULL vect.z = parse_float( zstr, defz, tmp); // as parse_float checks for non-NULL parsed = true; g_pMalloc -> Free(value); } else { vect.x = defx; vect.y = defy; vect.z = defz; } return parsed; }
bool write(const std::string& comma_list,const std::string& array) { try { auto list=comma_split(comma_list); auto json=deserialize(array); if(json.type()==Json::arrayValue&&list.size()==json.size()) { for(size_t ii=0;ii<list.size();++ii) { std::string value=json[(int)ii].asString(); if(value=="") data_m.erase(list[ii]); else data_m[list[ii]]=value; } return true; } } catch(...) {} return false; }
std::string read(const std::string& comma_list) { auto list=comma_split(comma_list); std::string array="["; for(auto ii:list) { if(ii.size()>0) { array+="\""+ii+"\":\""; if(data_m.count(ii)>0) array+=data_m[ii]; array+="\","; } } if(array.size()>0&&array[array.size()-1]==',') array=array.substr(0,array.size()-1); array+="]"; return array; }
int test_ptclosure_main (unformat_input_t * input) { test_main_t *tm = &test_main; u8 *item_name; int i, j; u8 **orig; u8 **closure; u8 *a_name, *b_name; int a_index, b_index; uword *p; u8 *this_constraint; int n; u32 *result = 0; tm->index_by_name = hash_create_string (0, sizeof (uword)); n = ARRAY_LEN (items); for (i = 0; i < n; i++) { item_name = (u8 *) items[i]; hash_set_mem (tm->index_by_name, item_name, i); } orig = clib_ptclosure_alloc (n); for (i = 0; i < ARRAY_LEN (constraints); i++) { this_constraint = format (0, "%s%c", constraints[i], 0); if (comma_split (this_constraint, &a_name, &b_name)) { clib_warning ("couldn't split '%s'", constraints[i]); return 1; } p = hash_get_mem (tm->index_by_name, a_name); if (p == 0) { clib_warning ("couldn't find '%s'", a_name); return 1; } a_index = p[0]; p = hash_get_mem (tm->index_by_name, b_name); if (p == 0) { clib_warning ("couldn't find '%s'", b_name); return 1; } b_index = p[0]; orig[a_index][b_index] = 1; vec_free (this_constraint); } dump_closure (tm, "original relation", orig); closure = clib_ptclosure (orig); dump_closure (tm, "closure", closure); /* * Output partial order */ again: for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (closure[i][j]) goto item_constrained; } /* Item i can be output */ vec_add1 (result, i); { int k; for (k = 0; k < n; k++) closure[k][i] = 0; /* "Magic" a before a, to keep from ever outputting it again */ closure[i][i] = 1; goto again; } item_constrained: ; } if (vec_len (result) != n) { clib_warning ("no partial order exists"); exit (1); } fformat (stdout, "Partial order:\n"); for (i = vec_len (result) - 1; i >= 0; i--) { fformat (stdout, "%s\n", items[result[i]]); } vec_free (result); clib_ptclosure_free (orig); clib_ptclosure_free (closure); return 0; }