status initialiseChainv(Chain ch, int argc, Any *argv) { int i; assign(ch, size, ZERO); ch->current = ch->head = ch->tail = NIL; for(i=0; i<argc; i++) appendChain(ch, argv[i]); succeed; }
status appendChainTable(ChainTable ct, Any name, Any value) { Chain ch; if ( (ch = getMemberHashTable((HashTable) ct, name)) ) appendChain(ch, value); else appendHashTable((HashTable) ct, name, newObject(ClassChain, value, EAV)); succeed; }
static Chain getConvertChain(Any ctx, Vector v) { Chain ch = answerObject(ClassChain, EAV); int n = valInt(v->size); Any *e = v->elements; for( ; --n >= 0; e++ ) { appendChain(ch, *e); } answer(ch); }
static Chain getFindAllVector(Vector v, Code code, Int from, Int to) { Chain result = answerObject(ClassChain, EAV); int f, t; if ( get_range(v, from, to, &f, &t) ) { int step = (t >= f ? 1 : -1); int offset = valInt(v->offset); for(; f != t+step ; f += step) { Any av[2]; av[0] = v->elements[f-offset-1]; av[1] = toInt(f); if ( forwardCodev(code, 2, av) ) appendChain(result, av[0]); } } answer(result); }
static status catchAllHostv(Host h, Name selector, int argc, Any *argv) { if ( h->callBack == ON ) { status rval; if ( !(rval = callHostv(h, selector, argc, argv)) && PCE->last_error == NAME_noBehaviour ) assign(PCE, last_error, NIL); return rval; } else { ArgVector(av, argc+2); int ac; av[0] = h; av[1] = (Any) selector; for(ac=0; ac < argc; ac++) av[ac+2] = argv[ac]; return appendChain(h->messages, newObjectv(ClassMessage, argc+2, av)); } }
static status initialiseBlockv(Block b, int argc, Any *argv) { int n; initialiseCode((Code) b); assign(b, members, newObject(ClassChain, EAV)); for(n=0; n<argc; n++) { if ( instanceOfObject(argv[n], ClassVar) ) { if ( isNil(b->parameters) ) assign(b, parameters, newObjectv(ClassCodeVector, 1, &argv[n])); else appendVector(b->parameters, 1, &argv[n]); } else break; } for( ; n < argc; n++ ) appendChain(b->members, argv[n]); succeed; }
static BOOL CALLBACK next_monitor(HMONITOR m, HDC hdc, LPRECT rect, LPARAM closure) { DisplayObj d = (DisplayObj)closure; MONITORINFOEX info; Any name; Monitor mon; memset(&info, 0, sizeof(info)); info.cbSize = sizeof(info); if ( GetMonitorInfo(m, (MONITORINFO*)&info) ) { name = CtoName(info.szDevice); } else { name = d->monitors->size; } appendChain(d->monitors, mon=newObject(ClassMonitor, name, newObject(ClassArea, toInt(rect->left), toInt(rect->top), toInt(rect->right - rect->left), toInt(rect->bottom - rect->top), EAV), EAV)); if ( isName(name) ) { if ( info.dwFlags & MONITORINFOF_PRIMARY ) assign(mon, primary, ON); assign(mon, work_area, newObject(ClassArea, toInt(info.rcWork.left), toInt(info.rcWork.top), toInt(info.rcWork.right - info.rcWork.left), toInt(info.rcWork.bottom - info.rcWork.top), EAV)); } return TRUE; }