newtRef NcMultiply(newtRefArg r1, newtRefArg r2) { bool real; if (! NewtArgsIsNumber(r1, r2, &real)) return NewtThrow0(kNErrNotANumber); if (real) { double real1; double real2; real1 = NewtRefToReal(r1); real2 = NewtRefToReal(r2); return NewtMakeReal(real1 * real2); } else { int32_t int1; int32_t int2; int1 = NewtRefToInteger(r1); int2 = NewtRefToInteger(r2); return NewtMakeInteger(int1 * int2); } }
newtRef NcDivide(newtRefArg r1, newtRefArg r2) { bool real; if (! NewtArgsIsNumber(r1, r2, &real)) return NewtThrow0(kNErrNotANumber); if (real) { double real1; double real2; real1 = NewtRefToReal(r1); real2 = NewtRefToReal(r2); if (real2 == 0.0) return NewtThrow(kNErrDiv0, r2); return NewtMakeReal(real1 / real2); } else { int32_t int1; int32_t int2; int1 = NewtRefToInteger(r1); int2 = NewtRefToInteger(r2); if (int2 == 0) return NewtThrow(kNErrDiv0, r2); return NewtMakeInteger(int1 / int2); } }
newtRef NsStrCat(newtRefArg rcvr, newtRefArg str, newtRefArg v) { char wk[32]; char * s = NULL; switch (NewtGetRefType(v, true)) { case kNewtInt30: case kNewtInt32: { int n; n = (int)NewtRefToInteger(v); sprintf(wk, "%d", n); s = wk; } break; case kNewtReal: { double n; n = NewtRefToReal(v); sprintf(wk, "%f", n); s = wk; } break; case kNewtCharacter: { int c; c = NewtRefToCharacter(v); sprintf(wk, "%c", c); s = wk; } break; case kNewtSymbol: { newtSymDataRef sym; sym = NewtRefToSymbol(v); s = sym->name; } break; case kNewtString: s = NewtRefToString(v); break; } if (s != NULL) NewtStrCat(str, s); return str; }