int SLang_pop_complex (double *r, double *i) { double *c; switch (SLang_peek_at_stack ()) { case SLANG_COMPLEX_TYPE: if (-1 == SLclass_pop_ptr_obj (SLANG_COMPLEX_TYPE, VOID_STAR_STAR(&c))) return -1; *r = c[0]; *i = c[1]; SLfree ((char *) c); break; default: *i = 0.0; if (-1 == SLang_pop_double (r)) return -1; break; case -1: return -1; } return 0; }
static SLang_IStruct_Field_Type *istruct_pop_field (SLCONST char *name, int no_readonly, VOID_STAR *addr) { _pSLang_IStruct_Type *s; SLang_IStruct_Field_Type *f; char *struct_addr; /* Note: There is no need to free this object */ if (-1 == SLclass_pop_ptr_obj (SLANG_ISTRUCT_TYPE, VOID_STAR_STAR(&s))) return NULL; if (NULL == (struct_addr = *(char **)s->addr)) { _pSLang_verror (SL_INTRINSIC_ERROR, "%s is NULL. Unable to access field", s->name); return NULL; } f = s->fields; while (f->field_name != NULL) { /* Since both these are slstrings, just test pointers */ if (f->field_name != name) { f++; continue; } if (no_readonly && f->read_only) { _pSLang_verror (SL_READONLY_ERROR, "%s.%s is read-only", s->name, name); return NULL; } *addr = (VOID_STAR) (struct_addr + f->offset); return f; } _pSLang_verror (SL_TYPE_MISMATCH, "%s has no field called %s", s->name, name); return NULL; }