/* * * is_prime_time - will return the status of primetime * * returns true if prime time false if non_prime * * NOTE: Holidays are considered non-prime * */ enum prime_time is_prime_time(void) { /* last_day is used to hold the day during the previous cycle. It is used so * holidays only need to be checked once a day instead of every cycle */ static int last_day = -1; enum prime_time ret = PRIME; /* return code */ struct tm *tmptr; /* current time in a struct tm */ tmptr = localtime(&(cstat.current_time)); /* check for holiday: Holiday == non_prime */ if (conf.holiday_year != 0) /* year == 0: no prime-time */ { if (tmptr -> tm_year > conf.holiday_year) sched_log(PBSEVENT_ADMIN, PBS_EVENTCLASS_FILE, "", "The holday file is out of date, please update it."); else if (tmptr -> tm_yday > last_day) { last_day = tmptr -> tm_yday; /* tm_yday starts at 0, and julien date starts at 1 */ if (is_holiday(tmptr -> tm_yday + 1)) ret = NON_PRIME; } /* if ret still equals PRIME then it is not a holidy, we need to check * and see if we are in non-prime or prime */ if (ret == PRIME) { if (tmptr -> tm_wday == 0) ret = check_prime(SUNDAY, tmptr); else if (tmptr -> tm_wday == 6) ret = check_prime(SATURDAY, tmptr); else ret = check_prime(WEEKDAY, tmptr); } } return ret; }
int get_weekend_login_bonus_cmd(sprite_t * p,const uint8_t * body,int len) { CHECK_BODY_LEN(len, 8); uint32_t week_count = 0; uint32_t index = 0; unpack(body, sizeof(week_count)+sizeof(index), "LL", &week_count, &index); if (week_count > 10) { week_count = 10; } if (!is_holiday(get_now_tm()->tm_wday) || week_count > 10 || weekend_bonus[week_count].weekid != week_count || index > weekend_bonus[week_count].item_count || index < 1) { return send_to_self_error(p, p->waitcmd, -ERR_invalid_session, 1); } *(uint32_t *)p->session = week_count; *(uint32_t *)(p->session + 4) = index; return send_request_to_db(SVR_PROTO_ROOMINFO_GET_LOGIN_WEEKEND_COUNT, p, 0, NULL, p->id); }
/* * Applies a single business day offset. See the function * business_day_offset for the meaning of all the parameters. * * Returns 0 on success, -1 on failure. */ static int apply_business_day_offset(npy_datetime date, npy_int64 offset, npy_datetime *out, NPY_BUSDAY_ROLL roll, npy_bool *weekmask, int busdays_in_weekmask, npy_datetime *holidays_begin, npy_datetime *holidays_end) { int day_of_week = 0; npy_datetime *holidays_temp; /* Roll the date to a business day */ if (apply_business_day_roll(date, &date, &day_of_week, roll, weekmask, holidays_begin, holidays_end) < 0) { return -1; } /* If we get a NaT, just return it */ if (date == NPY_DATETIME_NAT) { return 0; } /* Now we're on a valid business day */ if (offset > 0) { /* Remove any earlier holidays */ holidays_begin = find_earliest_holiday_on_or_after(date, holidays_begin, holidays_end); /* Jump by as many weeks as we can */ date += (offset / busdays_in_weekmask) * 7; offset = offset % busdays_in_weekmask; /* Adjust based on the number of holidays we crossed */ holidays_temp = find_earliest_holiday_after(date, holidays_begin, holidays_end); offset += holidays_temp - holidays_begin; holidays_begin = holidays_temp; /* Step until we use up the rest of the offset */ while (offset > 0) { ++date; if (++day_of_week == 7) { day_of_week = 0; } if (weekmask[day_of_week] && !is_holiday(date, holidays_begin, holidays_end)) { offset--; } } } else if (offset < 0) { /* Remove any later holidays */ holidays_end = find_earliest_holiday_after(date, holidays_begin, holidays_end); /* Jump by as many weeks as we can */ date += (offset / busdays_in_weekmask) * 7; offset = offset % busdays_in_weekmask; /* Adjust based on the number of holidays we crossed */ holidays_temp = find_earliest_holiday_on_or_after(date, holidays_begin, holidays_end); offset -= holidays_end - holidays_temp; holidays_end = holidays_temp; /* Step until we use up the rest of the offset */ while (offset < 0) { --date; if (--day_of_week == -1) { day_of_week = 6; } if (weekmask[day_of_week] && !is_holiday(date, holidays_begin, holidays_end)) { offset++; } } } *out = date; return 0; }
/* * Returns a boolean array with True for input dates which are valid * business days, and False for dates which are not. This is the * low-level function which requires already cleaned input data. * * dates: An array of dates with 'datetime64[D]' data type. * out: Either NULL, or an array with 'bool' data type * in which to place the resulting dates. * weekmask: A 7-element boolean mask, 1 for possible business days and 0 * for non-business days. * busdays_in_weekmask: A count of how many 1's there are in weekmask. * holidays_begin/holidays_end: A sorted list of dates matching '[D]' * unit metadata, with any dates falling on a day of the * week without weekmask[i] == 1 already filtered out. */ NPY_NO_EXPORT PyArrayObject * is_business_day(PyArrayObject *dates, PyArrayObject *out, npy_bool *weekmask, int busdays_in_weekmask, npy_datetime *holidays_begin, npy_datetime *holidays_end) { PyArray_DatetimeMetaData temp_meta; PyArray_Descr *dtypes[2] = {NULL, NULL}; NpyIter *iter = NULL; PyArrayObject *op[2] = {NULL, NULL}; npy_uint32 op_flags[2], flags; PyArrayObject *ret = NULL; if (busdays_in_weekmask == 0) { PyErr_SetString(PyExc_ValueError, "the business day weekmask must have at least one " "valid business day"); return NULL; } /* First create the data types for the dates and the bool output */ temp_meta.base = NPY_FR_D; temp_meta.num = 1; dtypes[0] = create_datetime_dtype(NPY_DATETIME, &temp_meta); if (dtypes[0] == NULL) { goto fail; } dtypes[1] = PyArray_DescrFromType(NPY_BOOL); if (dtypes[1] == NULL) { goto fail; } /* Set up the iterator parameters */ flags = NPY_ITER_EXTERNAL_LOOP| NPY_ITER_BUFFERED| NPY_ITER_ZEROSIZE_OK; op[0] = dates; op_flags[0] = NPY_ITER_READONLY | NPY_ITER_ALIGNED; op[1] = out; op_flags[1] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE | NPY_ITER_ALIGNED; /* Allocate the iterator */ iter = NpyIter_MultiNew(2, op, flags, NPY_KEEPORDER, NPY_SAFE_CASTING, op_flags, dtypes); if (iter == NULL) { goto fail; } /* Loop over all elements */ if (NpyIter_GetIterSize(iter) > 0) { NpyIter_IterNextFunc *iternext; char **dataptr; npy_intp *strideptr, *innersizeptr; iternext = NpyIter_GetIterNext(iter, NULL); if (iternext == NULL) { goto fail; } dataptr = NpyIter_GetDataPtrArray(iter); strideptr = NpyIter_GetInnerStrideArray(iter); innersizeptr = NpyIter_GetInnerLoopSizePtr(iter); do { char *data_dates = dataptr[0]; char *data_out = dataptr[1]; npy_intp stride_dates = strideptr[0]; npy_intp stride_out = strideptr[1]; npy_intp count = *innersizeptr; npy_datetime date; int day_of_week; while (count--) { /* Check if it's a business day */ date = *(npy_datetime *)data_dates; day_of_week = get_day_of_week(date); *(npy_bool *)data_out = weekmask[day_of_week] && !is_holiday(date, holidays_begin, holidays_end) && date != NPY_DATETIME_NAT; data_dates += stride_dates; data_out += stride_out; } } while (iternext(iter)); } /* Get the return object from the iterator */ ret = NpyIter_GetOperandArray(iter)[1]; Py_INCREF(ret); goto finish; fail: Py_XDECREF(ret); ret = NULL; finish: Py_XDECREF(dtypes[0]); Py_XDECREF(dtypes[1]); if (iter != NULL) { if (NpyIter_Deallocate(iter) != NPY_SUCCEED) { Py_XDECREF(ret); ret = NULL; } } return ret; }
/* * Applies the 'roll' strategy to 'date', placing the result in 'out' * and setting 'out_day_of_week' to the day of the week that results. * * Returns 0 on success, -1 on failure. */ static int apply_business_day_roll(npy_datetime date, npy_datetime *out, int *out_day_of_week, NPY_BUSDAY_ROLL roll, npy_bool *weekmask, npy_datetime *holidays_begin, npy_datetime *holidays_end) { int day_of_week; /* Deal with NaT input */ if (date == NPY_DATETIME_NAT) { *out = NPY_DATETIME_NAT; if (roll == NPY_BUSDAY_RAISE) { PyErr_SetString(PyExc_ValueError, "NaT input in busday_offset"); return -1; } else { return 0; } } /* Get the day of the week for 'date' */ day_of_week = get_day_of_week(date); /* Apply the 'roll' if it's not a business day */ if (weekmask[day_of_week] == 0 || is_holiday(date, holidays_begin, holidays_end)) { npy_datetime start_date = date; int start_day_of_week = day_of_week; switch (roll) { case NPY_BUSDAY_FOLLOWING: case NPY_BUSDAY_MODIFIEDFOLLOWING: { do { ++date; if (++day_of_week == 7) { day_of_week = 0; } } while (weekmask[day_of_week] == 0 || is_holiday(date, holidays_begin, holidays_end)); if (roll == NPY_BUSDAY_MODIFIEDFOLLOWING) { /* If we crossed a month boundary, do preceding instead */ if (days_to_month_number(start_date) != days_to_month_number(date)) { date = start_date; day_of_week = start_day_of_week; do { --date; if (--day_of_week == -1) { day_of_week = 6; } } while (weekmask[day_of_week] == 0 || is_holiday(date, holidays_begin, holidays_end)); } } break; } case NPY_BUSDAY_PRECEDING: case NPY_BUSDAY_MODIFIEDPRECEDING: { do { --date; if (--day_of_week == -1) { day_of_week = 6; } } while (weekmask[day_of_week] == 0 || is_holiday(date, holidays_begin, holidays_end)); if (roll == NPY_BUSDAY_MODIFIEDPRECEDING) { /* If we crossed a month boundary, do following instead */ if (days_to_month_number(start_date) != days_to_month_number(date)) { date = start_date; day_of_week = start_day_of_week; do { ++date; if (++day_of_week == 7) { day_of_week = 0; } } while (weekmask[day_of_week] == 0 || is_holiday(date, holidays_begin, holidays_end)); } } break; } case NPY_BUSDAY_NAT: { date = NPY_DATETIME_NAT; break; } case NPY_BUSDAY_RAISE: { *out = NPY_DATETIME_NAT; PyErr_SetString(PyExc_ValueError, "Non-business day date in busday_offset"); return -1; } } } *out = date; *out_day_of_week = day_of_week; return 0; }