txSlot* fx_Date_prototype_getUTC_aux(txMachine* the, txTimeDescription* td) { txSlot* slot = fxCheckDate(the, mxThis); txNumber number; c_time_t time; txInteger year = 0; if (!slot) mxTypeError("this is no date"); number = slot->value.number; if (c_isnan(number)) { mxResult->value.number = C_NAN; mxResult->kind = XS_NUMBER_KIND; return C_NULL; } c_memset(td, 0, sizeof(txTimeDescription)); td->tm.tm_mday = 1; td->ms = (int)c_floor(c_fmod(number, 1000.0)); number /= 1000.0; //if ((number < gxMinTime) || (gxMaxTime < number)) // mxTypeError("invalid time"); if(number > TIME_2032) { // 2032 <= number <= 2099 year = (int)((number - TIME_2032)/TIME_FourYear); number -= TIME_FourYear * year; year *= 4; } time = (c_time_t)c_floor(number); td->tm = *c_gmtime(&time); td->tm.tm_year += year; if( (td->ms < 0) && (td->ms > -1000) ) td->ms = 1000 + td->ms; mxResult->kind = XS_INTEGER_KIND; return slot; }
txIndex fxArgToArrayLimit(txMachine* the, txInteger argi) { if (mxArgc > argi) { txNumber i = c_trunc(fxToNumber(the, mxArgv(argi))); if (c_isnan(i)) i = 0; else if (i < 0) i = 0; else if (i > XS_MAX_INDEX) i = XS_MAX_INDEX; return (txIndex)i; } return XS_MAX_INDEX; }
txIndex fxArgToIndex(txMachine* the, txInteger argi, txIndex index, txIndex length) { if (mxArgc > argi) { txNumber c = length; txNumber i = c_trunc(fxToNumber(the, mxArgv(argi))); if (c_isnan(i)) i = 0; if (i < 0) { i = c + i; if (i < 0) i = 0; } else if (i > c) i = c; index = (txIndex)i; } return index; }