void FileAccess::store_real(real_t p_real) { if (sizeof(real_t) == 4) store_float(p_real); else store_double(p_real); }
/* ** 'restore' is called to restore a variable to its saved value. */ void restore(int32 parmcount) { stack_local *p; stackitem localitem; do { p = basicvars.stacktop.localsp; basicvars.stacktop.bytesp+=ALIGNSIZE(stack_local); #ifdef DEBUG if (basicvars.debug_flags.stack) fprintf(stderr, "Restoring variable at %p from %p\n", p->savedetails.address.intaddr, p); #endif if (p->savedetails.typeinfo==VAR_INTWORD) /* Deal with most common case first */ *p->savedetails.address.intaddr = p->value.savedint; else { switch (p->savedetails.typeinfo & PARMTYPEMASK) { case VAR_FLOAT: *p->savedetails.address.floataddr = p->value.savedfloat; break; case VAR_STRINGDOL: free_string(*p->savedetails.address.straddr); *p->savedetails.address.straddr = p->value.savedstring; break; case VAR_INTBYTEPTR: basicvars.offbase[p->savedetails.address.offset] = p->value.savedint; break; case VAR_INTWORDPTR: store_integer(p->savedetails.address.offset, p->value.savedint); break; case VAR_FLOATPTR: store_float(p->savedetails.address.offset, p->value.savedfloat); break; case VAR_DOLSTRPTR: memmove(&basicvars.offbase[p->savedetails.address.offset], p->value.savedstring.stringaddr, p->value.savedstring.stringlen); free_string(p->value.savedstring); break; case VAR_INTARRAY: case VAR_FLOATARRAY: case VAR_STRARRAY: *p->savedetails.address.arrayaddr = p->value.savedarray; break; default: error(ERR_BROKEN, __LINE__, "stack"); } } /* Now restore the next parameter */ parmcount--; localitem = GET_TOPITEM; } while (parmcount>0 && localitem==STACK_LOCAL); if (parmcount>0 && localitem==STACK_RETPARM) restore_retparm(parmcount); }
/* ** 'restore_retparm' is called when a 'return parameter' block is found on the ** stack. It saves the value currently in the parameter at the address stored as ** the return parameter address and then returns the local variable to its ** correct value */ void restore_retparm(int32 parmcount) { stack_retparm *p; int32 vartype, intvalue; float64 floatvalue; basicstring stringvalue; p = basicvars.stacktop.retparmsp; /* Not needed, but the code is unreadable otherwise */ #ifdef DEBUG if (basicvars.debug_flags.stack) fprintf(stderr, "Restoring RETURN variable at %p from %p, return dest=%p\n", p->savedetails.address.intaddr, p, p->retdetails.address.intaddr); #endif basicvars.stacktop.retparmsp++; switch (p->savedetails.typeinfo & PARMTYPEMASK) { /* Fetch value from local variable and restore local var */ case VAR_INTWORD: /* Integer variable */ intvalue = *p->savedetails.address.intaddr; /* Fetch current value of local variable */ *p->savedetails.address.intaddr = p->value.savedint; /* Restore local variable to its old value */ vartype = VAR_INTWORD; break; case VAR_FLOAT: /* Floating point variable */ floatvalue = *p->savedetails.address.floataddr; *p->savedetails.address.floataddr = p->value.savedfloat; vartype = VAR_FLOAT; break; case VAR_STRINGDOL: /* String variable */ stringvalue = *p->savedetails.address.straddr; *p->savedetails.address.straddr = p->value.savedstring; vartype = VAR_STRINGDOL; break; case VAR_INTBYTEPTR: /* Indirect byte integer variable */ intvalue = basicvars.offbase[p->savedetails.address.offset]; basicvars.offbase[p->savedetails.address.offset] = p->value.savedint; vartype = VAR_INTWORD; break; case VAR_INTWORDPTR: /* Indirect word integer variable */ intvalue = get_integer(p->savedetails.address.offset); store_integer(p->savedetails.address.offset, p->value.savedint); vartype = VAR_INTWORD; break; case VAR_FLOATPTR: /* Indirect floating point variable */ floatvalue = get_float(p->savedetails.address.offset); store_float(p->savedetails.address.offset, p->value.savedfloat); vartype = VAR_FLOAT; break; case VAR_DOLSTRPTR: /* Indirect string variable */ intvalue = stringvalue.stringlen = get_stringlen(p->savedetails.address.offset); stringvalue.stringaddr = alloc_string(intvalue); if (intvalue>0) memmove(stringvalue.stringaddr, &basicvars.offbase[p->savedetails.address.offset], intvalue); memmove(&basicvars.offbase[p->savedetails.address.offset], p->value.savedstring.stringaddr, p->value.savedstring.stringlen); free_string(p->value.savedstring); /* Discard saved copy of original '$ string' */ vartype = VAR_DOLSTRPTR; break; case VAR_INTARRAY: case VAR_FLOATARRAY: case VAR_STRARRAY: /* Array - Do nothing */ break; default: error(ERR_BROKEN, __LINE__, "stack"); } /* Now restore the next parameter */ parmcount--; if (parmcount>0) { /* There are still some parameters to do */ if (basicvars.stacktop.intsp->itemtype==STACK_LOCAL) restore(parmcount); else { /* Must be a return parameter */ restore_retparm(parmcount); } } /* Now we can store the returned value in original variable */ switch (p->retdetails.typeinfo) { case VAR_INTWORD: *p->retdetails.address.intaddr = vartype==VAR_INTWORD ? intvalue : TOINT(floatvalue); break; case VAR_FLOAT: *p->retdetails.address.floataddr = vartype==VAR_INTWORD ? TOFLOAT(intvalue) : floatvalue; break; case VAR_STRINGDOL: free_string(*p->retdetails.address.straddr); *p->retdetails.address.straddr = stringvalue; break; case VAR_INTBYTEPTR: basicvars.offbase[p->retdetails.address.offset] = vartype==VAR_INTWORD ? intvalue : TOINT(floatvalue); break; case VAR_INTWORDPTR: store_integer(p->retdetails.address.offset, vartype==VAR_INTWORD ? intvalue : TOINT(floatvalue)); break; case VAR_FLOATPTR: store_float(p->retdetails.address.offset, vartype==VAR_INTWORD ? TOFLOAT(intvalue) : floatvalue); break; case VAR_DOLSTRPTR: if (stringvalue.stringlen>0) memmove(&basicvars.offbase[p->retdetails.address.offset], stringvalue.stringaddr, stringvalue.stringlen); if (vartype==VAR_STRINGDOL) { /* Local var was a normal string variable */ basicvars.offbase[p->retdetails.address.offset+stringvalue.stringlen] = CR; /* So add a 'CR' at the end of the string */ } free_string(stringvalue); break; case VAR_INTARRAY: case VAR_FLOATARRAY: case VAR_STRARRAY: /* 'RETURN' dest is array - Do nothing */ break; default: error(ERR_BROKEN, __LINE__, "stack"); } }