void LessThanOrEqualFunc::execute() { boolean symflag = stack_key(sym_symid).is_true(); ComValue& nval = stack_key(n_symid); ComValue& operand1 = stack_arg(0); ComValue& operand2 = stack_arg(1); promote(operand1, operand2); ComValue result(operand1); result.type(ComValue::BooleanType); switch (operand1.type()) { case ComValue::CharType: result.boolean_ref() = operand1.char_val() <= operand2.char_val(); break; case ComValue::UCharType: result.boolean_ref() = operand1.uchar_val() <= operand2.uchar_val(); break; case ComValue::ShortType: result.boolean_ref() = operand1.short_val() <= operand2.short_val(); break; case ComValue::UShortType: result.boolean_ref() = operand1.ushort_val() <= operand2.ushort_val(); break; case ComValue::IntType: result.boolean_ref() = operand1.int_val() <= operand2.int_val(); break; case ComValue::UIntType: result.boolean_ref() = operand1.uint_val() <= operand2.uint_val(); break; case ComValue::LongType: result.boolean_ref() = operand1.long_val() <= operand2.long_val(); break; case ComValue::ULongType: result.boolean_ref() = operand1.ulong_val() <= operand2.ulong_val(); break; case ComValue::FloatType: result.boolean_ref() = operand1.float_val() <= operand2.float_val(); break; case ComValue::DoubleType: result.boolean_ref() = operand1.double_val() <= operand2.double_val(); break; case ComValue::SymbolType: const char* str1 = operand1.symbol_ptr(); const char* str2 = operand2.symbol_ptr(); if (nval.is_unknown()) result.boolean_ref() = strcmp(str1, str2)<=0; else result.boolean_ref() = strncmp(str1, str2, nval.int_val())<=0; break; } reset_stack(); push_stack(result); }
void JoinStrFunc::execute() { ComValue listv(stack_arg(0)); static int sym_symid = symbol_add("sym"); ComValue symflagv(stack_key(sym_symid)); boolean symflag = symflagv.is_true(); reset_stack(); if (listv.is_array()) { AttributeValueList* avl = listv.array_val(); if (avl) { char cbuf[avl->Number()+1]; Iterator i; int cnt=0; for (avl->First(i); !avl->Done(i); avl->Next(i)) { cbuf[cnt] = avl->GetAttrVal(i)->char_val(); cnt++; } cbuf[cnt] = '\0'; ComValue retval(symbol_add(cbuf), symflag ? ComValue::SymbolType : ComValue::StringType); push_stack(retval); return; } } push_stack(ComValue::nullval()); }
void NotEqualFunc::execute() { boolean symflag = stack_key(sym_symid).is_true(); ComValue& nval = stack_key(n_symid); ComValue& operand1 = stack_arg(0); ComValue& operand2 = stack_arg(1); promote(operand1, operand2); ComValue result(operand1); result.type(ComValue::BooleanType); if (operand1.type() != operand2.type()) { result.boolean_ref() = true; reset_stack(); push_stack(result); return; } switch (operand1.type()) { case ComValue::CharType: result.boolean_ref() = operand1.char_val() != operand2.char_val(); break; case ComValue::UCharType: result.boolean_ref() = operand1.uchar_val() != operand2.uchar_val(); break; case ComValue::ShortType: result.boolean_ref() = operand1.short_val() != operand2.short_val(); break; case ComValue::UShortType: result.boolean_ref() = operand1.ushort_val() != operand2.ushort_val(); break; case ComValue::IntType: result.boolean_ref() = operand1.int_val() != operand2.int_val(); break; case ComValue::UIntType: result.boolean_ref() = operand1.uint_val() != operand2.uint_val(); break; case ComValue::LongType: result.boolean_ref() = operand1.long_val() != operand2.long_val(); break; case ComValue::ULongType: result.boolean_ref() = operand1.ulong_val() != operand2.ulong_val(); break; case ComValue::FloatType: result.boolean_ref() = operand1.float_val() != operand2.float_val(); break; case ComValue::DoubleType: result.boolean_ref() = operand1.double_val() != operand2.double_val(); break; case ComValue::StringType: case ComValue::SymbolType: if (nval.is_unknown()) result.boolean_ref() = operand1.symbol_val() != operand2.symbol_val(); else { const char* str1 = operand1.symbol_ptr(); const char* str2 = operand2.symbol_ptr(); result.boolean_ref() = strncmp(str1, str2, nval.int_val())!=0; } break; case ComValue::ArrayType: result.boolean_ref() = operand2.type() != ComValue::ArrayType || operand1.array_val() != operand2.array_val(); break; case ComValue::ObjectType: if (!operand1.object_compview()) result.boolean_ref() = operand2.type() != ComValue::ObjectType || operand1.obj_val() != operand2.obj_val() || operand1.class_symid() != operand2.class_symid(); else result.boolean_ref() = operand2.type() != ComValue::ObjectType || operand1.class_symid() != operand2.class_symid() || !operand2.object_compview() || ((ComponentView*)operand1.obj_val())->GetSubject() != ((ComponentView*)operand2.obj_val())->GetSubject(); break; case ComValue::UnknownType: result.boolean_ref() = operand2.is_known(); break; } reset_stack(); push_stack(result); }
void SelectFunc::execute() { static int all_symid = symbol_add("all"); ComValue all_flagv(stack_key(all_symid)); boolean all_flag = all_flagv.is_true(); static int clear_symid = symbol_add("clear"); ComValue clear_flagv(stack_key(clear_symid)); boolean clear_flag = clear_flagv.is_true(); Selection* sel = _ed->GetViewer()->GetSelection(); if (clear_flag) { sel->Clear(); unidraw->Update(); reset_stack(); return; } OverlaySelection* newSel = ((OverlayEditor*)_ed)->overlay_kit()->MakeSelection(); Viewer* viewer = _ed->GetViewer(); AttributeValueList* avl = new AttributeValueList(); if (all_flag) { GraphicView* gv = ((OverlayEditor*)_ed)->GetFrame(); Iterator i; int count=0; for (gv->First(i); !gv->Done(i); gv->Next(i)) { GraphicView* subgv = gv->GetView(i); newSel->Append(subgv); OverlayComp* comp = (OverlayComp*)subgv->GetGraphicComp(); ComValue* compval = new ComValue(new OverlayViewRef(comp), comp->classid()); avl->Append(compval); } } else if (nargs()==0) { Iterator i; int count=0; for (sel->First(i); !sel->Done(i); sel->Next(i)) { GraphicView* grview = sel->GetView(i); OverlayComp* comp = grview ? (OverlayComp*)grview->GetSubject() : nil; ComValue* compval = comp ? new ComValue(new OverlayViewRef(comp), comp->classid()) : nil; if (compval) { avl->Append(compval); } delete newSel; newSel = nil; } } else { for (int i=0; i<nargsfixed(); i++) { ComValue& obj = stack_arg(i); if (obj.object_compview()) { ComponentView* comview = (ComponentView*)obj.obj_val(); OverlayComp* comp = (OverlayComp*)comview->GetSubject(); if (comp) { GraphicView* view = comp->FindView(viewer); if (view) { newSel->Append(view); ComValue* compval = new ComValue(new OverlayViewRef(comp), comp->classid()); avl->Append(compval); } } } else if (obj.is_array()) { Iterator it; AttributeValueList* al = obj.array_val(); al->First(it); while (!al->Done(it)) { if (al->GetAttrVal(it)->object_compview()) { ComponentView* comview = (ComponentView*)al->GetAttrVal(it)->obj_val(); OverlayComp* comp = (OverlayComp*)comview->GetSubject(); if (comp) { GraphicView* view = comp->FindView(viewer); if (view) { newSel->Append(view); ComValue* compval = new ComValue(new OverlayViewRef(comp), comp->classid()); avl->Append(compval); } } } al->Next(it); } } } } if (newSel){ sel->Clear(); delete sel; _ed->SetSelection(newSel); newSel->Update(viewer); unidraw->Update(); } reset_stack(); ComValue retval(avl); push_stack(retval); }